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