Gdal / ogr kullanarak şekil dosyası için bir CSV dosyasına katılın?


11

Ben örneğin birkaç özelliklere sahip bir şekil dosyası var YEAR, COUNTYve AREA. Ayrıca şekil dosyasında istediğim daha fazla alana sahip bir CSV dosyam var POPULATION. Hem şekil dosyası hem de CSV dosyasının bir alanı vardır GISJOIN. QGIS'e nasıl katılacağımı biliyorum. Ancak ogr2ogr, GDAL / OGR'deki diğer araçlardan birini veya diğer araçlardan birini kullanarak kalıcı bir birleştirme yapabilir ve bir şekil dosyasına nasıl yazabilirim ?


GDAL / OGR derlemenizde uzamsal veya sqlite desteği var mı?
BradHards

@BradHards: Öyle görünmüyor. Ubuntu 14.04'ün paketlenmiş GDAL / OGR yapısı.
Lincoln Mullen

Yanıtlar:


24

Ogr2ogr yardımcı bir destek sınırlı SQL sözdizimi . Aşağıdaki gibi bir şey kullanarak CSV'nizi şekil dosyasına katılabilirsiniz:

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 - beni şaşırtmaktan asla vazgeçmeyeceksin ..
Radek

@luke Bu harika, ancak şekil dosyası ve csv bilgisayarımdaki bir klasörde bulunuyorsa bunu nasıl yapabilirim ... bu klasöre giden Yolu nereye eklemeliyim?

@Luke var, AMA kesinlikle doğru yapmadım, ogr2ogr -sql "seçin C: \ Path \ inshape. *, C: \ Pathjoincsv. * C: \ Path \ inshape 'C: \ Path \ joincsv C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp üzerinde .csv'.joincsv inshape.shp

4
ogr2ogr -sql "inshape'i seçin. *, joincsv. * inshape sol birleşim 'yolundan / / joincsv.csv'.joincsv in inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp path / to / inshape.shp
user2856

Şu hatayı alıyorum: "Uyarı 1: Özellik inshape.MA'nın 1060008100 değeri 86 özelliği başarıyla yazılmamış. Alan genişliği açısından çok daha büyük bir sayıdan kaynaklanıyor olabilir" Bunu nasıl çözeceğiniz hakkında bir fikriniz var mı?
RutgerH

7

Kabul edilen cevap gerçekten yararlıdır, ancak bunun büyük-ish veritabanı ile yavaş olduğunu gördüm. Verilere katılırken seçeneklerinizi de sınırladığına inanıyorum.

Benim yöntem şimdi her şeyi SQLite ( csvkit ve ogr2ogr bir arada kullanarak) içine çekmek için :

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

Sonra her şeye katılın ve ondan bir şekil dosyası oluşturun:

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

Hey Eric, myjoindb.db dosyasında zaten bir hata var. Bu ikinci satır db'nin ilk adıyla aynı olması gerekir mi?
CBS Danny

Ah iyi bir nokta, ikinci satırda eklemek -appendvar orada ogr2ogrbir SQLite db açmak ve eklemek için izin vermek . Bunu göstermek için cevabı düzenledim.
eric brelsford

Teşekkürler! Harika çalışıyor. Bir soru daha, umarım hızlı. İlk satırda, garip bir şekilde negatif şamandıralara dönüşmeye devam eden bir alan jeoidim var. Dize olarak tedavi etmek istediğim bir nüfus sayımı kimliği, dizeyi tırnak işaretleri ile sarmayı denedim ve işe yaramadı. Şuna benzer bir komut var mı csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)?
CBS Danny

Garip olan şey, birleştirmenin jeoid üzerinde doğru bir şekilde gerçekleşmesidir, ancak çıktının içine girilen yerine -2147184982 ile jeoid vardır.
CBS Danny

Kulağa geoidbir sayıya dönüştürülüyor, ancak sayı taşacak ve negatif olacak kadar büyük. Kontrol csvsql belgelerine açıkça söylemek nerede, sen bir tablo belirterek deneyebilirsiniz geoidbir dize, başka bir --no-inferencekudreti yardımı.
eric brelsford
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.