Zbiorcze ładowanie wielu plików kształtów do PostGIS


33

Mam ponad sto warstw danych w formacie shapefile, które chcę załadować do bazy danych PostGIS. Wszystkie są w tej samej projekcji, ale reprezentują różne warstwy danych, więc nie mają tego samego schematu.

Jaki jest najbardziej efektywny czasowo sposób zbiorczej konwersji wszystkich tych plików do mojej bazy danych PostGIS (w systemie Windows 7)?

AKTUALIZACJA: Importowanie zbiorcze w pgAdmin3 „Program do przesyłania plików kształtów PostGIS” (jak wspomniano poniżej) jest teraz domyślnie dostępny w PostGIS 2.0 .


Szukam prostej odpowiedzi na to pytanie. Jednak chcę, aby to zadanie wsadowe było uruchamiane co noc. W efekcie chcę uczynić mój PostGIS niewolnikiem ArcSDE (na razie). Będąc nowym w PostGIS i SQL, dostaję to, co zrobiłby skrypt cmd.exe, ale jakoś nie tkwi w mojej głowie. Chcę uzyskać serię plików shp, które zostały wyeksportowane z ArcSDE jako zadanie wsadowe, a następnie załadować je do mojego PostGIS, który zastąpiłby istniejące już gis / tabele.
geosmiles

Zadałbym to jako nowe pytanie, w stylu „jak wsadowo zsynchronizować dane z ArcSDE do PostGIS”. Mogą być ciekawe pomysły.
Mike T

Odpowiedzi:


22

Jeśli chcesz trzymać się GUI, nowsza wersja pgAdmin ma Shapefile Loader, który może być używany jako ładunek zbiorczy

wprowadź opis zdjęcia tutaj


32

Jeśli masz komputer z systemem Windows, możesz użyć dobrej technologii CMD.EXEz kilkoma ezoterycznymi pętlami. Upewnij się, że robisz to w katalogu „zawierającym” tylko pliki shp / sql, które musisz załadować.

Najpierw utwórz pliki modułu ładującego SQL (założyłem również, że masz dane Lat / Long WGS84 z 4326 .. zaktualizuj to do SRS):

for %f in (*shp) do shp2pgsql -s 4326 %f public.%~nf > %~nf.sql

Następnie sprawdź pliki SQL, aby upewnić się, że dobrze wyglądają, a następnie wykonaj podobną pętlę:

for %f in (*sql) do psql -h myserver -d mydb -U myuser -f %f > nul

bashOdpowiednik dla POSIX ludowej (Linux, Mac OS X, itp) jest coś takiego:

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` > `basename $f .shp`.sql
done

następnie

for f in *.sql
do
    psql -h myserver -d mydb -U myuser -f $f > /dev/null
done

lub obie części połączone w jedną pętlę, jeśli nie musisz przechowywać .sqlplików tymczasowych :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done

czy działałoby to lepiej w pojedynczej pętli,for f in *.shp do shp2pgsql -s 4326 %f public.'basename $f .shp' > 'basename $f .shp'.sql | psql -h myserver -d mydb -U myuser done
Sam007,

tak, można to zrobić za pomocą jednego polecenia (ale bez >części przekierowującej, ponieważ psuje to |część potoku), o ile masz pewność, że SQL przekazany do psql jest poprawny. Twierdziłbym, że nie jest to lepsze, ponieważ nie ma zapisu danych w formacie SQL.
Mike T

4

Możesz także użyć tego pojedynczego polecenia, które znacznie ułatwia zapętlanie i nie wymaga osobnego tworzenia .sql,

for f in *.shp
    do shp2pgsql -c -D -s 4326 -I $f public.${f%.*} | psql -h hostname -d dbname -U usrname
done

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.