Tham gia tệp CSV để shapefile bằng gdal / ogr?


11

Tôi có một shapefile với một số thuộc tính, ví dụ YEAR, COUNTYAREA. Tôi cũng có một tệp CSV có nhiều trường mà tôi muốn trong shapefile, chẳng hạn như POPULATION. Cả tệp shapefile và tệp CSV đều có một trường GISJOIN. Tôi biết làm thế nào để tham gia vào QGIS. Nhưng làm thế nào tôi có thể tham gia vĩnh viễn và viết thư cho một shapefile bằng cách sử dụng ogr2ogrhoặc một trong những công cụ khác trong GDAL / OGR?


Bản dựng GDAL / OGR của bạn có hỗ trợ spatialite hoặc sqlite không?
BradHards

@BradHards: Nó không giống như vậy. Đó là bản dựng GDAL / OGR được đóng gói từ Ubuntu 14.04.
Lincoln Mullen

Câu trả lời:


23

Các ogr2ogr tiện ích hỗ trợ cú pháp sql hạn chế . Bạn có thể tham gia CSV của mình vào shapefile bằng cách sử dụng một số thứ như sau:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp

8
Oh gdal / ogr - bạn không bao giờ hết ngạc nhiên tôi ..
radek

@luke Điều này thật tuyệt vời, nhưng làm thế nào tôi có thể làm điều này, nếu shapefile và csv của tôi được đặt trong một thư mục trong PC của tôi ... tôi phải đưa Đường dẫn của mình vào thư mục đó ở đâu?

@Luke Tôi có, NHƯNG tôi chắc chắn không làm đúng, ogr2ogr -sql "chọn C: \ Path \ inshape. *, C: \ Pathjoincsv. * Từ C: \ Path \ inshape bên trái tham gia 'C: \ Path \ jocsv .csv'.joincsv trên C: \ Path \ inshape.GISJOIN = jocsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql ". chọn inshape *, joincsv * từ inshape trái tham gia 'path / to / joincsv.csv'.joincsv trên inshape.GISJOIN = joincsv.GISJOIN" con đường shape_join.shp / to / inshape.shp
user2856

Tôi nhận được lỗi sau: "Cảnh báo 1: Giá trị 1060008100 của trường inshape.MA của tính năng 86 không được viết thành công. Có thể do số lượng quá lớn so với độ rộng trường" Bạn có ý tưởng nào để giải quyết vấn đề này không?
RutgerH

7

Câu trả lời được chấp nhận là thực sự hữu ích, nhưng tôi thấy rằng nó rất chậm với cơ sở dữ liệu lớn. Tôi tin rằng nó cũng giới hạn các lựa chọn của bạn khi tham gia dữ liệu.

Phương pháp của tôi bây giờ là kéo mọi thứ vào SQLite (sử dụng kết hợp csvkit và ogr2ogr):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

Sau đó tham gia mọi thứ và tạo ra một shapefile từ nó:

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db

Này Eric, tôi đang gặp một lỗi mà myjoindb.db đã tồn tại. Là db dòng thứ hai được cho là được đặt tên giống như đầu tiên?
GIS Danny

Thật tốt, trên dòng thứ hai, bạn sẽ muốn thêm -appendvào đó để cấp ogr2ogrquyền mở db dbite hiện có và thêm vào đó. Tôi đã chỉnh sửa câu trả lời để hiển thị điều này.
eric brelsford

Cảm ơn! Làm việc tuyệt vời. Thêm một câu hỏi, hy vọng nhanh chóng. Dòng đầu tiên, tôi có một Geoid trường luôn chuyển đổi kỳ lạ thành phao tiêu cực. Đó là một id điều tra dân số mà tôi muốn coi là chuỗi, tôi đã thử gói chuỗi bằng dấu ngoặc kép và nó không hoạt động. Có một lệnh như: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)hoặc một cái gì đó?
GIS Danny

Điều kỳ lạ là sự kết hợp xảy ra chính xác trên Geoid nhưng đầu ra có Geoid với -2147184982 thay vì những gì đã đi vào nó.
GIS Danny

Âm thanh như geoidđang được chuyển đổi thành một số, nhưng số lượng lớn đến mức nó tràn ra và trở nên tiêu cực. Kiểm tra tài liệu cho csvsql , bạn có thể thử chỉ định một bảng trong đó bạn nói rõ ràng đó geoidlà một chuỗi, nếu không thì --no-inferencecó thể giúp ích.
eric brelsford
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.