फ़ाइल नाम के साथ फ़ील्ड जोड़ना जब ogr2ogr के साथ शेपफाइल्स को मिलाते हैं?


15

मैं कुछ शेपफाइल्स का विलय कर रहा हूं और मुझे QGIS के अंदर ऐसा करने में कुछ समस्याएँ थीं, इसलिए मैं सीधे ogr2ogr का उपयोग कर रहा हूं। मैं यह कर रहा हूँ (एक बैच में):

ogr2ogr -overwrite %destination% %n1%
ogr2ogr -update -append %destination% %n2% -nln all_new
ogr2ogr -update -append %destination% %n3% -nln all_new
ogr2ogr -update -append %destination% %n4% -nln all_new

यह ठीक काम करता है, लेकिन अब मुझे परिणामी शेपफाइल में एक क्षेत्र की आवश्यकता है, मूल आकृति के नाम के साथ एक फ़ील्ड जिसका मैंने विलय किया था। बहुत मुश्किल नहीं लगता है, लेकिन मैं इसे करने का प्रबंधन नहीं कर रहा हूं।

क्या कोई मदद कर सकता है? धन्यवाद!

जवाबों:


15

छोटी स्क्रिप्टिंग के साथ यह उल्लेखनीय होगा। निम्नलिखित की तरह कुछ के साथ आप एक फ़ोल्डर में सभी आकृति फाइल में एक स्तंभ में जोड़ने के लिए सक्षम होना चाहिए, और उन्हें मर्ज करने के लिए मर्ज करें। shp फ़ाइल

for %f in (*.shp) do (
  ogrinfo %f -sql "ALTER TABLE %f ADD COLUMN filename character(15)"
  ogrinfo %f -sql "UPDATE TABLE %f filename = '%f'"
  ogr2ogr -update -append merged.shp %f -f esri shapefile -nln merge 
)

संपादित करें: इसे काम करने के लिए कुछ बदलावों के साथ बैश स्क्रिप्ट के समान:

for f in *.shp
do 
  base=${f%.shp}
  ogrinfo $f -sql "ALTER TABLE $base ADD COLUMN filename character(15)"
  ogrinfo $f -dialect SQLite -sql "UPDATE $base SET filename = '$base'"
  ogr2ogr -update -append merged.shp $f
done

यह समाधान केवल तभी काम करेगा जब आपके सभी लेयर्स / शेपफाइल्स का एक ही नाम हो जैसे "CHEMIN" सही? मैं अलग-अलग लेयर नामों वाली फाइलों की स्क्रिप्टिंग के लिए एक समाधान ढूंढ रहा हूं।
ओ'ओएन

सही है, यदि आप CHEMIN को% f से बदलते हैं तो इसे किसी भी नाम के साथ काम करना चाहिए, जैसा कि शेपफाइल टेबल में लेयर नाम है। मैंने उत्तर संपादित किया। मेरे पास वास्तव में इसका परीक्षण करने के लिए खिड़कियां नहीं हैं
JaakL

9

मैं -sql विकल्प का उपयोग करूंगा, और निम्नलिखित तरीके से आकृति का आयात करूंगा:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'

पाओलो - मैं इसे काम करने के लिए संघर्ष कर रहा हूं। क्या यह केवल ogr2ogr के साथ किया जा सकता है और ogrinfo के साथ नहीं? मैंने गाल्ड-देव को भी पोस्ट किया है, मेरे उदाहरण lists.osgeo.org/pipermail/gdal-dev/2012-Nvent/034849.html के साथ इसे विंडोज या बैश में नहीं कर सकते हैं ..
oeon

जो, एकल ogrinfo लाइन विफल रहता है, या यह केवल स्क्रिप्ट (लूप के अंदर) के संदर्भ में विफल हो रहा है?
कैपूटी

पाओलो - मैं नीचे दिए गए उत्तर को जोड़ने जा रहा हूं। मेरे साथ अनुसरण करने के लिए धन्यवाद, दयालु सर! :)
ओयोन

7

शेपफाइल्स को मर्ज करने के कुछ तरीके हैं।

  • यदि आप परतों को एक परत के रूप में विलय करना चाहते हैं, तो आप विलय के लिए MMqgis टूल का उपयोग कर सकते हैं ...

mmqgis

  • यदि आप किसी फ़ोल्डर के अंतर्गत सभी शेपफाइल्स को मर्ज करना चाहते हैं, तो आप यहां DARREN COPE सरल कोड का उपयोग कर सकते हैं।

mkdir merged
for %f in (*.shp) do (
if not exist merged\merged.shp (
ogr2ogr -f esri shapefile merged\merged.shp %f) else (
ogr2ogr -f esri shapefile -update -append merged\merged.shp %f -nln Merged )
)
  • इसके बगल में बहुत सारी फ़ाइल को मर्ज करने के लिए जियोमर्ज फ्री टूल का उपयोग किया जा सकता है, लेकिन इसके साथ काम करने के लिए अपने फ़ाइल आकार पर विचार करना न भूलें।

और shapefile @dango के निर्देशन में विशेषता जोड़ना अच्छा है। आप नया कॉलम बनाने के लिए layer.CreateField (field_name) का उपयोग कर सकते हैं

import os
shapeFileName = os.path.splitext("your_shape_file_path")[0]

मुझे उम्मीद है इससे आपको मदद मिली होगी...


5

vascobnunes, यहाँ है कि कैसे मैं एक साथ कई ogr2ogr निर्देशों को डेज़ी-चेन को पायथन स्क्रिप्ट का उपयोग करके इस समस्या को पूरा किया। आप इसे आसानी से एक बैच स्क्रिप्ट में परिवर्तित कर सकते हैं, मूल रूप से मैं सिर्फ ogr2ogr निर्देशों ( cmd) को एक साथ मिलाता हूं , फिर उन्हें कॉल करके निष्पादित करता हूं os.system(cmd), पास होने वाले ogr2ogr कमांड में मैंने एक साथ संक्षिप्त किया।

गुप्त हथियार है ( जैसा कि कैपूटी ने प्रदर्शित किया है ) OGR_SQL को लागू करने के लिए फ़ाइल नाम को उस स्रोत डेटासेट के निरंतर मान के रूप में लागू करना है जिसे आप अपने मर्ज परिणाम में जोड़ रहे हैं।

मेरे उदाहरण में, -sqlध्वज इसे संभालता है, कोड में यह इस प्रकार है:

-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

लेकिन यह पढ़ने के लिए भ्रामक है क्योंकि मुझे परिणामी सहमति में एकल उद्धरण और दोहरे उद्धरण लागू करने की आवश्यकता है। ऐसा करने के लिए मुझे उन्हें "वास्तविक के लिए" उपयोग करने के लिए एकल उद्धरण (यानी \ ') से बचना होगा । तो पठनीयता के लिए, यह इसे चर और भागने के दृश्यों के बिना देखने में मदद करता है। यदि आप एक विशेष पुनरावृत्ति के लिए फ़ाइल नाम "सड़कों 1" का ढोंग करते हैं, तो परिणामी निष्कर्ष इस तरह से होगा जैसे Or2ogr वाक्य:

-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"

यह .py स्क्रिप्ट तीन तरकीबों का एक समामेलन है जो मैंने मैट विल्की (एक खाली, एक आकृति के क्लोन) से चुराया , j03lar50n (एक स्तंभ को ogrinfo और ogk_sql का उपयोग करके जोड़कर), और capooti (एक निश्चित स्तंभ मान लगाने के लिए ogr_sql का उपयोग करके ) एक आकृति में सभी रिकॉर्ड पर)। तो यहाँ पूरी स्क्रिप्ट है:


# merge_shps.py
import os    

path = "D:/GIS/01_tutorials/ND_Roads/extracted"  # path to your folder of .shp files
merge = "merge_filename"                         # this will be the name of your merged result

directory = os.listdir(path)

count = 0
for filename in directory:
    if ".SHP" in filename.upper() and not ".XML" in filename.upper():

        # On the first pass, create a clone and add the filename column.
        if count == 0:
            # Make a clone (matt wilkie)..
            cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
            os.system(cmd)

            # Add the field (j03lar50n)..
            cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
            os.system(cmd)

        # Now populate the data (capooti)..
        print "Merging: " + str(filename)

        # You'll need the filename without the .shp extension for the OGR_SQL..
        filenameNoExt = filename.replace(".shp","")

        cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
                path + '/' + merge + '.shp ' + \
                path + '/' + filename + \
                ' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

        # Uncomment this line to spit the ogr2ogr sentence to the terminal..
        #print "\n" + cmd + "\n"

        os.system(cmd)

        count += 1

4

आकृति फ़ाइल के फ़ोल्डर से स्रोत फ़ाइल नाम के साथ कॉलम जोड़ें। GDAL 1.10dev की आवश्यकता है, .shp एक्सटेंशन को छोड़ने का मेरा प्रयास काम नहीं कर रहा है - लेकिन कुल मिलाकर, काम करता है। - मुझे लगता है कि इसे ओजीआर के साथ विलय करने वाली लाइनों में जोड़ा जा सकता है।

for f in *.shp;

do

name=${f%.shp}

/Users/you/gdal_src/bin/ogrinfo $f -sql "ALTER TABLE $name ADD COLUMN filename character(21)"
/Users/you/gdal_src/bin/ogrinfo $f -dialect SQLite -sql "UPDATE $name SET filename = '$f'"
done;

बोली विनिर्देशन के लिए +1। मुझे ओजीआर एसक्यूएल अपडेट नहीं करने के कारण शीर्ष उत्तर पर त्रुटियां हो रही थीं।
user15741

3

हाय शायद यह लिंक मदद करेगा। यह दिखाता है कि पायथन गाल्ड बाइंडिंग का उपयोग करके एक फीलफिल को आकृति में कैसे जोड़ा जाए।


2

QGIS के अंदर आप मर्ज शेपफाइल प्लगइन जोड़ सकते हैं। "फ़ाइल नाम के साथ कॉलम जोड़ें" का विकल्प हैयहाँ छवि विवरण दर्ज करें


मुझे एक TypeError मिलती है: ऑब्जेक्ट का प्रकार 'noneType' में कोई लेन नहीं है ()
हेंस लेडेगेन

0

JaaKL के उत्तर का थोड़ा संशोधित संस्करण। ध्यान दें कि -append foo.shp और -nln foo का मिलान करना होगा। इसके अलावा, SQLite बोली के उपयोग पर ध्यान दें (GDAL स्पष्ट रूप से कीवर्ड 'अपडेट' को स्वीकार नहीं करता है, इसलिए SQLite बोली का उपयोग किया जाना चाहिए), और कीवर्ड की अनुपस्थिति 'शब्द' के बाद 'अद्यतन' (आवश्यक नहीं) या SQLite द्वारा स्वीकार किए जाते हैं)।

for %%f in (*.shp) do (
  if not "%%f" == "merge.shp" (
    ogrinfo %%f -sql "ALTER TABLE %%~nf ADD COLUMN fname character(15)"
    ogrinfo %%f -dialect SQLite -sql "UPDATE %%~nf SET fname = '%%~nf'"
    ogr2ogr -update -append merge.shp %%f -f "ESRI SHAPEFILE" -nln merge 
  )
)

0

चर्चा में थोड़ा देर हो गई, लेकिन अब ऑग्मरेज भी है

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.