QGIS, Postgis: тип геометрии не соответствует типу столбца

30

Я пытаюсь импортировать некоторые шейп-файлы полигонов в Postgis в QGIS через SPIT. Один из них не может быть импортирован и возвращает эту ошибку:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

Я пытался изменить атрибут "Класс объектов" в этой таблице в SPIT widnow, с MULTIPOLYGON на POLYGON, но ничего не произошло.

Есть ли способ заставить Postgis принимать оба типа (полигон и мультиполигон)? Или, может быть, как-то я могу преобразовать геометрию шейп-файла из многоугольника в многоугольник? Любые идеи?

Я пробовал Qgis 2.0.1 в Windows и Qgis 2.3 в ArchLinux.

dmh126
источник

Ответы:

14

Плевать не поддерживается и больше не рекомендуется. Я бы предложил использовать набор инструментов для обработки и выбрать алгоритм «Импорт в PostGIS». Мне повезло больше, используя эту рутину. Несколько вещей на заметку:

  • Параметр базы данных (имя соединения) должен соответствовать названию соединения с базой данных, которое вы указали в диалоговом окне «Добавить слой PostGIS».
  • Схема уже должна существовать - она ​​не будет создана автоматически
ndawson
источник
Работает отлично. Спасибо. Также я загрузил этот шейп-файл с DB Manager. Сначала я загрузил другой слой с помощью Multipolygon с помощью SPIT, а затем перезаписал его слоем POLYGON в DBM (слой / файл импорта). Это тоже работает.
dmh126
База данных не будет отображаться (даже если она имеет такое же имя в QGIS 2.10 для Windows)
Менелай Коцолларис
19

Кажется, это известная проблема, которая не будет устранена: см. Http://hub.qgis.org/issues/5328.

Если вам нужен обходной путь, попробуйте изменить тип столбца геометрии вашей таблицы на общую «геометрию»:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

После того как вы сделали свой импорт, вы можете вернуться к MultiPolygon:

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

Или попробуйте загрузить ваши данные, используя ogr2ogr .

dbaston
источник
голосуя против вашего ответа @dbaston. это лучше, чем у меня. :)
sfletche
19

Я использую ogr2ogr для автоматизации загрузки шейп-файлов в базу данных PostGIS. В частности, в отношении вопроса используйте опцию:

-nlt PROMOTE_TO_MULTI

Это заставит ogr2ogr преобразовывать геометрию POLYGON в MULTIPOLYGON, избегая ошибки. Очень простой пример:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

Я опустил детали хоста / аутентификации pgsql. Для пакетирования нескольких шейп-файлов вы можете сделать что-то вроде:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
обкрадывать
источник
Это работает и легче, чем другие ответы. Это заслуживает голосов.
Джо Гермуска
5

Хотя я пытался решить эту проблему с помощью алгоритма «Импорт в PostGis», я не добился успеха (моя база данных не появилась в списке - я использую QGIS 2.10).

Вместо этого я использовал shp2pgsql , которая была простой задачей командной строки, как описано ниже:

  • Откройте командную строку ( как администратор )
  • Перейдите в папку PostgreSQL / bin, которая должна выглядеть примерно так: C:\Program Files\PostgreSQL\9.4\bin>
  • Просто скопируйте и вставьте ваши .shpфайлы в этот каталог. (Я скопировал всю мою папку с моими .shpфайлами.
  • В командной строке введите следующее: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlгде MyShpDirваш каталог, 4326 - это SRID WGS84, поэтому измените, если вы используете другой SSID, MySHPFile.shpваш конкретный файл ( MYSQLFileбудет создан автоматически). Очевидно, сделайте это для всех файлов, которые вы хотите конвертировать. Файлы будут сохранены в вашем текущем каталоге ( C:\Program Files\PostgreSQL\9.4\binв моем случае)

Затем просто скопируйте и вставьте файлы SQL в базу данных PLSQL.

Кроме того, еще одна интересная вещь shp2pgsqlзаключается в том, что вы можете мгновенно создать индекс в своей таблице, просто добавив Iпараметр в команду, например так:

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

Прибыль! :)

Менелаос Коцолларис
источник
3

Да, вы можете указать PostGIS принять любой тип геометрии (полигон, мультиполигон, точка, линейная линия и т. Д.), Добавив в вашу таблицу следующее ограничение.

Для PostGIS 2.x (с использованием универсального Geometry typemod)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

Предыдущий ответ (для PostGIS 1.x с использованием ограничений)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
источник
Синтаксическая ошибка в или около CONSTRAINT. Я пробовал SET CONSTRAINTS, но вместо этого я получил ту же ошибку рядом с CHECK.
dmh126
какую версию postgis вы используете?
sfletche
Postgis 2.1 для PostgreSQL 9.3
dmh126
попробуйте использовать, enforce_geotype_geomа не enforce_geometry_type. дайте мне знать, если это сработает, и я отредактирую свой ответ, если это сработает.
sfletche
Не работает Та же ошибка.
dmh126
2

Я попробовал алгоритм «Импорт в PostGIS», но обнаружил, что это тоже не сработало. Самым простым решением, которое я нашел, было перейти в « База данных» > « Менеджер БД» , перейти к базе данных и нажать кнопку « Импортировать слой / файл» (стрелка вниз) .

Brideau
источник