Bulk-Aliasnamen für Feature-Classes und Felder mithilfe von ArcPy ändern?


14

Ich habe mehr als hundert FCs mit jeweils 10 oder 20 Attributen, um die Aliase zweimal oder mehrmals im Jahr hinzuzufügen oder zu ändern. Unnötig zu erwähnen, dass ich mich hier nicht durchgrunzen werde. Wie kann ich diesen Prozess automatisieren?

Python-Lösung bevorzugt, verwendet aber alles, was funktioniert.

Ich habe Zugriff auf Arcgis 9.3.1 und 10 (ArcInfo-Lizenzstufe).


1
Ich habe das Entwicklerbeispiel [Feature-Class-Schema bearbeiten] [1] v9.3 für ArcCatalog gefunden. Der Alias ​​für die ausgewählten Feature-Classes wird in den im Skript fest codierten Wert geändert. Also kein Batch-Prozess, sondern in diese Richtung. [1]: resources.esri.com/help/9.3/ArcGISDesktop/com/samples/…
matt wilkie

Verwandte (ein Baustein der Stiftung): gis.stackexchange.com/questions/80/…
Matt Wilkie

Antworten:


7

Ab Version 10.1 kann AlterAliasName () verwendet werden, um Tabellen neu zu aliasen :

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

Ab Version 10.3 kann Alter Field verwendet werden, um Felder neu zu aliasen:

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

8

Mit Hilfe von Mark Cederholm habe ich eine funktionierende Lösung mit Python und ArcObjects . Es ist rau an den Rändern, aber es hat die Arbeit erledigt. Nachdem Sie das Rezept auf dieser Seite befolgt haben, erstellen Sie ein neues Skript, das die GetLibPath, NewObj, CType, OpenFeatureClassFunktionen von verwendet snippets.py. Erstellen Sie auch die Umbenennungssuchtabellen im CSV-Format:

Feld-zu-Feld-Alias-Suche (att_code-name_lookup.csv):

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

Feature-Class zur FC-Alias-Suche (fc_code-name_lookup.csv):

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

und das Drehbuch:

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()

Dies ist so nah an dem, was ich brauche (Aktualisierung der Feld-Aliase). Wie sieht der OpenFeatureClass-Teil von Snippets aus? Marks Code hat dieses Teil nicht. Danke

Hallo Jasperoid, Sie können eine bestimmte Antwort kommentieren, indem Sie auf den Link "Kommentar hinzufügen" klicken. Ich habe Ihre Antwort auf diese Antwort migriert.
scw

@Jasperiod, ich habe die meisten Schnipsel von Mark in ein Modul verschoben, das ich Parco nenne. Dort befindet sich auch OpenFeatureClass. Ich erinnere mich nicht, es selbst erschaffen zu haben, aber vielleicht habe ich es getan. Wie auch immer, dort steht es in der Linie 125 .
Matt Wilkie

6

Dieser Code funktioniert für mich in 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;
}

danke Kirk, du hast keine Ahnung, wie lange ich versucht habe, das herauszufinden. Ich vermute, das ist C #?
Matt Wilkie

1
Ja C#. Hat zwar nicht mit featuredatasets getestet, sollte aber funktionieren.
Kirk Kuykendall

3

Eine andere Lösung freundlicher Genehmigung von Rob Clark :

Sie können featureclass_to_featureclass mit der Feldzuordnung verwenden . Ja, es wird eine andere Feature-Class erstellt, aber Sie können einfach einen Ausgabebereich zum Kopieren von Daten und Ändern von Aliasnamen verwenden, während dies ausgeführt wird.

FC-zu-FC-Dialog mit geöffneten Eigenschaften (aus dem Kontextmenü)

In Python ist die Syntax für den field_mapPart schwierig. Gehen Sie ihn also einmal interaktiv durch, um die Parameter richtig einzustellen, und lassen Sie ihn laufen. Gehen Sie dann zum Ergebnisfenster , klicken Sie erneut und kopieren Sie das Python-Snippet . Hier ist ein Snippet, das zu etwas zusammengefasst wurde, das sich leichter erweitern und wiederverwenden lässt.

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

Diese Lösung ist für Benutzer gedacht, die SQL Server als Geodatabase verwenden. Sie können es manuell mit einem SQL-Aktualisierungsbefehl ändern. Der Name aller Features wird in der Tabelle [sde]. [GDB_OBJECTCLASSES] gespeichert. Der Aliasname wird einfach festgelegt, wenn Sie den Wert der Aliasspalte ändern.

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

BEARBEITEN: Diese Methode ist eine schnelle Methode zum Ändern des Aliasnamens. Die Verwendung von IClassSchemaEdit ist jedoch besser, da bei der SQL-Aktualisierungsmethode der Aliasname erst verwendet werden kann, wenn der Funktionsarbeitsbereich zurückgesetzt wurde.

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
So offensichtlich, dass ich darüber nachdenke! Der gleiche Ansatz sollte auch mit einer Personal GDB (Access .mdb) oder einer der RDBMS-Speicheroptionen möglich sein.
Matt Wilkie

Um es in anderen RDBMS zu finden, ist es meiner Meinung nach besser, ein Backup von Ihrem RDBMS zu kopieren und dann den Aliasnamen von ArcCatalog zu ändern. Vergleichen Sie dann die aktuelle Datenbank mit dem Backup. Sie können die Änderungen sehen und herausfinden, wo der Aliasname gespeichert ist.
Mehdi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.