ArcPy का उपयोग करके फीचर क्लास और फ़ील्ड उपनामों को थोक में बदलना?


14

मेरे पास एक सौ से अधिक एफसी हैं, प्रत्येक में साल में दो या दो से अधिक बार उपनाम जोड़ने या बदलने के लिए 10 या 20 विशेषताओं के साथ है। कहने की जरूरत नहीं है, यह कोई ऐसी चीज नहीं है जिसके जरिए मैं अपनी राह पकड़ता हूं। मैं इस प्रक्रिया को कैसे स्वचालित कर सकता हूं?

पाइथन सॉल्यूशन को प्राथमिकता दी जाती है, लेकिन जो भी काम करता है उसका उपयोग करेगा।

मेरे पास Arcgis 9.3.1 और 10 (ArcInfo लाइसेंस स्तर) तक पहुंच है।


1
मुझे आर्किटिक्स के लिए [एडिट फ़ीचर क्लास स्कीमा] [1] v9.3 डेवलपर नमूना मिला। यह स्क्रिप्ट में चयनित फ़ीचर कक्षाओं के लिए उपनाम को हार्ड कोड में बदल देता है। इसलिए बैच प्रक्रिया नहीं बल्कि उस दिशा में आगे बढ़े। [१]: resource.esri.com/help/9.3/ArcGISDesktop/com/samples/…
मैट विल्की

संबंधित (एक नींव निर्माण खंड): gis.stackexchange.com/questions/80/…
मैट

जवाबों:


7

संस्करण के रूप में 10.1 AlterAliasName () का उपयोग फिर से अन्य तालिकाओं में किया जा सकता है:

table = r"C:\path\to\connection.sde\OWNER.TABLE"
arcpy.AlterAliasName(table, "table_alias")

संस्करण के रूप में 10.3 ऑल्टर फ़ील्ड को फिर से अन्य क्षेत्रों में उपयोग किया जा सकता है:

table = r"C:\path\to\connection.sde\OWNER.TABLE"
arcpy.AlterField_management(table, "FIELD_NAME", new_field_alias="field_alias")

8

मार्क सेडरहोम की मदद से मेरे पास अजगर और आर्कोबिज के उपयोग से काम करने वाला समाधान है । यह किनारों के आसपास मोटा है, लेकिन इसे काम मिल गया है। उस पृष्ठ पर नुस्खा का पालन करने के बाद, एक नई स्क्रिप्ट बनाएं जो GetLibPath, NewObj, CType, OpenFeatureClassकार्यों का उपयोग करता है snippets.py। .Csv प्रारूप में नाम बदलने की तालिका भी बनाएं:

फ़ील्ड से लेकर फ़ील्ड एलियास लुकअप (att_code-name_lookup.csv):

Attrib_Name,Alias_Name
CODE,Specification Code
VALDATE,Validity Date
...

एफसी एलियास लुकअप के लिए फ़ीचर क्लास (fc_code-name_lookup.csv):

"FC_Name","AliasName"
"BS_1250009_0","Navigational Aid"
"BS_1370009_2","Residential Area"
...

और स्क्रिप्ट:

import sys
sys.path.append('k:/code')
from snippets import GetLibPath, NewObj, CType, OpenFeatureClass
sWorkingDir = "k:/code/"
sFileGDB = sWorkingDir + "blank_canvec.gdb"
sResourceDir = "k:/code/"
sFCAliasFile = sResourceDir + "fc_code-name_lookup.csv"
sAttAliasFile = sResourceDir + "att_code-name_lookup.csv"
sProduct = "ArcEditor"

def BuildFieldAliasLookup():
    lookup = {}
    f = open(sAttAliasFile, "r")
    bFirst = True
    for line in f:
        # Skip first line
        if bFirst:
            bFirst = False
            continue
        sTokens = line.replace('"','').split(',')
        sFieldName = sTokens[0]
        sAlias = sTokens[1]
        lookup[sFieldName] = sAlias
    return lookup

def AlterAlias():
    # Initialize
    from comtypes.client import GetModule
    import arcgisscripting
    sLibPath = GetLibPath()
    GetModule(sLibPath + "esriGeoDatabase.olb")
    GetModule(sLibPath + "esriDataSourcesGDB.olb")
    import comtypes.gen.esriGeoDatabase as esriGeoDatabase
    gp = arcgisscripting.create(9.3)

    try:
        gp.setproduct(sProduct)
    except:
        gp.AddMessage(gp.GetMessages(2))

    # Build field alias lookup table
    AttrLookup = BuildFieldAliasLookup()
    # Open alias file and loop through lines
    f = open(sFCAliasFile, "r")
    bFirst = True
    for line in f:
        # Skip first line
        if bFirst:
            bFirst = False
            continue
        sTokens = line.replace('"','').split(',')
        sFCName = sTokens[0]
        sAlias = sTokens[1]
        print "Processing: ", sFCName
        # Open feature class
        try:
            pFC = OpenFeatureClass(sFCName)
        except:
            print "Could not open ", sFCName
            continue
        # Alter feature class alias
        try:
            pSE = CType(pFC, esriGeoDatabase.IClassSchemaEdit)
            pSE.AlterAliasName(sAlias)
        except:
            print "Error altering class alias"
            continue
        # Alter field aliases
        try:
            for sKey in AttrLookup.keys():
                i = pFC.FindField(sKey)
                if i == -1:
                    continue
                sAlias = AttrLookup[sKey]
                pSE.AlterFieldAliasName(sKey, sAlias)
        except:
            print "Error altering field aliases"
    print "Done."

print 'Field <--> Alias lookup table is:', BuildFieldAliasLookup()
print AlterAlias()

यह इतना है कि मुझे क्या जरूरत है (क्षेत्र उपनामों को अपडेट करने के लिए)। स्निपेट्स का OpenFeatureClass हिस्सा कैसा दिखता है? मार्क के कोड में वह टुकड़ा नहीं है। धन्यवाद

हाय जैस्परॉइड: आप एक विशिष्ट उत्तर पर 'टिप्पणी जोड़ें' लिंक पर क्लिक करके टिप्पणी कर सकते हैं, मैंने इस उत्तर पर आपकी प्रतिक्रिया को माइग्रेट कर दिया है।
scw

@ जैस्परॉइड, मैंने मार्क के अधिकांश स्निपेट्स को एक मॉड्यूल में स्थानांतरित किया , जिसे मैं पार्को कहता हूं , जहां ओपनफिएटुरैलास भी है। मुझे खुद इसे बनाने की याद नहीं है, लेकिन शायद मैंने किया। वैसे भी, यह 125 रेखा पर है ।
मैट विल्की

6

यह कोड मेरे लिए 9.3.1 में काम करता है ...

public static void TestAlterAlias(IApplication app)
{
    // make a dictionary of old/new names
    Dictionary<string, string> nameDict = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
    nameDict.Add("qsectionalias", "qsectionalias2");
    nameDict.Add("sursysalias", "sursysalias2");
    string[] directories =  System.IO.Directory.GetDirectories(@"D:\Projects\EmpireOil\data",@"*.gdb",
        System.IO.SearchOption.TopDirectoryOnly);
    foreach(string dir in directories)
    {
        List<IName> fcnames = GetFCNames(dir);
        foreach (IName fcName in fcnames)
        {
            ChangeFieldAliases(fcName, nameDict);
        }
    }
}

public static void ChangeFieldAliases(IName fcName, Dictionary<string, string> aliasDict)
{
    IFeatureClass fc = (IFeatureClass)fcName.Open();
    IClassSchemaEdit3 cse = (IClassSchemaEdit3)fc;
    ((ISchemaLock)fc).ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
    SortedList<string, string> changeList = new SortedList<string, string>();
    for (int i = 0; i < fc.Fields.FieldCount; i++)
    {
        string fldName = fc.Fields.get_Field(i).Name;
        string alias = fc.Fields.get_Field(i).AliasName;
        if (aliasDict.ContainsKey(alias))
        {
            changeList.Add(fldName, aliasDict[alias]);
            // set it blank for now, to avoid problems if two fields have same aliasname.
            cse.AlterFieldAliasName(fldName, "");
        }
    }

    // change the alias
    foreach (KeyValuePair<string, string> kvp in changeList)
        cse.AlterFieldAliasName(kvp.Key, kvp.Value);
    ((ISchemaLock)fc).ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}

public static List<IName> GetFCNames(string wsPath)
{
    List<IName> names = new List<IName>();
    IWorkspaceFactory wsf = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
    IWorkspace ws = wsf.OpenFromFile(wsPath, 0);
    IEnumDatasetName enumName = ws.get_DatasetNames(esriDatasetType.esriDTAny);
    enumName.Reset();
    IDatasetName dsName = null;
    while ((dsName = enumName.Next()) != null)
    {
        if(dsName is IFeatureClassName)
            names.Add((IName)dsName);
        else if(dsName is IFeatureDatasetName)
        {
            IEnumDatasetName enumName2 = dsName.SubsetNames;
            enumName2.Reset();
            IDatasetName dsName2;
            while((dsName2=enumName2.Next())!= null)
            {
                if(dsName2 is IFeatureClassName)
                    names.Add((IName)dsName2);
            }
        }
    }
    return names;
}

धन्यवाद किर्क, आपको पता नहीं है कि मैं कब तक यह जानने की कोशिश कर रहा हूं। मैं अनुमान लगा रहा हूं कि यह C # है?
मैट विल्की जुएल

1
हां, सी #। विशेषाधिकारों के साथ परीक्षण नहीं किया, लेकिन काम करना चाहिए।
किर्क कुएकेन्डल

3

रॉब क्लार्क का एक और समाधान शिष्टाचार :

आप फ़ील्ड मैपिंग के साथ featureclass_to_featureclass का उपयोग कर सकते हैं । हाँ, यह एक और फीचर क्लास बनाता है, लेकिन आपके पास डेटा को कॉपी करने और इसे करने के दौरान उपनाम बदलने के लिए एक आउटपुट क्षेत्र हो सकता है।

एफसी से एफसी संवाद गुणों के साथ खुला (संदर्भ मेनू से)

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

inFC = 'e:/Canvec/fix.gdb/HD_1480009_2'
outFC = 'HD_with_aliases'
out_wspace = 'e:/canvec/fix.gdb'
where_clause = '#'      # use default
config_keyword = '#'    #    "

# build field map
fmap_out_att = 'CODE /\Specification code/\ '  # field and alias name
fmap_properties = 'true true false 4 Long 0 0 ,First,#,'  # field properties
fmap_in_att = 'e:/Canvec/fix.gdb/HD_1480009_2,CODE,-1,-1'  # input FC and field

# construct the complete field map
field_map = fmap_out_att + fmap_properties + fmap_in_att
   # results in:
   # "CODE /\Specification code/\ true true false 4 Long 0 0 ,First,#,e:/Canvec/fix.gdb/HD_1480009_2,CODE,-1,-1"


arcpy.FeatureClassToFeatureClass_conversion(inFC, out_wspace, outFC, 
        where_clause, field_map, config_keyword)

# the template command copied from Results window, used for building above
# arcpy.FeatureClassToFeatureClass_conversion("e:/Canvec/fix.gdb/HD_1480009_2","e:/canvec/fix.gdb","HD_with_aliases3","#","CODE /\Specification code/\ true true false 4 Long 0 0 ,First,#,e:/Canvec/fix.gdb/HD_1480009_2,CODE,-1,-1","#")

2

यह समाधान उपयोगकर्ता के लिए है जो SQL सर्वर को जियोडैटेबेस के रूप में उपयोग करते हैं। आप इसे SQL अपडेट कमांड द्वारा मैन्युअल रूप से बदल सकते हैं। सभी फ़ीचर का नाम [sde] [GDB_OBJECTCLASSES] तालिका में सहेजें। यदि आप उपनाम स्तंभ मान को बदलते हैं तो बस उपनाम नाम सेट करें।

UPDATE [sde].[sde].[GDB_OBJECTCLASSES] 
SET AliasName = 'an alias name' 
WHERE Name='your feature class name'

EDIT: यह विधि उपनाम नाम बदलने के लिए तेज़ विधि है। लेकिन IClassSchemaEdit का उपयोग करना बेहतर है क्योंकि sql अपडेट विधि में आप उपनाम नाम का उपयोग तब तक नहीं कर सकते जब तक कि फ़ीचर कार्यस्थान रीसेट न कर दें।

Public Sub SetAliasName(FeatureClass As IFeatureClass, AliasName As String)
        Dim abjTable As ITable = FeatureClass
        Dim objClass As IObjectClass = abjTable
        Dim edit As IClassSchemaEdit = objClass
        edit.AlterAliasName(AliasName)
End Sub

1
अब स्पष्ट है कि मैं इसके बारे में सोचता हूं! एक ही दृष्टिकोण व्यक्तिगत GDB (Access .mdb) या RDBMS भंडारण विकल्पों में से किसी एक का उपयोग करके संभव होना चाहिए।
मैट विल्की

इसे अन्य RDBMS में खोजने के लिए मुझे लगता है कि अपने RDBMS से बैकअप कॉपी करना बेहतर है और फिर ArcCatalog द्वारा उपनाम नाम बदल दें फिर बैकअप के साथ वर्तमान डेटाबेस की तुलना करें। आप परिवर्तनों को देख सकते हैं और पता लगा सकते हैं कि कहां अलियासैम बचा है।
मेहदी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.