आर्कगिस के बिना पायथन के माध्यम से मौजूदा शेपफाइल में विशेषता फ़ील्ड कैसे जोड़ें?


24

यदि मेरे पास मौजूद नहीं है तो मेरे पास एक पायथन स्क्रिप्ट है जो किसी आकृति क्षेत्र में एक विशेषता फ़ील्ड जोड़ती है। यह आर्कजीआईएस (ग्राफिक रूप से या पायथन के माध्यम से) करना आसान है, लेकिन मैं कुछ ऐसी चीज की तलाश कर रहा हूं जो आर्कगिस पर निर्भर न हो।

मैंने OGR के साथ असफलता की कोशिश की , क्योंकि मेरे शेपफाइल में विशेषताएं हैं

मैंने pyshp को देखा है , लेकिन इसी तरह स्कीमा को संशोधित करने के बाद इसे बनाने का कोई तरीका नहीं है। मुझे शेपफाइल (पायथन के लिए) के साथ एक कोशिश नहीं मिली है , लेकिन मैं इस सुविधा को विज्ञापित नहीं देखता। मैं यह भी नहीं देख सकता कि यह dbfpy के माध्यम से DBF फ़ाइल के साथ छेड़छाड़ करके कैसे किया जा सकता है ।

क्या किसी के पास कोई विचार है?


क्या यह मौजूदा शेपफाइल संरचना को क्लोन करने, एक नया कॉलम जोड़ने और फिर मूल आकार के आधार पर इसे आबाद करने के लिए स्वीकार्य होगा?
डेविडएफ


इस प्रश्न को gis.stackexchange.com/q/3623/664 के डुप्लिकेट के रूप में बंद किया जाना चाहिए ।
whuber

हां, अनिवार्य रूप से वही। मैंने देखा, लेकिन यह नहीं देखा।
माइक टी

जवाबों:


8

आपको इन प्रश्नों पर एक नज़र डालनी चाहिए क्योंकि यह पहले से ही उत्तर दिया गया है: पाइथन का उपयोग करके आकृति फ़ीचर में कस्टम फ़ीचर विशेषताओं को कैसे जोड़ा जाए?

/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python

यदि आप परिणाम के रूप में चाहते हैं, तो केवल एक आकृति फ़ाइल, बस अपनी स्क्रिप्ट के अंत में अपनी इनपुट फ़ाइलों को हटा दें।


जो कि gis.stackexchange.com/questions/3623/… के समान भी है कि इसे खोदने के लिए धन्यवाद
माइक टी


4

DBF नामक एक ब्रेन-डेड प्रारूप के लिए धन्यवाद, मौजूदा विशेषता डेटा के साथ फ़ील्ड्स को फ़ील्ड्स में जोड़ना बिना पुनर्लेखन या DBF के पैडिंग को जोड़ना संभव नहीं है। मुझे तैयार किए गए समाधान का पता नहीं है, लेकिन मैं क्या करूंगा एक मौजूदा एक के आधार पर एक नया आकार बनाने के लिए एक स्क्रिप्ट लिख रहा हूं और नए आकार के लिए अतिरिक्त क्षेत्र (ओं) को जोड़ दूंगा। फिर पुराने से नए शेपफाइल में ज्योमेट्री / एट्रीब्यूट डेटा कॉपी करें। और अंतिम चरण के रूप में, पुरानी आकृति को हटा दें, और नया नाम बदलें। यह सब OGR पायथन बाइंडिंग का उपयोग करके आसानी से पूरा किया जाता है।

वैकल्पिक रूप से, आप केवल DBF फ़ाइल के साथ उपरोक्त करने के लिए dbfpy का उपयोग कर सकते हैं। चरणों का क्रम समान रहता है:

  1. मूल के समान संरचना के साथ एक नया DBF बनाएं
  2. नए DBF में नए विशेषता फ़ील्ड बनाएँ
  3. मूल DBF से नए DBF में डेटा कॉपी करें
  4. पुराने DBF को हटा दें, नए DBF को पुराने DBF में बदल दें

आपको स्वयं या किसी अन्य फ़ाइल के आकार-प्रकार (.shp) में कोई भी परिवर्तन करने की आवश्यकता नहीं है, क्योंकि वे DBF में निहित विशेषता जानकारी का संदर्भ नहीं देते हैं। हालाँकि आपको रिकॉर्ड के क्रम को पुराने और नए DBF में समान रखने की आवश्यकता है।


3

DBFpy इसके लिए काम करना चाहिए। क्या आपने देखा है तो इस पृष्ठ पर उदाहरण:

http://dbfpy.sourceforge.net/

सुनिश्चित करें कि उस समय आर्कगिस सहित किसी भी अन्य एप्लिकेशन द्वारा शेपफाइल को संपादित नहीं किया जा रहा है क्योंकि इससे लॉकिंग के माध्यम से समस्या हो सकती है।


मुझे नहीं लगता कि अगर आपके पास पहले से ही DBF फ़ाइल में डेटा है तो यह काम करता है। मैंने इसे पहले देखा था, लेकिन मुझे एक त्रुटि मिलती है: "कम से कम एक रिकॉर्ड जोड़ा गया था, संरचना को बदला नहीं जा सकता है"। क्या आपके पास कोई विशिष्ट उदाहरण है?
माइक टी

आह मुझे याद है कि हाँ, क्योंकि सास ने कहा था कि एक नए DBF के निर्माण की आवश्यकता होगी। इसके बाद स्कीमा (फ़ील्ड्स आदि में) को कॉपी करें, इसके बाद अपना परिवर्धन करें, फिर रिकॉर्ड को कॉपी करें। "महान" DBF ... :(
रोब क्लार्क

@ माइक एक रिकॉर्ड कैसे जोड़ा गया जब आप सभी को एक क्षेत्र जोड़ना चाहते हैं ?? रिकॉर्ड जोड़ना एक त्रुटि है क्योंकि यह विशेषताओं और आकृतियों के बीच संबंध को बर्बाद कर देता है। एक फ़ील्ड जोड़ने से कोई नुकसान नहीं होता है। कोई भी लाइब्रेरी जो dbf फ़ाइलों को संपादित कर सकती है वह ठीक से काम करेगी।
whuber

@whuber: यह उनकी त्रुटि संदेश है। एक मौजूदा dbf खोलें जिसमें डेटा है और देखें:from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
माइक टी

@ माइक स्थिति स्पष्ट करने के लिए धन्यवाद। ऐसा लगता है कि dbfpy में एक अनावश्यक सीमा के परिणाम :-(। मैं अनुमान लगा सकता हूं कि: गैर-खाली डेटाबेस में फ़ील्ड जोड़ने के लिए सभी रिकॉर्डों को शारीरिक रूप से पढ़ने, विस्तारित करने और फिर से वापस लिखे जाने की आवश्यकता होती है। एक अच्छा समाधान है। एक अलग dBase पुस्तकालय खोजने या अन्य सॉफ्टवेयर का उपयोग करने के लिए ;-)।
whuber

1

मुझे ओजीआर का उपयोग करके एक समाधान मिला और पिछले प्रश्न से मदद करने के लिए धन्यवाद । यहाँ एक पूर्ण उदाहरण है:

from osgeo import ogr

# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names

# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)

# Close the Shapefile
source = None

मेरी समस्या यह थी कि मैंने इसके layer_defn.AddFieldDefn(new_field)बजाय प्रयोग किया layer.CreateField(new_field)। मदद के लिए बहुत धन्यवाद, और इसी तरह के अन्य प्रश्न के लिए जाँच नहीं करने के लिए खेद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.