Імпорт файлу форми у 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)

Я також спробував імпортувати його через GUI 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)

Тому, здається, мені потрібно використовувати параметр: -n 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 дав змогу нарешті працювати. Дані завантажені в db правильно!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

Здається, що ваш файл форми недійсний. Чи працює це в іншому програмному забезпеченні?
Злий геній

1
Так. Його правильно завантажено в QGIS.
користувач1919,

1
Крім того, якщо ваш БД вже існує і що він правильно написаний у вашій інструкції ogr2ogr, і що користувач postgres у команді має повний набір необхідних привілеїв (SELECT, INSERT, UPDATE, CREATE тощо), спробуйте додати -nln layernameаргумент, можливо, разом з тим, -overwriteщоб побачити, чи це прийде в життя. Крім того, якби я був ти, я би запустив ogr2ogr, як sudoпоряд із своїм супергузером постгрес, просто щоб бути супер супер впевненим, щоб виключити дозволи та привілеї. Після того, як сценарій є твердим, ви зможете зазирнути на прикрі дозволи та привілеї. :)
elrobis

3
Дякую. Додавши -не GEOMETRY замість -nlt POLYGON зробив цю справу.
користувач1919

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 має достатньо привілеїв як для самої бази даних, так і для таблиці просторових_реф_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 to 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 для імпорту після використання 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


3
Що стосується -nlt PROMOTE_TO_MULTI, це справді найкраща практика для геометрії багатокутника. Я б запропонував змінити вашу відповідь, щоб порадити це як сильний вибір за замовчуванням, щоб його порушили лише після ретельного розгляду. Я також настійно не рекомендую використовувати загальний geometryтип для обробки змішаного багатокутника / мультиполігону, якщо тільки користувач / розробник не знає, що вони роблять, і потрібно змішувати полігони, лінії та точки.
Лі Хачадоріан

1
@LeeHachadoorian, погодився. Я редагував відповідь, як рекомендується. На мій захист, PROMOTE_TO_MULTIчи достатньо нового (GDAL 1.10), що я все ще за замовчуванням оригінального рішення, яке було доступне, коли я розпочав все це. :) ..у справедливості, однак, файл файлів поєднуватиме лише одинарний та багаточастинний типи, тому ніколи не було б сценарію, коли ogr2ogr проштовхує shp через -nlt GEOMETRYта будує таблицю з точками, лініями та полісами :))))) Однак я повністю згоден з вашою позицією з цього приводу.
elrobis

1
Shapefiles дозволяють створювати декілька багатокутників у своєму полігонному типі. Вони навіть не мають типу MultiPolygon. Тож навіть стикаючись з таким файлом форми, потрібно використовувати -nlt PROMOTE_TO_MULTIцю роботу.
CMCDragonkai
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.