Содержание
ogr2ogr
ogr2ogr - утилита пакета GDAL для работы с векторными форматами.
Общие сведения
Программа ogr2ogr предназначена для конвертации векторных данных из одного формата в другой.
Получить справку о поддерживаемых форматах и доступных ключах можно узнать просто набрав в коммандной строке:
ogr2ogr
Форматы
Актуальный список поддерживаемых форматов всегда можно найти на официальном сайте.
Среди них можно выделить наиболее распространенные и популярные:
- ESRI Shapefile
- MapInfo File
- PostgreSQL
- GeoJSON
- SQLite
- GPKG
- CSV
- GPX
- GML
- ODS
- OSM
- MVT
- DXF
- XLS
- PDF
- KML
Кириллица
Чтобы ogr2ogr корректно работал с файлами в названии которых есть кириллица, необходимо, перед выполнением команд установить переменную среды:
SET GDAL_FILENAME_IS_UTF8=OFF
Если исходные данные в кодировке UTF-8, то необходимо явным образом указывать, что выходные данные также будут в UTF-8, с помощью опции -lco ENCODING=UTF-8, например:
ogr2ogr -lco ENCODING=UTF-8 output.shp input.vrt
Конвертация
Конвертация ESRI Shapefile в формат MapInfo TAB:
ogr2ogr -f "MapInfo File" worldmap.tab worldmap.shp
Конвертация только объектов в поле name которых содержится строка «s»:
ogr2ogr -f "MapInfo File" -where "name=us" worldmap.mif worldmap.shp
Копирование набора данных убрав все поля кроме name:
ogr2ogr -f GeoJSON -select name output.geojson worldmap.mif
Контейнеры слоёв
Существуют форматы позволяющие хранить несколько слоёв с разными геометриями. Например, GPKG, SXF, PostgreSQL и другие.
Для извлечения всех слоёв в формат ESRI Shape в качестве цели указывается папка, а не имя файла:
ogr2ogr output_dir input.sxf
Извлечение конкретного слоя из набора:
ogr2ogr output_dir input.gpkg layer_name
Форматы не ограниченные по типу геометрии
Некоторые форматы позволяют хранить в одном слое сразу несколько типов геометрии и для их конвертации в форматы с одним типом геометрии требуется особый подход. Например, для конвертации MIF/MID в формат ESRI Shape нужно указать тип геометрии:
ogr2ogr -skipfailures output_POINT.shp input.mif -nlt "POINT"
или, чтобы получить все типы геометрий, можно использовать цикл (Windows):
for %n in (POINT POLYGON) do ogr2ogr -skipfailures output_%n.shp input.mif -nlt "%n"
Перепроецирование
Для перевода данных из одной системы координат в другую могут использоваться следующие параметры:
- -a_srs, назначение системы координат набору данных, без создания нового набора (если у набора была задана проекция - она игнорируется; фактически это не перепроецирование)
- -s_srs, указание исходной системы координат (если у набора данных уже прописана система координат - она игнорируется)
- -t_srs, требуемая система координат в которую будет осуществляться пересчет.
Например, у файла worldmap.shp нет файла описания проекции (*.prj) - его можно сгенерировать командой:
ogr2ogr -a_srs "EPSG:4326" -f "ESRI Shapefile" worldmap2.shp worldmap.shp
Перепроецирование из EPSG:4326 в EPSG:900913
ogr2ogr -s_srs "EPSG:4326" -t_srs "EPSG:900913" -f "ESRI Shapefile" worldmap3.shp worldmap2.shp
Проекция может задаваться не только кодом epsg, но и непосредственно в формате WKT или именем файла (в котором хранится описание проекции):
ogr2ogr -s_srs ESRI::Input.prj -t_srs ESRI::output.prj shapeout.shp shapein.shp
Указание проекции в формате WKT:
ogr2ogr -t_srs "+proj=latlong +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0,0,0" shapeout.shp shapein.shp
Обрезка
Можно обрезать данные по нужному охвату, углы задаются в формате мин X, мин Y, макс X, макс Y.
ogr2ogr -clipsrc 41.4 46.4 41.6 46.6 output.shp input.shp
Вместо координат можно обрезать и по сложной форме заданной другим shape-файлом:
ogr2ogr -clipsrc clipbound.shp output.shp input.shp
пакетно (Win):
for %n in (*.shp) do ogr2ogr -clipsrc clipbound.shp output_folder/%n %n
пакетно (Ubuntu):
for f in *.shp; do ogr2ogr -lco ENCODING=UTF-8 -clipsrc clipbound.shp output_folder/${f} ${f}; done
Объединение
Суть объединения по ogr'овски в том, что сначала создается копия первого источника данных, а потом к этой копии добавляются данные из второго, и т.д.
ogr2ogr result.shp input1.shp ogr2ogr -update -append result.shp input2.shp -nln result
В OGR можно использовать операцию JOIN (объединение по общему полю):
ogr2ogr -sql "select input.*, table.* from input LEFT JOIN 'table.csv'.table ON input.id = table.IDINT" output.shp input.shp
В примере выше используется input.shp в качестве shape-файла и table.csv - в качестве присоединяемой таблицы. Присоединяемая таблица должна иметь расширение CSV. Обе таблицы разумеется должны иметь общее поле по которому будет происходить объединение, в данном случае это: id - поле в input.shp и IDINT - поле в table.csv. Ключом может быть и целочисленное и текстовое поле.
Следует учесть, в новом shape-файле названия полей будут изменены на новые, вида input.field1, input.field2,…, table.field1, table.field2 и т.д., т.е. в новой таблице названия полей будут указывать и источник. Так как существует ограничение на длину названия поля, то это может привести к ухудшению читаемости названия поля. Для начала можно укоротить названия входного shape-файла и таблицы и самих названий полей.
Более правильным решением является переназначение названий полей:
ogr2ogr -sql "select input.field1 AS FIELD1, table.field2 AS FIELD2 from input LEFT JOIN 'table.csv'.table ON input.id = table.IDINT" output.shp input.shp
PostreSQL/PostGIS
Вставка (добавление) записей в таблицу PostgreSQL данных из файла data.shp. Таблица должна существовать и иметь такие же поля, как и shp-файл.
ogr2ogr -append -t_srs "+init=epsg:4326" -f PostgreSQL PG:"host=адрес user=имя_пользователя dbname=имя_базы" data.shp
Перезаписывает test таблицу PostgreSQL данными из файла test.tab Таблица не обязана существовать.
ogr2ogr -append -overwrite -s_srs "+init=epsg:4326" -f PostgreSQL PG:"host=адрес user=имя_пользователя dbname=имя_базы" test.tab
Перезаписывает данные из файла data в таблицу PostgreSQL. Таблица будет носить имя не data, а test1. Таблица test1 не обязана существовать.
ogr2ogr -append -overwrite -t_srs "+init=epsg:4326" -f "PostgreSQL" PG:"host=адрес user=имя_пользователя dbname=test" data.shp -nln test1
Из таблицы PostgreSQL «adm» базы ipc конвертирует в allei.tab формата MapInfo.
ogr2ogr -f "MapInfo File" allei.tab PG:"host=адрес user=пользователь dbname=ipc" "adm"
Из таблицы PostgreSQL «adm» базы ipc конвертирует в shape-файл с использованием выражения sql.
ogr2ogr -f "ESRi Shapefile" output.shp PG:"host=адрес user=пользователь dbname=ipc" -sql "SELECT * from adm"