QGIS, Postgis: Тип геометрії не відповідає типу стовпця


30

Я намагаюся імпортувати кілька форматів полігонів до Postgis в QGIS через SPIT. Не можна імпортувати одну з них і повертає цю помилку:

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

Я намагався змінити атрибут "Feature Class" у цій таблиці в SPIT widnow, з MULTIPOLYGON на POLYGON, але нічого не сталося.

Чи є спосіб змусити Postgis приймати обидва типи (багатокутник і мультиполігон)? А може, якимось чином я можу перетворити геометрію фігурного формату з багатокутника на багатокутник? Будь-які ідеї?

Я спробував Qgis 2.0.1 в Windows і Qgis 2.3 в ArchLinux.

Відповіді:


14

Коса не підтримується і більше не рекомендується. Я б запропонував використовувати панель інструментів для обробки та вибрати алгоритм "Імпорт в PostGIS". Я мав набагато більше удачі, використовуючи цю рутину. Кілька речей, які слід зазначити:

  • Параметр бази даних (ім'я з'єднання) повинен відповідати тому, що ви назвали підключення до вашої бази даних у діалоговому вікні "Додати рівень PostGIS".
  • Схема вже повинна існувати - вона не буде створена автоматично

Це прекрасно працює. Спасибі. Також я завантажив цей файл файлів у диспетчер DB. Спочатку я завантажив інший шар за допомогою мультиполігону SPIT, потім перезаписав його шаром POLYGON у DBM (Імпортувати шар / файл). Це теж працює.
dmh126

База даних не відображатиметься (навіть якщо вона має те саме ім'я в QGIS 2.10 для Windows)
Menelaos Kotsollaris

19

Здається, це відома проблема, яку не виправити: див. Http://hub.qgis.org/isissue/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. це краще, ніж у мене. :)
sfletche

19

Я використовую ogr2ogr для автоматизації введення файлів форм у базу даних PostGIS. Зокрема, стосовно питання, використовуйте варіант:

-nlt PROMOTE_TO_MULTI

Це змусить ogr2ogr просувати геометрії POLYGON до MULTIPOLYGON, уникаючи помилки. Дуже простий приклад:

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

У мене опущені деталі хоста / auth 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 DataBase.

Крім того, одна додаткова цікава річ shp2pgsql- це той факт, що ви можете миттєво створити індекс у своїй таблиці, просто додавши Iпараметр у команду, як це:

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

Прибуток! :)


3

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

Для PostGIS 2.x (використовуючи загальний тип Geometry)

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)

Помилка синтаксису в CONSTRAINT або поблизу нього. Я спробував SET CONSTRAINTS, але замість цього я отримав таку ж помилку біля CHECK.
dmh126

яку версію поштових повідомлень ви використовуєте?
sfletche

Postgis 2.1 для PostgreSQL 9.3
dmh126

спробуйте enforce_geotype_geomскоріше використовувати enforce_geometry_type. дайте мені знати, якщо це працює, і я відредагую свою відповідь, якщо це станеться.
sfletche

Це не працює. Та сама помилка.
dmh126

2

Я спробував рішення алгоритму "Імпорт в PostGIS", але виявив, що і це не працює. Найпростіше рішення, яке я знайшов, - перейти до « База даних» > « Менеджер БД» , перейти до вашої бази даних та натиснути кнопку Імпортувати шар / файл (стрілка вниз) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.