Tải số lượng lớn nhiều shapefiles vào PostGIS


33

Tôi đã có hơn một trăm lớp dữ liệu ở định dạng shapefile mà tôi muốn tải lên cơ sở dữ liệu PostGIS. Tất cả chúng đều nằm trong cùng một phép chiếu, nhưng đại diện cho các lớp dữ liệu khác nhau để chúng không có cùng một lược đồ.

Cách hiệu quả nhất về thời gian để chuyển đổi hàng loạt tất cả các tệp này sang cơ sở dữ liệu PostGIS của tôi (trên hệ điều hành windows 7) là gì?

CẬP NHẬT: Nhập hàng loạt trong pgAdmin3 "Trình tải lên hình dạng PostGIS" (như ghi chú bên dưới) hiện có sẵn theo mặc định với PostGIS 2.0 .


Tôi đang tìm kiếm một câu trả lời simlar cho điều này. Tuy nhiên tôi muốn làm cho nó một công việc hàng loạt chạy mỗi đêm. Thực tế, tôi muốn biến PostGIS của mình thành nô lệ cho ArcSDE (trong thời điểm hiện tại). Là người mới đối với PostGIS và SQL, tôi hiểu kịch bản cmd.exe sẽ làm gì nhưng không hiểu sao nó không dính vào đầu tôi. Những gì tôi muốn làm là lấy một loạt các tệp shp đã được xuất từ ​​ArcSDE dưới dạng một công việc hàng loạt, sau đó tải chúng lên PostGIS của tôi, nó sẽ ghi đè lên các gis / bảng hiện có.
geosmiles

Tôi sẽ hỏi đây là một câu hỏi mới, dọc theo dòng "cách đồng bộ hóa dữ liệu từ ArcSDE sang PostGIS." Có thể có một số ý tưởng thú vị.
Mike T

Câu trả lời:


22

Nếu muốn dính vào GUI thì phiên bản mới hơn của pgAdmin có Trình tải Shapefile có thể được sử dụng làm tải hàng loạt

nhập mô tả hình ảnh ở đây


32

Nếu bạn có máy tính Windows, bạn có thể sử dụng 'ol tốt CMD.EXEvới một vài vòng lặp bí truyền. Hãy chắc chắn rằng bạn làm điều này trong một thư mục "chứa" chỉ với các tệp shp / sql mà bạn cần tải.

Bước đầu tiên, tạo các tệp trình tải SQL (Tôi cũng giả sử bạn có dữ liệu WGS84 Lat / Long với 4326 .. cập nhật thông tin này lên SRS của bạn):

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

Sau đó kiểm tra các tệp SQL của bạn để đảm bảo chúng trông đẹp, sau đó thực hiện một vòng lặp tương tự:

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

Các bashtương đương cho POSIX dân gian (Linux, Mac OS X, vv) là một cái gì đó như:

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

sau đó

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

hoặc cả hai phần được dẫn vào một vòng lặp, nếu bạn không cần giữ các .sqltệp tạm thời :

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

điều này sẽ hoạt động tốt hơn trong một vòng lặp,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

yup, nó có thể được thực hiện trong một lệnh (nhưng không có phần >chuyển hướng, vì điều này phá vỡ phần |ống), miễn là bạn chắc chắn rằng SQL được truyền cho psql là chính xác. Tôi cho rằng điều này không tốt hơn, vì không có bản ghi dữ liệu ở định dạng SQL.
Mike T

4

Bạn cũng có thể sử dụng lệnh đơn này giúp việc lặp dễ dàng hơn nhiều và cũng không cần tạo riêng .sql,

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.