Импорт шейп-файла в postgis с помощью ogr2ogr дает: Невозможно открыть источник данных

12

Я хочу использовать 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
user1919
источник
Похоже, ваш шейп-файл недействителен. Это работает в другом программном обеспечении?
Злой гений
1
Да. Он правильно загружен в QGIS.
user1919
1
Кроме того, если ваша БД уже существует и что она правильно написана в вашей инструкции ogr2ogr, и что пользователь postgres в команде обладает полным набором необходимых привилегий (SELECT, INSERT, UPDATE, CREATE и т. Д.), Попробуйте добавить -nln layernameаргумент, возможно, вместе с тем, -overwriteчтобы увидеть, если это оживает. Кроме того, на вашем месте я бы запустил ogr2ogr, как sudoи мой суперпользователь postgres, просто чтобы быть супер супер уверенным, чтобы исключить разрешения и привилегии. Как только ваш сценарий будет понятен, вы сможете смотреть на досадные разрешения и привилегии. :)
elrobis
3
Благодарю. Добавление -nlt GEOMETRY вместо -nlt POLYGON добилось цели.
user1919
1
Рад, что это сработало. Я продолжу и сделаю правильный ответ в ответе, который также описывает, почему я думаю, что это сработало.
elrobis

Ответы:

17

Как вы обнаружили методом проб и ошибок, было несколько проблем, которые вам нужно было исправить, последняя из которых была решена с помощью аргумента -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. Цитировать документацию ..

Начиная с GDAL 1.10, PROMOTE_TO_MULTI можно использовать для автоматического продвижения слоев, которые смешивают многоугольник или мультиполигоны в мультиполигоны, и слоев, которые смешивают линейные строки или мультилинейные строки с мультилинейными строками. Может быть полезно при преобразовании шейп-файлов в PostGIS и другие целевые драйверы, которые реализуют строгие проверки для типов геометрии.

Другими словами, если вы используете PROMOTE_TO_MULTIфлаг, тогда ВСЕ ваши функции будут преобразованы в составные элементы, даже если они состоят из одной части. Как отметил @LeeHachadoorian в комментариях - и я уверен, что большинство с этим согласятся - вам рекомендуется отдавать предпочтение PROMOTE_TO_MULTIболее слабому GEOMETRYфлагу, так как он соответствует наилучшей практике, объединяя геометрии элементов в вашей таблице. По сути, любой код, который вы пишете, должен ожидать многокомпонентную геометрию. Следует признать, что это может быть чище и упростить некоторые разработки.

Общие советы для тех, кто испытывает проблемы с импортом SHP в POST

  1. Убедитесь, что в ваших путях нет лишних символов и что в пути или имени файла нет опечаток или ошибок
  2. Как обнаружил @ user1919, убедитесь, что у пользователя вашей ОС достаточно прав для доступа к шейп-файлу! Как они продемонстрировали, это может помочь попытаться открыть шейп-файл в другом программном обеспечении, например QGIS - если он работает в одном программном обеспечении, то он не поврежден и должен работать в другом программном обеспечении.

Сначала рассмотрите возможность выполнения команды ogr2ogr, sudoчтобы исключить проблемы с разрешениями, пока не убедитесь, что ваш скрипт работает должным образом.

  1. Также, как понял @ user1919, убедитесь, что ваш пользователь SQL обладает достаточными привилегиями как для базы данных, на которую указывает ваш скрипт, так и для spatial_ref_sysтаблицы.

Опять же, сначала рассмотрите возможность использования суперпользователя PostGRESql здесь, чтобы исключить проблемы с привилегиями SQL, пока ваш скрипт не заработает. Если ваш сценарий работает с суперпользователем, то происходит сбой привилегированного пользователя автоматизации, вы знаете, что проблема связана с пользователем SQL, а не с вашими данными или вашей средой (установка gdal / ogr и т. Д.)

  1. Попробуйте установить -nltфлаг на PROMOTE_TO_MULTIили GEOMETRY. Поскольку шейп-файлы допускают более слабые соглашения о типах объектов, иногда вам приходится указывать своим утилитам с открытым исходным кодом быть более любезными :)

  2. Если вы импортируете в PostGreSQL или MySQL, попробуйте установить -lco PRECISION=no..fair предупреждения, я не совсем понимаю , что делает этот аргумент, но вот то , что я испытал .. Как вы знаете, шейп часто включает в себя SHAPE_LENGTHи SHAPE_AREAполе, и я Иногда я замечал, что у меня возникают загадочные сбои, если я удаляю эти поля, я могу получить данные для правильного импорта. Однако, если я использую -lco PRECISION=no, я могу получить данные для импорта, не удаляя эти поля. Я рекомендую использовать этот параметр в качестве шага устранения неполадок, но перед тем, как принять импорт в производственное решение, нужно понять, какую проблему он действительно решает.

  3. Наконец, если вы используете 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

elrobis
источник
3
Что касается -nlt PROMOTE_TO_MULTIэтого, то это действительно лучшая практика для геометрии многоугольника. Я бы посоветовал изменить ваш ответ, чтобы рекомендовать его в качестве сильного варианта по умолчанию, который следует нарушать только после тщательного рассмотрения. Я также настоятельно рекомендую не использовать универсальный geometryтип для работы со смешанным полигоном / мультиполигоном, если пользователь / разработчик действительно не знает, что он делает, и ему нужно смешивать типы полигонов, линий и точек.
Ли Хачадурян
1
@ LeeHachadoorian, согласился. Я отредактировал ответ в соответствии с рекомендациями. В мою защиту PROMOTE_TO_MULTIдостаточно нового (GDAL 1.10), и я по-прежнему использую исходное решение, которое было доступно, когда я начал все это. :) .. честно говоря, шейп-файл будет объединять только одно- и многокомпонентные типы, поэтому никогда не будет сценария, когда ogr2ogr протолкнет shp и создаст -nlt GEOMETRYтаблицу с точками, линиями и полисами :))))) Однако я полностью согласен с вашей позицией по этому вопросу.
elrobis
1
Шейп-файлы допускают использование нескольких полигонов в их типе Polygon. У них даже нет типа MultiPolygon. Таким образом, даже когда вы сталкиваетесь с этим типом файла формы, нужно использовать его -nlt PROMOTE_TO_MULTIдля этой работы.
CMCDragonkai