เข้าร่วมไฟล์ CSV เพื่อ shapefile โดยใช้ gdal / ogr?


11

ฉันมี shapefile มีคุณลักษณะหลายประการเช่นYEAR, และCOUNTY AREAฉันยังมีไฟล์ CSV กับเขตอื่น ๆ ที่ฉันต้องการใน shapefile POPULATIONเช่น ทั้ง shapefile และไฟล์ CSV GISJOINมีฟิลด์ ฉันรู้วิธีเข้าร่วมใน QGIS แต่ฉันจะทำการเข้าร่วมแบบถาวรและเขียนไปยัง Shapefile โดยใช้ogr2ogrหรือหนึ่งในเครื่องมืออื่น ๆ ใน GDAL / OGR ได้อย่างไร


การสร้าง GDAL / OGR ของคุณมีการสนับสนุนแบบ spatialite หรือ sqlite หรือไม่
BradHards

@BradHards: มันดูไม่เหมือน มันเป็นแพ็คเกจ GDAL / OGR ที่สร้างจาก Ubuntu 14.04
Lincoln Mullen

คำตอบ:


24

ogr2ogrยูทิลิตี้สนับสนุนSQL ไวยากรณ์ คุณสามารถเข้าร่วม CSV ของคุณกับรูปร่างไฟล์โดยใช้สิ่งต่อไปนี้:

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

8
โอ้gdal / ogr - คุณไม่เคยหยุดที่จะทำให้ฉันประหลาดใจ ..
radek

@luke นี่ยอดเยี่ยม แต่ฉันจะทำอย่างไรถ้า shapefile และ csv ของฉันอยู่ในโฟลเดอร์ในพีซีของฉัน ... ฉันต้องใส่ Path ของฉันไว้ในโฟลเดอร์นั้นอย่างไร

@ ลุคฉันมี แต่ฉันไม่ได้ทำถูกต้องแน่นอน ogr2ogr -sql "เลือก C: \ Path \ inshape. *, C: \ Pathjoincsv. * จาก C: \ Path \ inshape ออกจากการเข้าร่วม 'C: \ Path \ joincsv .csv'.joincsv บน C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -SQL ". เลือก inshape * * * * * joincsv จาก inshape ซ้ายเข้าร่วม 'path / to / joincsv.csv'.joincsv บน inshape.GISJOIN = joincsv.GISJOIN" เส้นทาง shape_join.shp / เพื่อ / inshape.shp
user2856

ฉันได้รับข้อผิดพลาดต่อไปนี้: "คำเตือน 1: ค่า 1060008100 ของฟิลด์ inshape.MA ของฟีเจอร์ 86 ไม่ได้เขียนสำเร็จอาจเป็นเพราะจำนวนที่มากเกินไปเมื่อเทียบกับความกว้างของฟิลด์" แนวคิดใดที่จะแก้ปัญหานี้?
RutgerH

7

คำตอบที่ยอมรับนั้นมีประโยชน์จริง ๆ แต่ฉันพบว่ามันช้ากับฐานข้อมูลขนาดใหญ่ ฉันเชื่อว่ามันยัง จำกัด ตัวเลือกของคุณเมื่อเข้าร่วมข้อมูล

วิธีการของฉันคือการดึงทุกอย่างลงใน SQLite (โดยใช้การรวมกันของcsvkitและ ogr2ogr):

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

จากนั้นเข้าร่วมทุกอย่างและสร้าง shapefile จากมัน:

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 ฉันได้รับข้อผิดพลาดที่มีอยู่แล้ว myjoindb.db ควรจะมีการกำหนดชื่อบรรทัดที่สองว่าชื่อเดียวกับชื่อแรกหรือไม่
GIS Danny

จุดที่ดีในบรรทัดที่สองคุณจะต้องเพิ่ม-appendในที่นั่นเพื่อให้ogr2ogrสิทธิ์ในการเปิดฐานข้อมูล SQLite ที่มีอยู่และเพิ่มเข้าไป ฉันได้แก้ไขคำตอบเพื่อแสดงสิ่งนี้
eric brelsford

ขอบคุณ! ทำงานได้ดีมาก อีกหนึ่งคำถามหวังอย่างรวดเร็ว บรรทัดแรกฉันมี geoid ของสนามที่คอยแปลงไปเป็นค่าลบลอย ๆ อย่างประหลาด มันเป็นรหัสสำรวจสำมะโนประชากรที่ฉันต้องการที่จะปฏิบัติต่อเป็นสตริงฉันได้ลองห่อสตริงด้วยเครื่องหมายคำพูดและนั่นไม่ได้ผล มีคำสั่งเช่น: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)หรืออะไร?
GIS Danny

สิ่งที่แปลกคือการเข้าร่วมเกิดขึ้นอย่างถูกต้องในgeoidแต่ผลลัพธ์มีgeoidด้วย -2147184982 แทนที่จะเป็นสิ่งที่เกิดขึ้น
GIS Danny

ดูเหมือนว่าgeoidจะถูกแปลงเป็นตัวเลข แต่จำนวนนั้นมากจนล้นและกลายเป็นลบ ตรวจสอบเอกสารประกอบสำหรับ csvsqlคุณอาจลองระบุตารางที่คุณพูดอย่างชัดเจนว่าgeoidเป็นสตริงมิฉะนั้น--no-inferenceอาจช่วยได้
eric brelsford
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.