Zaimportuj plik kształtu do postgis za pomocą ogr2ogr daje: Nie można otworzyć źródła danych

13

Chcę użyć ogr2ogr, aby zaimportować plik shapefile do bazy danych Postgis. Pomyślnie zainstalowałem ogr2ogr i uruchamiam z pgsql następującą komendę:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

Otrzymuję komunikat o błędzie:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

Próbowałem również zdefiniować pełną ścieżkę pliku kształtu, ale otrzymałem ten sam komunikat.

Próbowałem także uruchomić:

ogrinfo world_boundaries.shp

Ta sama rzecz.


Po naprawieniu problemów z uprawnieniami do pliku pojawia się następujący błąd:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

Próbowałem również zaimportować go za pomocą GUI shp2pgsql i pojawia się następujący błąd:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

Tym razem problem polegał na tym, że ten użytkownik bazy danych nie miał wystarczających uprawnień. To naprawiło:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

Następny komunikat o błędzie to:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

Więc wydaje się, że muszę użyć parametru: -nlt MULTIPOLYGON Ale kiedy to robię, pojawia się kolejny błąd, który nie ma dla mnie żadnego sensu:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

Ale ładuje się za pomocą GUI shp2pgsql.


Komentarz @elrobis umożliwił to w końcu działać. Dane poprawnie załadowane do bazy danych!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
użytkownik1919
źródło
Wygląda na to, że Twój plik kształtu jest nieprawidłowy. Czy to działa w innym oprogramowaniu?
Zły geniusz
1
Tak. Jest poprawnie załadowany w QGIS.
user1919
1
Ponadto, zakładając, że twoja baza danych już istnieje i że jest poprawnie zapisana w instrukcji ogr2ogr oraz że użytkownik postgres w komendzie ma pełne zestaw niezbędnych uprawnień (SELECT, INSERT, UPDATE, CREATE .. itp.), Spróbuj dodać -nln layernameargument, może wraz z, -overwriteaby zobaczyć, czy ożyje. Również gdybym był tobą, uruchomiłbym ogr2ogr as sudowraz z moim superużytkownikiem postgres, aby być bardzo pewnym, aby wykluczyć uprawnienia i przywileje. Gdy skrypt jest solidny, możesz dziobać nieznośne uprawnienia i przywileje. :)
elrobis
3
Dzięki. Dodanie -nlt GEOMETRIA zamiast -nlt POLYGON załatwiło sprawę.
user1919
1
Cieszę się, że to zadziałało. Pójdę naprzód i udzielę właściwej odpowiedzi w odpowiedzi, która opisuje również, dlaczego moim zdaniem zadziałało.
elrobis

Odpowiedzi:

17

Jak odkryłeś metodą prób i błędów, było kilka dokuczliwych problemów, które należało naprawić, a ostatnie z nich rozwiązano za pomocą argumentu ogr2ogr -nlt GEOMETRY* .

* Zwróć uwagę na zalecenie w komentarzu @ LeeHachadoorian, które -nlt PROMOTE_TO_MULTIpowinno być stosowane jako rozwiązanie domyślne, a nie nlt GEOMETRYjako, że promuje ono najlepsze praktyki oprócz dodatkowych korzyści.

Uprawnienia użytkowników i komunikaty o błędach

Po pierwsze, ogr2ogr nie mógł otworzyć twojego pliku shapefile, i zdałeś sobie sprawę, że problemy z uprawnieniami wpłynęły w rzeczywistości na użytkownika systemu operacyjnego uzyskującego dostęp do twojego pliku shapefile. Ale jest tu ważna lekcja dla innych, a konkretnie komunikat o błędzie ogr2ogr w tej kwestii wprowadzał w błąd! Rzeczywiście, jeden z pierwszych komentujących pomyślał, że twój plik kształtu jest nieprawidłowy i, co prawda, zgaduję, że prawdopodobnie wystąpił błąd / literówka w ścieżce / nazwie pliku lub że w ścieżce pliku mógł znajdować się niekonwencjonalny znak - jak space - to łamało zdolność ogr2ogr do wskazywania pliku kształtu. Jak odkryłeś, w rzeczywistości był to po prostu problem z uprawnieniami użytkownika. Ponieważ komunikat o błędzie tworzy czerwony śledź, jest to możliwość, o której inni muszą pamiętać. :)

Uprawnienia użytkownika SQL i awarie tajemnic

Przez pewien czas byłbym zaskoczony twoim drugim błędem, ale testując użytkownika SQL za pomocą innego narzędzia do importowania (shp2pgsql), który był sprytny, otrzymałeś bardziej precyzyjny komunikat o błędzie i dałeś swojemu użytkownikowi SQL niezbędne uprawnienia na spatial_ref_sysstole. Dlatego ktoś, kto ma problemy z prawidłowym działaniem instrukcji importu ogr2ogr, powinien upewnić się, że jego użytkownik SQL ma wystarczające uprawnienia zarówno do samej bazy danych, jak i tabeli „spatial_ref_sys”.

Mieszane typy geometrii i najlepsze praktyki

Ostatnia napotkana przeszkoda wydaje się związana z faktem, że pliki kształtów pozwalają na współistnienie geometrii jedno- i wieloczęściowej w tym samym zbiorze danych / pliku. Uważa się za złą praktykę mieszanie typów geometrii w tej samej tabeli, nawet dla pojedynczego / wieloczęściowego tego samego typu elementu, i domyślnie odtwarzacze open source w twoim łańcuchu narzędzi będą próbowały chronić cię przed mieszaniem typów geometrii. Na szczęście dają one jednak pewne opcje. Początkowo zalecałem ustawienie argumentu -nlt GEOMETRY* w instrukcji ogr2ogr, co pozwoliło zaimportować zestaw danych wielokątów pomimo luźniejszej konwencji ESRI. Pamiętaj jednak, że oznacza to, że prawdopodobnie masz w tabeli zarówno geometrie jedno-, jak i wieloczęściowe, i może to powodować inne problemy na później!

Warto wspomnieć, że ogr2ogr ma inną -nltopcję, którą powinieneś rozważyć, a mianowicie PROMOTE_TO_MULTI. Aby zacytować dokumentację ..

Począwszy od GDAL 1.10, PROMOTE_TO_MULTI może być używany do automatycznego promowania warstw, które mieszają wielokąt lub wieloboki z wielobokami, oraz warstw, które łączą linie lub wielowarstwowe z wielowarstwowymi. Może być przydatny podczas konwersji plików kształtów do PostGIS i innych sterowników docelowych, które wdrażają ścisłe kontrole typów geometrii.

Innymi słowy, jeśli użyjesz PROMOTE_TO_MULTIflagi, WSZYSTKIE twoje obiekty zostaną przekonwertowane na funkcje wieloczęściowe, nawet jeśli składają się z jednej części. Jak zauważył @LeeHachadoorian w komentarzach - i jestem pewien, że większość by się z tym zgodziła - zaleca się preferowanie PROMOTE_TO_MULTIluźniejszej GEOMETRYflagi, ponieważ jest ona zgodna z najlepszymi praktykami, ujednolicając geometrie elementów w tabeli. Zasadniczo każdy kod, który napiszesz, powinien po prostu oczekiwać geometrii wieloczęściowych. Trzeba przyznać, że może to być czystsze i uprościć niektóre prace rozwojowe.

Ogólne porady dla osób mających problemy z importem SHP do POST

  1. Upewnij się, że na ścieżkach nie ma żadnych funky znaków oraz że w ścieżce lub nazwie pliku nie ma literówek ani literówek
  2. Jak odkrył @ user1919, upewnij się, że użytkownik systemu operacyjnego ma wystarczające uprawnienia, aby uzyskać dostęp do pliku shapefile! Jak wykazali, może pomóc próba otwarcia pliku kształtu w innym oprogramowaniu, takim jak QGIS - jeśli działa w jednym oprogramowaniu, to nie jest uszkodzony i powinien działać w innym oprogramowaniu.

Najpierw rozważ wykonanie polecenia ogr2ogr, sudoaby wykluczyć problemy z uprawnieniami, dopóki nie upewnisz się, że skrypt działa zgodnie z przeznaczeniem.

  1. Również, jak zdał sobie sprawę @ użytkownik1919, upewnij się, że użytkownik SQL ma wystarczające uprawnienia zarówno do bazy danych, na którą skierowany jest skrypt, jak i do spatial_ref_systabeli.

Ponownie na początku rozważ użycie superużytkownika PostGRESql w celu wykluczenia problemów z uprawnieniami SQL, dopóki skrypt nie będzie działał. Jeśli twój skrypt działa z superużytkownikiem, a następnie zawiedzie z preferowanym użytkownikiem automatyzacji, wiesz, że problem dotyczy użytkownika SQL, a nie twoich danych lub środowiska (instalacja gdal / ogr itp.)

  1. Spróbuj ustawić -nltflagę na jedną PROMOTE_TO_MULTIlub GEOMETRY. Ponieważ pliki shapefile pozwalają na luźniejszą konwencję typów funkcji, czasami musisz poinstruować narzędzia open source, aby były bardziej przyjazne :)

  2. Jeśli importujesz do PostgreSQL lub MySQL, spróbuj ustawić -lco PRECISION=no..fair ostrzeżenie, nie dokładnie zrozumieć, co robi ten argument, ale oto co mam doświadczenie .. Jak wiadomo, często zawierają Pliki kształtów SHAPE_LENGTHi SHAPE_AREApól, a ja czasami zauważyłem, że mam tajemnicze awarie, jeśli usunę te pola, mogę poprawnie importować dane. Jeśli jednak użyję -lco PRECISION=no, mogę uzyskać dane do zaimportowania bez konieczności usuwania tych pól. Zalecam użycie tego parametru jako kroku rozwiązywania problemów, ale aby zrozumieć, jaki problem naprawdę rozwiązuje, zanim zaakceptujesz import w rozwiązaniu produkcyjnym.

  3. Na koniec, jeśli używasz MySQL, pamiętaj, że niektóre bardzo duże geometrie obiektów mogą obrażać max_allowed_packetparametr MySQL . Możesz przeczytać więcej na ten temat w dokumentacji sterownika MySQL .. ale rozwiązaniem jest zmiana konfiguracji MySQL, aby pozwolić na wartość większą niż domyślna.

Przykład SHP do polecenia importu PostGIS dla ogr2ogr

Ze względu na wszystkich początkujących, którzy mogą tu wędrować, tak wygląda większość mojego importu SHP do Post przy użyciu ogr2ogr. Zauważ, że zawijam ścieżki / nazwy plików w cudzysłów, co chroni przed spacjami, dziwnymi znakami i łamaniem linii w terminalu. Poza tym podałem większość argumentów omówionych powyżej, oprócz zastąpień pola nazwy geometrii Pole FID i nazwa warstwy:

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

elrobis
źródło
3
Jeśli chodzi o -nlt PROMOTE_TO_MULTI, jest to naprawdę najlepsza praktyka w przypadku geometrii wielokątów. Proponuję zmienić twoją odpowiedź, aby doradzić to jako zdecydowany domyślny wybór, który zostanie naruszony po starannym rozważeniu. Zdecydowanie odradzałbym także używanie geometrytypu ogólnego do obsługi mieszanego wielokąta / wieloboku, chyba że użytkownik / programista naprawdę wie, co robi i musi mieszać typy wielokątów, linii i punktów.
Lee Hachadoorian
1
@LeeHachadoorian, zgodził się. Zredagowałem odpowiedź zgodnie z zaleceniami. W mojej obronie PROMOTE_TO_MULTIjest wystarczająco nowy (GDAL 1.10), że nadal domyślnie używam oryginalnego rozwiązania, które było dostępne, kiedy zaczynałem w tym wszystkim. :) .. jednak, uczciwie, plik kształtu będzie łączyć tylko pojedyncze i wieloczęściowe typy, więc nigdy nie byłoby scenariusza, w którym ogr2ogr przepchnąłby shp -nlt GEOMETRYi zbudowałby tabelę z punktami, liniami i polami :))))) Jednak całkowicie zgadzam się z twoim stanowiskiem w tej sprawie.
elrobis
1
Pliki kształtów dopuszczają wiele wielokątów w swoim typie wielokąta. Nie mają nawet typu MultiPolygon. Więc nawet jeśli napotkasz taki plik kształtu, musisz go użyć, -nlt PROMOTE_TO_MULTIaby to zadziałało.
CMCDragonkai