আর্কপাই ব্যবহার করে বাল্কে ফিচার ক্লাস এবং ফিল্ড এ্যালিয়াস পরিবর্তন করা হচ্ছে?


14

আমার একশ'রও বেশি এফসি রয়েছে, প্রতিটিতে 10 বা 20 টি বৈশিষ্ট্য সহ বছরে দু'বার বা তার বেশি বারের জন্য এলিয়াস যুক্ত বা পরিবর্তন করতে হবে। বলাই বাহুল্য, এটি এমন কিছু নয় যা আমি নিজের পথটি ঘটাচ্ছি। আমি কীভাবে এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারি?

পাইথন সলিউশনটি পছন্দসই তবে কার্যকর যে কোনও কিছু ব্যবহার করবে।

আমার কাছে আরকিস 9.3.1 এবং 10 (আর্কইনফো লাইসেন্স স্তর) অ্যাক্সেস রয়েছে।


1
আমি [আর্কিটেলোগ্লাজের বৈশিষ্ট্য শ্রেণীর স্কিমা সম্পাদনা] [1] v9.3 বিকাশকারী নমুনা পেয়েছি। এটি স্ক্রিপ্টে হার্ড কোডেড মানকে নির্বাচিত বৈশিষ্ট্য শ্রেণীর জন্য উপকরণ পরিবর্তন করে। সুতরাং একটি ব্যাচ প্রক্রিয়া নয় তবে সে দিকে এগিয়ে গেছে। [1]: সম্পদ.
esri.com/help/9.3/ArcGISDesktop/com/sample/…

সম্পর্কিত (একটি ফাউন্ডেশন বিল্ডিং ব্লক): gis.stackexchange.com/questions/80/…
ম্যাট উইলকি

উত্তর:


7

সংস্করণ 10.1 হিসাবে অল্টারআলিয়াসনাম () ব্যবহার করতে পারেন টেবিলগুলি পুনরায় ব্যবহারের জন্য:

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

এটি আমার যা প্রয়োজন তার খুব কাছাকাছি (ফিল্ডের নামটি আপডেট করা)। স্নিপেটগুলির ওপেনফিজারক্লাস অংশটি দেখতে কেমন? মার্কের কোডে সেই টুকরা নেই। ধন্যবাদ

হাই জেস্পেরয়েড: আপনি 'মন্তব্য যুক্ত করুন' লিঙ্কটি ক্লিক করে একটি নির্দিষ্ট উত্তরে মন্তব্য করতে পারেন, আমি এই উত্তরটিতে আপনার প্রতিক্রিয়া স্থানান্তরিত করেছি।
24:25

@Jasperiod, আমি একটি মডিউল আমি কলে পরিণত মার্ক এর স্নিপেট অধিকাংশ সরানো Parco , যা যেখানে OpenFeatureClass বলে। আমি নিজে এটি তৈরির কথা মনে নেই, তবে সম্ভবত আমি এটি করেছি। যাইহোক, সেখানে এটি 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;
}

ধন্যবাদ কার্ক, আপনি কতক্ষণ বুঝতে পারছেন না আমি এটি বের করার চেষ্টা করছিলাম। আমি অনুমান করছি এটি সি #?
ম্যাট উইলকি

1
হ্যাঁ, সি # যদিও বৈশিষ্ট্যযুক্তগুলি দিয়ে পরীক্ষা করেনি, তবে কাজ করা উচিত।
কर्क কুইকেনডাল

3

রব ক্লার্কের সৌজন্যে আরেকটি সমাধান :

আপনি ফিল্ড ম্যাপিংয়ের সাথে ফিচারক্লাস_ থেকে_ফ্যাটার ক্লাস ব্যবহার করতে পারেন । হ্যাঁ এটি অন্য বৈশিষ্ট্য বর্গ তৈরি করে তবে ডেটা অনুলিপি করার জন্য এবং আধ্যাত্মিক পরিবর্তনগুলি সম্পাদন করার সময় আপনার কাছে একটি আউটপুট অঞ্চল থাকতে পারে।

বৈশিষ্ট্যগুলি সহ এফসি থেকে এফসি ডায়ালগ খোলা (প্রসঙ্গ মেনু থেকে)

অজগর অংশের বাক্য গঠনটি 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

এই সমাধানটি জিওডাটাবেস হিসাবে এসকিউএল সার্ভার ব্যবহার করার জন্য। আপনি এসকিউএল আপডেট কমান্ড দ্বারা ম্যানুয়ালি এটিকে পরিবর্তন করতে পারেন। সমস্ত বৈশিষ্ট্যের নাম [sde] এ সংরক্ষণ করুন [[GDB_OBJECTCLASSES] টেবিল। যদি আপনি উপনামের কলাম মান পরিবর্তন করেন তবে কেবলমাত্র নামটির নাম সেট করুন।

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

সম্পাদনা: এই পদ্ধতিটি উপনামের নাম পরিবর্তন করার জন্য দ্রুত পদ্ধতি। তবে আইসিএলসচেমাএডিট ব্যবহার করা ভাল কারণ স্কেল আপডেট পদ্ধতিতে আপনি বৈশিষ্ট্য কর্মক্ষেত্রটি পুনরায় সেট না করা পর্যন্ত আপনার নাম ব্যবহার করতে পারবেন না।

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
আমি এখন এটি সম্পর্কে স্পষ্ট যে এত স্পষ্ট! একই পদ্ধতিটি ব্যক্তিগত জিডিবি (অ্যাক্সেস। এমডিবি) বা আরডিবিএমএস স্টোরেজ বিকল্পগুলির মধ্যেও ব্যবহার করা সম্ভব।
ম্যাট উইলকি

অন্যান্য আরডিবিএমএসে এটি সন্ধানের জন্য আমি মনে করি আপনার আরডিবিএমএস থেকে একটি ব্যাকআপ অনুলিপি করা এবং তারপরে আরকেরকিগ্ল্যাজ দ্বারা উপনামের নামটি পরিবর্তন করা ভাল তবে বর্তমানের ডাটাবেসটিকে ব্যাকআপের সাথে তুলনা করে আপনি পরিবর্তনগুলি দেখতে পাবেন এবং কোথায় উপনাম সংরক্ষণ করবেন তা খুঁজে পেতে পারেন।
মেহদী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.