ArcPy का उपयोग करके नाम बदलना क्षेत्र?


9

मुझे क्या करना है:

  1. तालिका / सुविधा वर्ग के फ़ील्ड नाम का नाम बदलें
  2. सभी मानों को नए क्षेत्र में कॉपी करें

अब तक मैंने निम्नलिखित कोड @ कलाकृति 21 के रूप में सुझाए हैं:

import sys
import traceback
import arcpy
from arcpy import env

## ARGUMENTS
# argv[1] = input table/feature class path
# argv[2] = input old field name
# argv[3] = input new field name  

path = sys.argv[1]
oldFieldName = sys.argv[2] 
newFieldName = sys.argv[3] 

env.overwriteOutput = True

fields = arcpy.ListFields(path)
for field in fields:
    if field.aliasName == oldFieldName:
        if not oldFieldName == newFieldName:
            fieldType = field.type
            # Add new field
            arcpy.AddField_management(path, newFieldName, fieldType)
            #Calculates the new field based on old field values
            arcpy.CalculateField_management(path, newFieldName, "!"+oldFieldName+"!", "PYTHON", "")
            # Delete the old field (if necessary)
            arcpy.DeleteField_management(path, oldFieldName)

मैं विधि के क्षेत्र प्रकार के field.typeलिए मैप कैसे कर सकता हूं AddField_management? और जब क्षेत्र एक मध्य स्थान पर होता है, तो क्षेत्र को मध्य से हटा दिया जाता है और अंतिम में जोड़ा जाता है। ऐसा नहीं लगता है जैसे कि क्षेत्र का नाम बदल दिया गया है।

क्या कोई बेहतर उपाय है जो मुझे इन चीजों को करने में मदद करे?


आपकी फ़ीचर लेयर फ़ील्ड का नाम बदलकर यहाँ नहीं किया जा रहा है, fieldInfo.setNewName (इंडेक्स, "स्टेट")। यही कारण है कि आपको लाइन रो पर अपनी त्रुटि मिल रही है ।सेटवेल्यू ("स्टेट", जीवैल्यू)।
कलाकृति

2
setNewName (सूचकांक, new_field_name), केवल नए फ़ील्ड नाम सेट करने के लिए होना चाहिए, मौजूदा लोगों का नाम नहीं बदलने के लिए।
कलाकृति

2
एक FieldInfo ऑब्जेक्ट अंतर्निहित डेटा के लिए कुछ भी नहीं करता है, यह केवल फ़ील्ड गुणों का प्रतिनिधित्व है जो कि फ़ील्ड डेटा ऑब्जेक्ट के समान नए डेटा बनाने के लिए कुछ टूल के इनपुट के रूप में उपयोग किया जा सकता है।
blah238

1
है old_fieldएक चर नाम या पुराने क्षेत्र का वास्तविक नाम? यदि यह एक चर नाम है, तो आपको ब्रैकेट्स (VB parser) या विस्मयादिबोधक बिंदुओं (Python parser) के साथ चर के मान को लपेटने के लिए string formatting या concatenation का उपयोग करने की आवश्यकता है।
blah238

1
एक उर्फ सामान्य रूप में एक "उपनाम" या एक है छद्म नाम । यह आवश्यक रूप से डेटाबेस में वास्तविक कॉलम नाम के बराबर नहीं है।
blah238

जवाबों:


15

फ़ील्ड जोड़ें, फ़ील्ड की गणना करें और फ़ील्ड को हटाएं

if fieldInfo.getFieldName(index) == "status":
    arcpy.AddField_management(layer, "stat", "TEXT", "", "", "50", "",        "NULLABLE", "NON_REQUIRED", "")                     
    arcpy.CalculateField_management(layer, "stat", "!status!", "PYTHON_9.3", "")
    arcpy.DeleteField_management(layer, "status")

1
मैं दो फील्ड को एक जैसा बनाना चाहता हूं। लेकिन field.Type और AddField_management विधि के field_type नाम समान नहीं हैं। क्या करें?
ईएमआई

@ इमी, मुझे समझ में नहीं आ रहा है कि "दो फील्ड टाइप एक ही" से आपका क्या मतलब है? आप "स्टेटस" में मूल्य चाहते हैं, "स्टेट" नामक एक नए क्षेत्र में डाल दिया जाए?
कलाकृति

हाँ, मैं "स्टेटस" में मान चाहता हूँ, "स्टेट" नामक नए फील्ड में डालने के लिए
Emi

मैंने भी fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")इसके बजाय कोशिश की fieldInfo.setNewName(index, "stat")। लेकिन मेरे कोड के साथ वही त्रुटि हुई।
ईएमआई

पंक्तियों के लिए = arcpy.UpdateCursor (inputFeatureClass), शायद पंक्तियाँ आज़माएँ = arcpy.UpdateCursor (परत)
कलाकृति

9

अब आप कोर आर्कगिस डेस्कटॉप जीपी टूल - ऑल्टर फील्ड (डेटा मैनेजमेंट) का उपयोग करके एक फ़ील्ड का नाम बदल सकते हैं । यह उपकरण किसी भी जियोडैटेबेस तालिका या सुविधा वर्ग के लिए फ़ील्ड उपनामों को बदलने या फ़ील्ड उपनाम बदलने की क्षमता प्रदान करता है।

यह उपकरण 10.2.1 से शुरू होता है


5
यह केवल कुछ डेटा प्रारूपों का समर्थन करता है। विशेष रूप से, यह आकृतिफाइल्स पर एक त्रुटि फेंकता है।
jpmc26

3

किसी तालिका या सुविधा वर्ग में फ़ील्ड का नाम बदलने के लिए, मैं यहाँ वर्णित प्रक्रिया की कोशिश करूँगा ।

  1. ArcMap प्रारंभ करें और कैटलॉग विंडो खोलें।
  2. उस डेटाबेस का पता लगाएँ जिसमें वह तालिका है जिसे आप बदलना चाहते हैं।
  3. तालिका पर राइट-क्लिक करें और गुण क्लिक करें।
  4. फ़ील्ड टैब पर क्लिक करें।
  5. फ़ील्ड नाम कॉलम में मौजूदा पाठ पर क्लिक करें और एक नया नाम लिखें।

मैंने सिर्फ डेस्कटॉप स्टैंडर्ड 10.1 SP1 के लिए ArcGIS का उपयोग करते हुए फ़ाइल जियोडैटेबेस टेबल पर यह परीक्षण किया और यह ठीक काम किया।

दुर्भाग्य से, यह लिखने के बाद मैंने आर्कजीआईएस 10.1 पीडीएफ फाइल में व्हाट्स न्यू खोजा और पाया कि यह कार्यक्षमता उस संस्करण में जोड़ी जा सकती है - फिर भी यह देखने के लिए कि क्या इसे भी पोर्ट किया गया था, यह देखने के लिए 10.0 के नवीनतम सर्विस पैक का परीक्षण करने के लायक हो सकता है।


1
मेरा मानना ​​है कि ईएमआई एक चापलूसी समाधान की तलाश में है।
कलाकृति

वास्तव में मैं चापलूसी समाधान के लिए खोज रहा हूं
ईएमआई

1
मेरी गलती - मुझे लगा कि @ इमी ने कहा "क्या कोई बेहतर उपाय है ..." [मेरी डांट]।
PolyGeo

1

कोड के साथ दो बड़ी समस्याएं:

  • यदि डेटाटाइप एक फ़ीचर लेयर नहीं है, तो प्रोग्राम फ़ील्डइनफो जोड़तोड़ पर छोड़ देगा, और फिर एक नए / पुनर्नामित फ़ील्ड के लिए मान सेट करने का प्रयास करें जिसे कभी भी बनाया / नामांकित नहीं किया गया था।

  • दो लाइनें:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    एक बड़ी समस्या है। यदि पहले वाला कोड काम करता है तो फ़ील्ड "स्थिति" मौजूद नहीं है।


मैंने कोड की जाँच की और जबकि, यह एक फीचर लेयर है और फीचर क्लास में "स्टेटस" नामक फ़ील्ड है, वही त्रुटि देता है
Emi

यदि पहली पंक्ति काम करती है, तो दूसरी पंक्ति नहीं चलेगी।
mhoran_psprep

आपने परत में जानकारी बदल दी है, लेकिन पढ़ रहे हैं और डेटा को / से फीचरक्लास पर लिख रहे हैं
mhoran_psprep

1

मैं AddField_management विधि के फ़ील्ड प्रकार में field.type को कैसे मैप कर सकता हूं?

यह इस पोस्ट के अनुसार स्वचालित रूप से किया जाता है ।

और जब क्षेत्र एक मध्य स्थान पर होता है, तो क्षेत्र को मध्य से हटा दिया जाता है और अंतिम में जोड़ा जाता है। ऐसा नहीं लगता है जैसे कि क्षेत्र का नाम बदल दिया गया है। क्या कोई बेहतर उपाय है जो मुझे इन चीजों को करने में मदद करे?

जैसा कि मैंने आपके अन्य प्रश्न में उल्लेख किया है , आपके केवल अन्य विकल्प पूरे फीचर क्लास / टेबल को छोड़ने और फिर से बनाने और अंतर्निहित DBMS में कॉलम की परिभाषा को संशोधित करने के लिए हैं।

मैं तुम्हें लगता है कि हो सकता है सभी उपयोगकर्ता स्तंभ हटाना और उन्हें वांछित क्रम में फिर से बनाते हैं लेकिन यह है कि एक छोटे से पागल है। इस उत्तर की स्क्रिप्ट ठीक यही करती है, आप शायद इसे अपनी आवश्यकताओं के अनुकूल बना सकते हैं।


फ़ील्ड। टाइप = "स्ट्रिंग" के दौरान, हमें AddField_management पर "टेक्स्ट" पास करना होगा। मैंने इसकी जाँच की है।
ईएमआई

क्या आपको यकीन है? यह मेरे लिए 10.0 SP5 पर काम करता है।
blah238

यह मुझे त्रुटि देता है: arcgisscripting.ExecuteError: निष्पादित करने में विफल। पैरामीटर मान्य नहीं हैं। ERROR 000800: मान TEXT का सदस्य नहीं है | FLOAT | DOUBLE | SHORT | लोंग | DATE | BLOB | रिस्ते | GUID। निष्पादित करने में विफल (AddField)।
ईएमआई

आप किस संस्करण / एसपी में हैं?
blah238

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