Примеры использования ogr2ogr
по адресу http://gis-lab.info/qa/ogr2ogr-examples.html
Перечь примеров для справки
С библиотекой gdal поставляется утилита ogr2ogr, предназначнная для конвертации векторных данных. В данной статье приводятся примеры использования этой утилиты.
GDAL/OGR - библиотека для работы с географическими форматами данных. GDAL представляет собой набор утилит для обработки растровых данных, в то время, как OGR предназначена для работы с векторными форматами. В статье рассматриваются некоторые практические примеры применения одной из утилит этой библиотеки: программы ogr2ogr.
Общие сведения
Программа ogr2ogr предназначена для конвертации векторных данных из одного формата в другой. Поддерживаемые форматы и используемые ключи можно узнать просто набрав в коммандной строке
ogr2ogr
В результате будет получена справка по использованию этой программы:
ogr2ogr [--help-general] [-skipfailures] [-append] [-update] [-gt n] [-select field_list] [-where restricted_where] [-sql ] [-spat xmin ymin xmax ymax] [-preserve_fid] [-fid FID] [-a_srs srs_def] [-t_srs srs_def] [-s_srs srs_def] [-f format_name] [-overwrite] [[-dsco NAME=VALUE] ...] [-segmentize max_dist] dst_datasource_name src_datasource_name [-lco NAME=VALUE] [-nln name] [-nlt type] [layer [layer ...]]
А также список поддерживаемых форматов (список может отличаться как в большую, так и в меньшую сторону, поскольку зависит от того, были ли подключены/отключены соответствующие модули при компиляции программы):
- ESRI Shapefile
- MapInfo File
- TIGER
- S57
- DGN
- Memory
- BNA
- CSV
- GML
- GPX
- KML
- GeoJSON
- Interlis 1
- Interlis 2
- GMT
- SQLite
- ODBC
- PostgreSQL
- MySQL
- Geoconcept
Специфика работы с кириллицей
Чтобы ogr2ogr корректно работал с файлами в названии которых есть кириллица, необходимо, перед выполнением команд установить переменную среды:
SET GDAL_FILENAME_IS_UTF8=OFF
Если исходные данные в кодировке UTF-8, то необходимо явным образом указывать, что выходные данные также будут в UTF-8, с помощью опции -lco ENCODING=UTF-8
, например:
ogr2ogr -lco ENCODING=UTF-8 ru_ex1.shp ru_ex.vrt
Конвертация
В примерах ниже будет использоваться shape-файл topo2km-rus.shp со следующими характеристиками:
Layer name: topo2km-rus Geometry: Polygon Feature Count: 10368 Extent: (-180.000000, 36.000000) - (180.000000, 88.000000) Layer SRS WKT: GEOGCS["GCS_Pulkovo_1942", DATUM["Pulkovo_1942", SPHEROID["Krasovsky_1940",6378245.0,298.3]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]] HEMISPHERE: String (1.0) INDEXROMAN: String (21.0) INDEXNUM: String (12.0) UNIQUE: String (25.0) ZONE: String (1.0) I10KM: Integer (4.0) I10KMZSTR: String (2.0) INDEXFULL: String (50.0) I2KM: Integer (4.0) I2KMZSTR: String (50.0)
Конвертировать ESRI Shapefile в формат MapInfo TAB можно следующим образом:
ogr2ogr -f "MapInfo File" topo2km-rus.tab topo2km-rus.shp
В результате в текущем каталоге появится 4 файла topo2km-rus.* --- результат конвертации.
Теперь конвертируем только некоторые объекты из файла topo2km-rus (в поле ZONE которых содержится строка "s"):
ogr2ogr -f "MapInfo File" -where "ZONE=s" topo2km-rus.tab topo2km-rus.shp
Аналогично можно воспользоваться параметрами:
- -select для выбора определенных полей таблицы атрибутов
- -spat для выбора объектов, лежащих в определенных пространственных границах
Конвертация из CSV в shape-файл и обратно подробно рассмотрена в отдельной статье.
Конвертация из форматов не ограниченных по типу геометрии
Для форматов, которые позволяют хранить в одном слое сразу несколько типов геометрий нужен нестандартный подход, так, чтобы конвертировать MIF/MID в формат ESRI Shape нужно указать тип геометрии, например:
ogr2ogr -skipfailures input_POINT.shp input.mif -nlt "POINT"
или, чтобы получить все типы геометрий, можно использовать цикл (Windows):
for %n in (POINT POLYGON) do ogr2ogr -skipfailures output_%n.shp input.mif -nlt "%n"
Этот подход может не подойти, так как при конвертации может происходить конвертация типов геометрии, что может приводить к появлению копии данных, с другой геометрией, например, такая команда приведет к созданию линейного shape-файла, несмотря на то, что в исходном файле может не быть линий, а только полигоны:
ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt "LINESTRING"
В связи с этим, более правильным подходом будет явным образом указать тип данных через -sql запрос, например:
ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt "LINESTRING" -sql "SELECT * FROM Input WHERE OGR_GEOMETRY='LINESTRING'"
Полностью обработать данные для всех файлов с определенным расширением и всех типов геометрии можно так (цикл для командного интерпретатора Windows):
for %i in (*.mif) do for %n in (POINT LINESTRING POLYGON MULTIPOLYGON MULTIPOINT MULTILINESTRING) do ogr2ogr -skipfailures %~ni_%n.shp %i -nlt "%n" -sql "SELECT * FROM '%~ni' WHERE OGR_GEOMETRY='%n'"
В этом случае если в исходнике нет линий, то они не будут сконвертированы из полигонов, будет создан пустой shape-файл.
Использование OGR SQL
Можно построить и более сложные условия для выборки данных с помощью OGR SQL и параметра "-sql", например:
Выбрать при конвертации только объекты из таблицы "topo2km-rus", поле ZONE которых содержит 'PERVOMAYSK'
ogr2ogr -f "MapInfo File" -sql "SELECT * FROM topo2km-rus WHERE ZONE='PERVOMAYSK'" topo2km-rus.tab topo2km-rus.shp
Выбрать отдельные поля в определённом порядке:
ogr2ogr -f "MapInfo File" topo2km-rus.tab topo2km-rus.shp -sql "SELECT I2KMZSTR, I2KM, INDEXNUM FROM topo2km-rus)"
Выбрать и переименовать "на лету" отдельные поля в таблице
ogr2ogr -f "MapInfo File" topo2km-rus.tab topo2km-rus.shp -sql "SELECT I2KMZSTR AS 'i2kmzstr', I2KM AS '2km', INDEXNUM FROM topo2km-rus)"
Сменить тип поля "на лету" у выбранных полей (можно совмещать смену полей с их переименованием)
ogr2ogr -f "MapInfo File" topo2km-rus.tab topo2km-rus.shp -sql "SELECT CAST (I10KM AS CHARACTER(4)), CAST (I2KM AS FLOAT) FROM topo2km-rus)"
Обратите внимание, что в SQL запросы не будут выполнены если в названиях файлов содержатся пробелы, знаки -. В этом случае название файла нужно брать в одинарные кавычки.
Значительно упростить команду можно использовав вместо ключа -sql ключ -where, его использование делает ненужным указание конструкции SELECT * FROM 'filename' WHERE
. Пример:
ogr2ogr -skipfailures output_MULTIPOINT.shp input.MIF -nlt "MULTIPOINT" -where "OGR_GEOMETRY='MULTIPOINT'"
вместо:
ogr2ogr -skipfailures output_MULTIPOINT.shp input.MIF -nlt "MULTIPOINT" -sql "SELECT * FROM input WHERE OGR_GEOMETRY='MULTIPOINT'"
Перепроецирование
Для перевода данных из одной системы координат в другую могут использоваться следующие параметры:
- -a_srs используется для указания системы координат для данных
- -s_srs используется для перезаписи информации о системе координат
- -t_srs перепроецирования данных в требуемую систему координат
Например, мы знаем, что файл topo2km-rus.shp содержит данные в географической системе координат Пулково 1942, но в комплекте с topo2km-rus.shp нет файла описания проекции (*.prj). Мы можем сгенерировать этот файл, воспользовавшись командой:
ogr2ogr -a_srs "EPSG:4284" -f "ESRI Shapefile" topo2km-rus2.shp topo2km-rus.shp
Команда:
ogr2ogr -s_srs "EPSG:4326" -t_srs "EPSG:900913" -f "ESRI Shapefile" topo2km-rus3.shp topo2km-rus2.shp
берет созданный на предыдущем этапе файл topo2km-rus2.shp и перепроецирует его в систему координат Google Mercator (epsg 900913), при этом опция -s_srs "epsg:4326" говорит о том, что при перепроецировании не нужно обращать внимания на исходную проекцию файла topo2km-rus2.shp, т.е. вести себя так, будто проекция источника - широта/долгота WGS84 (epsg 4326).
В приведенных примерах система координат указывалась на основе кодов epsg, но ее можно указывать и непосредственно в формате WKT или же передавать имя файла, в котором хранится ее описание. Например, если необходимо использовать описания систем координат, хранящихся в файлах input.prj и output.prj, то нужно использовать следующую конструкцию:
ogr2ogr -s_srs ESRI::Input.prj -t_srs ESRI::output.prj shapeout.shp shapein.shp
Перепроецировать данные с указанием набора параметров перехода из одной системы координат в другую можно следующим образом:
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 shapeout.shp shapein.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"