गदल / ogr का उपयोग करके आकृति को CSV फ़ाइल में मिलाएँ?


11

मैं उदाहरण के लिए कई विशेषताओं के साथ कोई शेपफ़ाइल है, YEAR, COUNTY, और AREA। मेरे पास CSV फ़ाइल भी है जिसमें अधिक फ़ील्ड्स हैं जो मुझे शेपफाइल में चाहिए, जैसे कि POPULATION। शेपफाइल और सीएसवी फाइल दोनों में एक फील्ड है GISJOIN। मुझे पता है कि QGIS में कैसे शामिल होना है। लेकिन मैं ogr2ogrGDAL / OGR में से किसी एक टूल का उपयोग करके एक स्थायी जोड़ कैसे बना सकता / सकती हूं?


क्या आपके GDAL / OGR बिल्ड में स्थानिक या साइक्लाइट का समर्थन है?
ब्रैडहार्ड

@ ब्रैडहार्ड: यह ऐसा नहीं दिखता है। यह Ubuntu 14.04 से GDAL / OGR निर्मित पैक है।
लिंकन मुलेन

जवाबों:


24

Ogr2ogr उपयोगिता एक का समर्थन करता है सीमित एसक्यूएल वाक्य रचना । आप अपने CSV को निम्न की तरह कुछ का उपयोग करके आकृति के साथ जोड़ सकते हैं:

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

8
ओह गदल / ogr - तुम मुझे विस्मित करना कभी नहीं छोड़ते ..
radek

@ ल्यूक यह शानदार है, लेकिन मैं कैसे कर सकता हूं, अगर मेरी आकृति और सीएलवी मेरे पीसी में एक फ़ोल्डर में स्थित हैं ... मुझे अपना पथ उस फ़ोल्डर में कहां शामिल करना चाहिए?

@ मेरे पास है, लेकिन मैंने निश्चित रूप से इसे सही नहीं किया है, ogr2ogr -sql "C: \ Path \ inshape चुनें। *, C: \ Pathjoincsv। .csv'.joincsv C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "।। चुनिंदा Inshape *, Inshape से joincsv * छोड़ दिया में शामिल होने के 'path / to / joincsv.csv'.joincsv inshape.GISJOIN = joincsv.GISJOIN पर" shape_join.shp path / to / inshape.shp
user2856

मुझे निम्नलिखित त्रुटि मिलती है: "चेतावनी 1: फ़ील्ड इंशपे का मूल्य 1060008100। फ़ीचर 86 की विशेषता सफलतापूर्वक नहीं लिखी गई है। संभवतः क्षेत्र की चौड़ाई के संबंध में बहुत बड़ी संख्या के कारण" कोई भी विचार यह कैसे हल करें?
रटगर्ह

7

स्वीकृत उत्तर वास्तव में उपयोगी है, लेकिन मैंने पाया कि यह एक बड़े-ईश डेटाबेस से धीमा था। मेरा मानना ​​है कि डेटा से जुड़ने पर यह आपके विकल्पों को भी सीमित करता है।

मेरा तरीका अब सब कुछ SQLite में खींचना है ( csvkit और ogr2ogr के संयोजन का उपयोग करके ):

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

फिर सब कुछ मिलाएं और उसमें से एक आकृति बनाएं:

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

हे एरिक, मुझे एक त्रुटि मिल रही है जो myjoindb.db पहले से मौजूद है। क्या उस दूसरी पंक्ति के डीबी को पहले जैसा माना जाता है?
जीआईएस डैनी

आह अच्छी बात, दूसरी लाइन पर आप एक मौजूदा SQLite db को खोलने की अनुमति -appendदेने के लिए उसमें जोड़ना चाहते हैं ogr2ogrऔर उसे जोड़ सकते हैं। मैंने यह दिखाने के लिए उत्तर संपादित किया है।
एरिक ब्रेलफोर्ड

धन्यवाद! बढ़िया काम कर रहा है। एक और सवाल, उम्मीद है कि जल्दी। पहली पंक्ति, मेरे पास एक फील्ड जियॉइड है जो अजीब तरह से नकारात्मक फ्लोट में परिवर्तित होता रहता है। यह एक जनगणना आईडी है जिसे मैं स्ट्रिंग के रूप में मानना ​​चाहता हूं, मैंने स्ट्रिंग को उद्धरण के साथ लपेटने की कोशिश की है और यह काम नहीं किया। वहाँ एक आदेश की तरह है: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)या कुछ और?
जीआईएस डैनी

क्या अजीब है में शामिल होने पर सही ढंग से होता है जिओएड लेकिन आउटपुट है जिओएड बजाय क्या यह में चला गया के -२१४७१८४९८२ साथ।
जीआईएस डैनी

जैसे लगता है कि geoidएक संख्या में परिवर्तित किया जा रहा है, लेकिन संख्या इतनी बड़ी है कि यह अधिक हो जाती है और नकारात्मक हो जाती है। Csvsql के लिए दस्तावेज़ीकरण की जाँच करें , आप एक तालिका निर्दिष्ट करने का प्रयास कर सकते हैं जहाँ आप स्पष्ट रूप से कहते हैं कि geoidयह एक स्ट्रिंग है, अन्यथा --no-inferenceमदद मिल सकती है।
एरिक ब्रेलफोर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.