Я хочу использовать ogr2ogr для импорта шейп-файла в базу данных postgis. Я успешно установил ogr2ogr и запускаю из pgsql следующую команду:
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp
Я получаю сообщение об ошибке:
Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)
Я также попытался определить полный путь шейп-файла, но получил то же сообщение.
Также я попытался запустить:
ogrinfo world_boundaries.shp
То же самое.
После исправления проблем с разрешениями файла я получаю следующую ошибку:
ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
ERROR 1: Terminating translation prematurely after failed
translation of layer world_boundaries (use -skipfailures to skip errors)
Я также попытался импортировать его через графический интерфейс shp2pgsql, и я получаю следующую ошибку:
ALTER TABLE "public".""
Failed in pgui_exec(): ERROR: permission denied for relation spatial_ref_sys
CONTEXT: SQL statement "SELECT SRID FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
PL/pgSQL function addgeometrycolumn(character varying,character varying,character varying,integer,character varying,integer,boolean) line 5 at SQL statement
Shapefile import failed.
На этот раз проблема заключалась в том, что у этого пользователя базы данных не было достаточных разрешений. Это исправило это:
GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;
Следующее сообщение об ошибке:
Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
Insertion is likely to fail
ERROR 1: INSERT command for new feature failed.
ERROR: Geometry type (MultiPolygon) does not match column type (Polygon)
Кажется, мне нужно использовать параметр: -nlt MULTIPOLYGON Но когда я это делаю, я получаю еще одну ошибку, которая не имеет для меня никакого смысла:
ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON
Но он загружается с помощью графического интерфейса shp2pgsql.
Комментарий @elrobis позволил этому наконец-то работать. Данные загружены в БД правильно!
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
источник
-nln layername
аргумент, возможно, вместе с тем,-overwrite
чтобы увидеть, если это оживает. Кроме того, на вашем месте я бы запустил ogr2ogr, какsudo
и мой суперпользователь postgres, просто чтобы быть супер супер уверенным, чтобы исключить разрешения и привилегии. Как только ваш сценарий будет понятен, вы сможете смотреть на досадные разрешения и привилегии. :)Ответы:
Как вы обнаружили методом проб и ошибок, было несколько проблем, которые вам нужно было исправить, последняя из которых была решена с помощью аргумента
-nlt GEOMETRY
* ogr2ogr .* Обратите внимание на рекомендацию в комментарии @ LeeHachadoorian, которая
-nlt PROMOTE_TO_MULTI
будет использоваться в качестве решения по умолчанию, а не такnlt GEOMETRY
, как первая продвигает лучшую практику в дополнение к дополнительным преимуществам.Разрешения пользователей и сообщения об ошибках
Во-первых, ogr2ogr не смог открыть ваш шейп-файл, и вы поняли, что проблемы с разрешениями фактически влияют на доступ пользователя к вашей шейп-файлу. Но здесь есть важный урок для других, в частности, сообщение об ошибке ogr2ogr по этому вопросу вводит в заблуждение! Действительно, один из первых комментаторов думал, что ваш шейп-файл недействителен, и по общему признанию, я впервые предположил, что, вероятно, в пути / имени файла произошла ошибка / опечатка, или что в пути к файлу мог быть нетрадиционный символ - например, пробел - это нарушало способность ogr2ogr указывать на шейп-файл. Как вы обнаружили, на самом деле это была просто проблема с разрешениями пользователей. Поскольку сообщение об ошибке создает красную сельдь, это возможность, которую другие должны держать в голове. :)
Права пользователя SQL и загадочные сбои
Я был бы озадачен вашей второй ошибкой какое-то время, но, протестировав вашего пользователя SQL с другой утилитой импорта (shp2pgsql), которая была умной, вы получили более точное сообщение об ошибке и дали вашему пользователю SQL необходимые привилегии для
spatial_ref_sys
таблицы. Поэтому, если кто-то испытывает затруднения при правильной работе инструкции импорта ogr2ogr, он должен убедиться, что его пользователь SQL имеет достаточные привилегии как для самой базы данных, так и для таблицы «atial_ref_sys ».Типы смешанной геометрии и лучшие практики
Кажется, последнее препятствие, с которым вы столкнулись, связано с тем, что шейп-файлы допускают сосуществование как одной, так и многочастной геометрии в одном наборе данных / файле. Смешивать типы геометрии в одной и той же таблице считается плохой практикой даже для одного или нескольких элементов одного типа объектов, и по умолчанию проигрыватели с открытым исходным кодом в вашей цепочке инструментов будут пытаться защитить вас от смешивания типов геометрии. К счастью, они дают вам несколько вариантов. Первоначально я рекомендовал установить аргумент
-nlt GEOMETRY
* в вашей инструкции ogr2ogr, что позволило вам импортировать ваш набор данных полигонов, несмотря на более слабое соглашение ESRI. Имейте в виду, однако, что это означает, что вы, вероятно, имеете в своей таблице как геометрию, состоящую из одной, так и из нескольких частей, и это может создать другие головные боли для вашего будущего!Стоит отметить, что у ogr2ogr есть еще один
-nlt
вариант, который вы должны рассмотреть, а именноPROMOTE_TO_MULTI
. Цитировать документацию ..Другими словами, если вы используете
PROMOTE_TO_MULTI
флаг, тогда ВСЕ ваши функции будут преобразованы в составные элементы, даже если они состоят из одной части. Как отметил @LeeHachadoorian в комментариях - и я уверен, что большинство с этим согласятся - вам рекомендуется отдавать предпочтениеPROMOTE_TO_MULTI
более слабомуGEOMETRY
флагу, так как он соответствует наилучшей практике, объединяя геометрии элементов в вашей таблице. По сути, любой код, который вы пишете, должен ожидать многокомпонентную геометрию. Следует признать, что это может быть чище и упростить некоторые разработки.Общие советы для тех, кто испытывает проблемы с импортом SHP в POST
Сначала рассмотрите возможность выполнения команды ogr2ogr,
sudo
чтобы исключить проблемы с разрешениями, пока не убедитесь, что ваш скрипт работает должным образом.spatial_ref_sys
таблицы.Опять же, сначала рассмотрите возможность использования суперпользователя PostGRESql здесь, чтобы исключить проблемы с привилегиями SQL, пока ваш скрипт не заработает. Если ваш сценарий работает с суперпользователем, то происходит сбой привилегированного пользователя автоматизации, вы знаете, что проблема связана с пользователем SQL, а не с вашими данными или вашей средой (установка gdal / ogr и т. Д.)
Попробуйте установить
-nlt
флаг наPROMOTE_TO_MULTI
илиGEOMETRY
. Поскольку шейп-файлы допускают более слабые соглашения о типах объектов, иногда вам приходится указывать своим утилитам с открытым исходным кодом быть более любезными :)Если вы импортируете в PostGreSQL или MySQL, попробуйте установить
-lco PRECISION=no
..fair предупреждения, я не совсем понимаю , что делает этот аргумент, но вот то , что я испытал .. Как вы знаете, шейп часто включает в себяSHAPE_LENGTH
иSHAPE_AREA
поле, и я Иногда я замечал, что у меня возникают загадочные сбои, если я удаляю эти поля, я могу получить данные для правильного импорта. Однако, если я использую-lco PRECISION=no
, я могу получить данные для импорта, не удаляя эти поля. Я рекомендую использовать этот параметр в качестве шага устранения неполадок, но перед тем, как принять импорт в производственное решение, нужно понять, какую проблему он действительно решает.Наконец, если вы используете MySQL, помните, что некоторые очень большие геометрические объекты могут нарушать
max_allowed_packet
параметр MySQL . Вы можете прочитать больше об этом в документации по драйверу MySQL. Но решение состоит в том, чтобы изменить конфигурацию MySQL так, чтобы значение было больше значения по умолчанию.Пример команды импорта из SHP в PostGIS для ogr2ogr
Ради новичков, которые могут здесь пробраться, именно так выглядит мой импорт из SHP в Post с использованием ogr2ogr. Обратите внимание, что я обертываю пути / имена файлов в кавычки, это защищает от пробелов, странных символов и разрывов строк на терминале. Также я включил большинство аргументов, обсужденных выше, в дополнение к переопределениям для поля имени геометрии, Поле FID и имя слоя:
ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite
источник
-nlt PROMOTE_TO_MULTI
этого, то это действительно лучшая практика для геометрии многоугольника. Я бы посоветовал изменить ваш ответ, чтобы рекомендовать его в качестве сильного варианта по умолчанию, который следует нарушать только после тщательного рассмотрения. Я также настоятельно рекомендую не использовать универсальныйgeometry
тип для работы со смешанным полигоном / мультиполигоном, если пользователь / разработчик действительно не знает, что он делает, и ему нужно смешивать типы полигонов, линий и точек.PROMOTE_TO_MULTI
достаточно нового (GDAL 1.10), и я по-прежнему использую исходное решение, которое было доступно, когда я начал все это. :) .. честно говоря, шейп-файл будет объединять только одно- и многокомпонентные типы, поэтому никогда не будет сценария, когда ogr2ogr протолкнет shp и создаст-nlt GEOMETRY
таблицу с точками, линиями и полисами :))))) Однако я полностью согласен с вашей позицией по этому вопросу.-nlt PROMOTE_TO_MULTI
для этой работы.