Як ви виявили методом проб і помилок, виникло декілька проблемних проблем, які потрібно було виправити, остання з яких була вирішена за допомогою -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
- Переконайтеся, що на ваших контурах немає жодних прикольних символів, а також відсутність помилок друку чи написання помилок у шляху чи імені файлу
- Як @ user1919 виявив, переконайтеся, що ваш користувач ОС має достатньо привілеїв для доступу до формату! Як вони продемонстрували, це може допомогти спробувати відкрити файл форми в іншому програмному забезпеченні, наприклад, QGIS - якщо він працює в одному програмному забезпеченні, то воно не є корумпованим, і воно має працювати в іншому програмному забезпеченні.
Спочатку розгляньте можливість виконання команди ogr2ogr як sudo
виключення проблем з дозволом до тих пір, поки ви точно не дізнаєтесь, що ваш сценарій працює за призначенням.
- Крім того, як @ user1919 зрозумів, переконайтеся, що ваш користувач SQL має достатньо привілеїв як для бази даних, орієнтованої на ваш сценарій, так і для
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 для імпорту після використання 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