Bergabung dengan file CSV untuk membentuk file menggunakan gdal / ogr?

11

Saya memiliki shapefile dengan beberapa atribut, misalnya YEAR, COUNTY, dan AREA. Saya juga memiliki file CSV dengan lebih banyak bidang yang saya inginkan di shapefile, seperti POPULATION. Baik shapefile dan file CSV memiliki bidang GISJOIN. Saya tahu bagaimana cara bergabung di QGIS. Tetapi bagaimana saya bisa membuat join permanen dan menulis ke shapefile menggunakan ogr2ogratau salah satu alat lain di GDAL / OGR?

Lincoln Mullen
sumber
Apakah build GDAL / OGR Anda memiliki dukungan spasial atau sqlite?
BradHards
@BradHards: Tidak terlihat seperti itu. Ini adalah paket GDAL / OGR paket dari Ubuntu 14.04.
Lincoln Mullen

Jawaban:

23

The ogr2ogr utilitas mendukung sintaks sql terbatas . Anda dapat bergabung dengan CSV Anda ke shapefile menggunakan sesuatu seperti berikut:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
pengguna2856
sumber
8
Oh gdal / ogr - kamu tidak pernah berhenti membuatku takjub ..
radek
@ Lukas Ini brilian, tetapi bagaimana saya bisa melakukan ini, jika shapefile dan csv saya berada di folder di PC saya ... di mana saya harus memasukkan Path saya ke folder itu?
@ Lukas saya miliki, TETAPI saya pasti tidak melakukannya dengan benar, ogr2ogr -sql "pilih C: \ Path \ inshape. *, C: \ Pathjoincsv. * Dari C: \ Path \ inshape ke kiri bergabung dengan 'C: \ Path \ joincsv .csv'.joincsv pada C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp
4
ogr2ogr -SQL ". pilih inshape *, joincsv * dari inshape kiri bergabung 'path / ke / joincsv.csv'.joincsv pada inshape.GISJOIN = joincsv.GISJOIN" path shape_join.shp / ke / inshape.shp
user2856
Saya mendapatkan kesalahan berikut: "Peringatan 1: Nilai 1060008100 bidang inshape.MA fitur 86 tidak berhasil ditulis. Mungkin karena jumlah yang lebih besar sehubungan dengan lebar bidang" Ada ide bagaimana menyelesaikan ini?
RutgerH
7

Jawaban yang diterima benar-benar berguna, tetapi saya menemukan bahwa itu lambat dengan database besar. Saya percaya ini juga membatasi pilihan Anda saat bergabung dengan data.

Metode saya sekarang adalah untuk menarik semuanya ke dalam SQLite (menggunakan kombinasi csvkit dan ogr2ogr):

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

Kemudian gabungkan semuanya dan buat shapefile darinya:

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
eric brelsford
sumber
Hei Eric, saya mendapatkan kesalahan bahwa myjoindb.db sudah ada. Apakah secondline db itu seharusnya dinamai sama dengan yang pertama?
GIS Danny
Ah poin bagus, pada baris kedua Anda ingin menambahkan -appenddi sana untuk memberikan ogr2ogrizin untuk membuka db SQLite yang ada dan menambahkannya. Saya telah mengedit jawaban untuk menunjukkan ini.
eric brelsford
Terima kasih! Bekerja dengan baik. Satu pertanyaan lagi, semoga cepat. Baris pertama, saya memiliki bidang geoid yang terus berubah secara aneh menjadi pelampung negatif. Ini adalah id sensus yang ingin saya perlakukan sebagai string, saya telah mencoba membungkus string dengan tanda kutip dan itu tidak berhasil. Apakah ada perintah seperti: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)atau sesuatu?
GIS Danny
Apa yang aneh adalah bergabung terjadi dengan benar pada geoid tetapi output memiliki geoid dengan -2147184982 bukannya apa yang masuk ke dalamnya.
GIS Danny
Kedengarannya seperti geoidsedang dikonversi ke angka, tetapi jumlahnya sangat besar sehingga meluap dan menjadi negatif. Periksa dokumentasi untuk csvsql , Anda dapat mencoba menentukan tabel di mana Anda secara eksplisit mengatakan itu geoidadalah string, yang lain --no-inferencemungkin membantu.
eric brelsford