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 nie nlt 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 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_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ę preferowanie PROMOTE_TO_MULTI
luźniejszej GEOMETRY
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
- 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
- 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, sudo
aby wykluczyć problemy z uprawnieniami, dopóki nie upewnisz się, że skrypt działa zgodnie z przeznaczeniem.
- 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_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
lub GEOMETRY
. 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ów SHAPE_LENGTH
i SHAPE_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