QGIS, Postgis: Typ geometrii nie pasuje do typu kolumny

30

Próbuję zaimportować niektóre kształty wielokątów do Postgis w QGIS za pomocą SPIT. Nie można zaimportować jednego z nich i zwraca ten błąd:

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

Próbowałem zmienić atrybut „Class Feature” w tej tabeli w SPIT widnow, z MULTIPOLYGON na POLYGON, ale nic się nie stało.

Czy jest jakiś sposób na to, aby Postgis akceptował oba typy (wielokąt i multipolygon)? A może w jakiś sposób mogę przekonwertować geometrię pliku kształtu z wielokąta na wielokąt? Jakieś pomysły?

Próbowałem Qgis 2.0.1 w systemie Windows i Qgis 2.3 w ArchLinux.

dmh126
źródło

Odpowiedzi:

14

Pluć jest nieobsługiwany i nie jest już zalecany. Sugerowałbym użycie przybornika przetwarzania i wybranie algorytmu „Importuj do PostGIS”. Miałem dużo więcej szczęścia dzięki tej procedurze. Kilka rzeczy do zapamiętania:

  • Parametr bazy danych (nazwa połączenia) musi być zgodny z nazwą połączenia z bazy danych w oknie dialogowym „Dodaj warstwę PostGIS”.
  • Schemat musi już istnieć - nie zostanie utworzony automatycznie
ndawson
źródło
Działa idealnie. Dzięki. Również załadowałem ten plik kształtu z DB Managerem. Najpierw załadowałem inną warstwę Multipolygon firmy SPIT, a następnie nadpisałem ją warstwą POLYGON w DBM (Importuj warstwę / plik). To też działa.
dmh126
Baza danych nie wyświetla się (nawet jeśli ma taką samą nazwę w systemie QGIS 2.10 w systemie Windows)
Menelaos Kotsollaris,
19

Wygląda na to, że jest to znany problem, który nie zostanie naprawiony: patrz http://hub.qgis.org/issues/5328

Jeśli potrzebujesz obejścia, spróbuj zmienić typ kolumny geometrii tabeli na ogólną „geometrię”:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Po zakończeniu importowania możesz wrócić do MultiPolygon:

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

Alternatywnie spróbuj załadować swoje dane za pomocą ogr2ogr .

dbaston
źródło
głosowanie na twoją odpowiedź @dbaston. to lepsze niż moje. :)
sfletche
19

Używam ogr2ogr do automatyzacji przetwarzania plików kształtów w bazie danych PostGIS. W szczególności w odniesieniu do pytania użyj opcji:

-nlt PROMOTE_TO_MULTI

Zmusi to ogr2ogr do promowania geometrii POLYGON do MULTIPOLYGON, unikając błędu. Bardzo prosty przykład:

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

Pominąłem szczegóły hosta / autoryzacji pgsql. Aby spakować wiele plików kształtów, możesz zrobić coś takiego:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
Obrabować
źródło
Działa to i jest łatwiejsze niż inne odpowiedzi. Zasługuje na pozytywne głosy.
Joe Germuska
5

Chociaż próbowałem go rozwiązać za pomocą algorytmu „Importuj do PostGis”, nie udało mi się (moja baza danych nie pojawiła się na liście - używam QGIS 2.10).

Zamiast tego użyłem shp2pgsql , które było prostym zadaniem wiersza polecenia, jak opisano poniżej:

  • Otwórz wiersz polecenia ( jako administrator )
  • Przejdź do folderu PostgreSQL / bin, który powinien wyglądać mniej więcej tak: C:\Program Files\PostgreSQL\9.4\bin>
  • Po prostu skopiuj i wklej swoje .shppliki do tego katalogu. (Skopiowałem cały folder z moimi .shpplikami.
  • W wierszu polecenia wpisz następujące polecenie: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlgdzie MyShpDirtwój katalog, 4326 jest SRID WGS84, więc zmień, jeśli używasz innego SSID, MySHPFile.shptwój konkretny plik ( MYSQLFilezostanie utworzony automatycznie). Oczywiście zrób to dla wszystkich plików, które chcesz przekonwertować. Pliki zostaną zapisane w twoim bieżącym katalogu ( C:\Program Files\PostgreSQL\9.4\binw moim przypadku)

Następnie po prostu skopiuj i wklej pliki SQL do bazy danych PLSQL.

Co więcej, jedną dodatkową fajną rzeczą shp2pgsqljest to, że możesz natychmiast utworzyć indeks w swojej tabeli, po prostu dodając Iparametr w poleceniu, tak jak to:

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

Zysk! :)

Menelaos Kotsollaris
źródło
3

Tak, możesz nakazać PostGIS zaakceptowanie dowolnego typu geometrii (wielokąta, wieloboku, punktu, oznaczenia linii itp.), Dodając do tabeli następujące ograniczenie.

Dla PostGIS 2.x (przy użyciu typowego trybu geometrii)

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

Poprzednia odpowiedź (dla PostGIS 1.x przy użyciu ograniczeń)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
źródło
Błąd składniowy przy lub w pobliżu CONSTRAINT. Próbowałem SET CONSTRAINTS, ale zamiast tego mam ten sam błąd w pobliżu SPRAWDŹ.
dmh126
jakiej wersji postgis używasz?
sfletche
Postgis 2.1 dla PostgreSQL 9.3
dmh126
spróbuj użyć enforce_geotype_geomzamiast enforce_geometry_type. daj mi znać, czy to zadziała, a jeśli tak, zmodyfikuję swoją odpowiedź.
sfletche
To nie działa Ten sam błąd.
dmh126
2

Próbowałem rozwiązania algorytmu „Importuj do PostGIS”, ale okazało się, że to też nie działa. Najprostszym rozwiązaniem, jakie znalazłem, było przejście do bazy danych > DB Manager , przejście do bazy danych i kliknięcie przycisku Importuj warstwę / plik (strzałka w dół) .

Brideau
źródło