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
źródło
-nln layername
argument, może wraz z,-overwrite
aby zobaczyć, czy ożyje. Również gdybym był tobą, uruchomiłbym ogr2ogr assudo
wraz 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. :)Odpowiedzi:
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_MULTI
powinno być stosowane jako rozwiązanie domyślne, a nienlt GEOMETRY
jako, ż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_sys
stole. 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ą
-nlt
opcję, którą powinieneś rozważyć, a mianowiciePROMOTE_TO_MULTI
. Aby zacytować dokumentację ..Innymi słowy, jeśli użyjesz
PROMOTE_TO_MULTI
flagi, 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ę preferowaniePROMOTE_TO_MULTI
luźniejszejGEOMETRY
flagi, 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
Najpierw rozważ wykonanie polecenia ogr2ogr,
sudo
aby wykluczyć problemy z uprawnieniami, dopóki nie upewnisz się, że skrypt działa zgodnie z przeznaczeniem.spatial_ref_sys
tabeli.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.)
Spróbuj ustawić
-nlt
flagę na jednąPROMOTE_TO_MULTI
lubGEOMETRY
. Ponieważ pliki shapefile pozwalają na luźniejszą konwencję typów funkcji, czasami musisz poinstruować narzędzia open source, aby były bardziej przyjazne :)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ówSHAPE_LENGTH
iSHAPE_AREA
pó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.Na koniec, jeśli używasz MySQL, pamiętaj, że niektóre bardzo duże geometrie obiektów mogą obrażać
max_allowed_packet
parametr 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
źródł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żywaniegeometry
typu 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.PROMOTE_TO_MULTI
jest 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 GEOMETRY
i zbudowałby tabelę z punktami, liniami i polami :))))) Jednak całkowicie zgadzam się z twoim stanowiskiem w tej sprawie.-nlt PROMOTE_TO_MULTI
aby to zadziałało.