সক্রিয় ডোমেন সহ বৈশিষ্ট্য শ্রেণি তালিকাভুক্ত?


19

অ্যাট্রিবিউট ডোমেন সংজ্ঞায়িত করে আমার কাছে এসরি ফাইল জিওডাটাবেস রয়েছে । আমার কয়েকটি অ্যাট্রিবিউট ডোমেন মুছতে হবে তবে "ডোমেনটি একটি অ্যাট্রিবিউট রুল দ্বারা ব্যবহৃত হয়।" । আমি কীভাবে আবিষ্কার করব যে কোন বৈশিষ্ট্য শ্রেণি (এস) ডোমেনগুলি ব্যবহার করছে?

Executing: DeleteDomain R:\v5\YT_Canvec.gdb Permanency
Start Time: Thu May 19 11:01:02 2011
ERROR 999999: Error executing function.
The domain is used by an attribute rule.
Failed to execute (DeleteDomain).
Failed at Thu May 19 11:01:02 2011 (Elapsed Time: 0.00 seconds)

জিওডাটাবেজে শতাধিক বৈশিষ্ট্যযুক্ত ক্লাস রয়েছে, ইন্টারেক্টিভভাবে প্রত্যেকের জন্য এফসি ক্ষেত্রের বৈশিষ্ট্যগুলি অনুসন্ধান করা একটি অ-স্টার্টার। ব্যক্তিগত জিডিবিতে রূপান্তর করতে এমএস-অ্যাক্সেস (যেভাবেই একটি ছদ্মবেশী পদ্ধতি) দিয়ে পিছনের দরজায় যেতে জিডিবিটি অনেক বড়।


(২০১১-মে -26): এটির বাক্যটির আরেকটি উপায় হ'ল "কোন বৈশিষ্ট্য শ্রেণিটি ডোমেন এক্স ব্যবহার করছে?"


আপনি কি সাব-টাইপড ডোমেন ব্যবহার করছেন?
কर्क কুইকেনডাল

@ কির্ক, হ্যাঁ একটি সাব টাইপ রয়েছে, তবে যে ডোমেনগুলি আমি মুছে ফেলার চেষ্টা করছি
সেগুলি সাব টাইপটি

1
সেক্ষেত্রে আমি মনে করি ব্রায়ানের কোড কাজ করবে।
কर्क কুইকেনডাল

1
@ কিরক, সংশোধন: আমি মনে করি না যে আমি সাব টাইপ + ডোমেন ব্যবহার করছি, তবে প্রযুক্তি সংক্রান্ত সহায়তা সংক্রান্ত কেসটি খোলাখুলি এবং খোলার পরে দেখা যাচ্ছে যে আমি আসলে সর্বোপরি একটি ব্যবহার করছি। নির্দিষ্ট অবশিষ্ট কাপল্রিট শনাক্ত করার জন্য এটি সত্যিকারের ক্লিক-ফেস্ট ছিল। আপনার সি # পদ্ধতি অনুসরণে আমার আরও বেশি সময় বিনিয়োগ করা উচিত ছিল!
ম্যাট উইলকি 26'11

উত্তর:


3

সাব টাইপ সহ বৈশিষ্ট্য ক্লাস পরিচালনা করার প্রশ্নের উত্তর দিতে, আরকি (10.1+) দিয়ে এটি সম্ভব।

arcpy.env.workspace = your_gdb

for FC in arcpy.ListFeatureClasses():
    for stcode, stdict in list(arcpy.da.ListSubtypes(FC).items()):
        for stkey in list(stdict.keys()):
            if stkey == 'FieldValues':
                for field, fieldvals in list(stdict[stkey].items()):
                    if fieldvals[1] is not None:
                        print(
                            "{},{},{},{}".format(FC,
                                                 'None' if stcode == 0 else stdict['Name'],
                                                 field,
                                                 fieldvals[1].name))

সাব টাইপ কোড না থাকলে সাব টাইপ কোড, স্টকোড শূন্য হবে, সুতরাং কোডটি 'কিছুই নয়' প্রিন্ট করে।

উপশাখাকে অভিধান এটা আরো, তাই এটি কোডে পরিদর্শন করেছে।


এটির কাছে আমার গৃহীত উত্তর পরিবর্তন করা। এটি সংক্ষিপ্ত এবং সরাসরি Github.com/envygeo/arcplus/blob/master/ArcToolbox/Scriptts/… এ আপনার কোডটির আমার সংস্করণ । ধন্যবাদ!
ম্যাট উইলকি

21

পাইথনের জিওডাটাবেজে ফিচার ক্লাস তালিকাভুক্ত করার জন্য, তালিকার প্রতিটি বৈশিষ্ট্য শ্রেণীর মধ্য দিয়ে লুপিং, প্রতিটি বৈশিষ্ট্য শ্রেণিতে ক্ষেত্রের তালিকা তৈরি এবং প্রতিটি ক্ষেত্রের ডোমেন দেখানোর পদ্ধতি রয়েছে।

import arcpy

#Set workspace environment to geodatabase
arcpy.env.workspace = your_gdb

#Get list of feature classes in geodatabase
FCs = arcpy.ListFeatureClasses()

#Loop through feature classes in list
for FC in FCs:

    #List fields in feature class
    fields = arcpy.ListFields(FC)

    #Loop through fields
    for field in fields:

        #Check if field has domain
        if field.domain != "":

            #Print feature class, field, domain name
            print FC, field.name, field.domain

উপরের কোডটি আর্কজিআইএস 10 এ কাজ করা উচিত এবং এটি পাইথন ইন্টারপ্রেটার উইন্ডোতে একটি তালিকা মুদ্রণ করবে। এরপরে ফলাফলটি আরও সহজে পর্যালোচনা করতে আপনি কোনও লিখিত সম্পাদক বা এক্সেলের তালিকায় কপি এবং পেস্ট করতে পারেন।


এই হ্যান্ডেল কি সাব টাইপড ডোমেনগুলিও হ্যান্ডেল করবে?
কर्क কুইকেনডাল

আমি নিশ্চিত না যে এটি উপ-টাইপ বা উপ-টাইপযুক্ত ডোমেনগুলি পরিচালনা করবে কিনা। আমি আগে কখনও সাব টাইপ ব্যবহার করি নি। কোনও নির্দিষ্ট ক্ষেত্রে যদি কোনও ডোমেইন বরাদ্দ থাকে তবে ডোমেনটির নাম মুদ্রিত হবে।
ব্রায়ান

সুন্দর, ধন্যবাদ ব্রায়ান প্রথমদিকে এটি আমার পক্ষে কার্যকর হয়নি তবে অবশেষে আমার মনে পড়ে যে তালিকাভুক্ত কিছু অতিরিক্ত সাহায্য ছাড়াই ফিচারড্যাটাসেটগুলিতে পুনরাবৃত্তি করা হয় না ( gis.stackexchange.com/questions/5893/… )। এখন সব ভাল! :)
ম্যাট উইলকি

@ কির্ক, না এটি ডোমেন ব্যবহার করে সাব টাইপগুলি দেখতে পাচ্ছে না।
ম্যাট উইলকি

সমস্ত সাব-টাইপ এবং তার সাথে সম্পর্কিত ডোমেনগুলি ব্যবহার করার জন্য রিসোর্সস.আরর্গগি.ইন / হেল্প / মেইন ১১.১ / ইন্ডেক্স এইচটিএমএল#//… উদাহরণ অনুসরণ করুন ।
মাইকেল সিলিমসন

8

যেহেতু আমি মনে করি না পাইথন সাব টাইপগুলি পরিচালনা করে, তাই এই সি # কোডটি পোস্ট করা উচিত। আমি এষরির নমুনা জল / বর্জ্য জল জিওডবি দিয়ে এটি পরীক্ষা করেছি এবং নিম্নলিখিত অব্যবহৃত ডোমেনগুলি পেয়েছি:

HistoryType is not used
PLSSFirstDivisionType is not used
PLSSDirection is not used
PLSSPrincipalMeridian is not used
ParcelType is not used
PLSSSpecialSurveyType is not used
CartoLineType is not used
PLSSSecondDivisionType is not used

প্রায়শই ডিবিএর বিরক্ত হয়ে যায় যে ডোমেনগুলি - যা মূলত সন্ধানের টেবিলগুলি হয় - এসকিউএল এর মাধ্যমে অ্যাক্সেস করা যায় না।

এই কোডটি আরক্যাপ থেকে পরীক্ষা করা হয়েছে ( ম্যাট-এর মন্তব্যে আপডেট হয়েছে ):

protected override void OnClick()
{
    string fgdbPath = @"C:\projects\NetTools\InfrastructureEditingTemplate\MapsandGeodatabase\LocalGovernment.gdb";
    var dict = SummarizeDomains(fgdbPath);
    ListDomains(dict);
    // list what featureclasses use a particular domain ...
    string domName = "State_Bnd_Rules";
    if (dict.ContainsKey(domName))
    {
        if (dict[domName].Count > 0)
        {
            Debug.Print("{0} is used by these featureclasses: ", domName);
            foreach (string fcfldName in dict[domName])
            {
                Debug.Print("\t{0}", fcfldName);
            }
        }
        else
            Debug.Print("{0} is not used by any featureclasses", domName);
    }
    else
    {
        Debug.Print("Domain name not found in geodb: {0}", domName);
    }
}

private void ListDomains(Dictionary<string,List<string>> dict)
{
    foreach (KeyValuePair<string, List<string>> kvp in dict)
    {
        Debug.Print("Domain {0}",kvp.Key);
        if (kvp.Value.Count > 0)
        {
            foreach (string fcfldName in kvp.Value)
            {
                Debug.Print("\t{0}", fcfldName);
            }
        }
        else
            Debug.Print("\tUNUSED DOMAIN!");
    }
}

private Dictionary<string, List<string>> SummarizeDomains(string fgdPath)
{
    var ws = Open(fgdPath);
    var dict = InitDict(ws);

    var enumDs1 = ws.get_Datasets(esriDatasetType.esriDTAny);
    IDataset ds;
    while ((ds = enumDs1.Next()) != null)
    {
        Debug.Print("processing {0}", ds.Name);
        if (ds is IObjectClass)
            LoadDomains((IObjectClass)ds, dict);
        else if (ds is IFeatureDataset)
        {
            var enumDs2 = ds.Subsets;
            enumDs2.Reset();
            IDataset ds2;
            while ((ds2 = enumDs2.Next()) != null)
            {
                if (ds2 is IObjectClass)
                    LoadDomains((IObjectClass)ds2, dict);
            }
        }
    }
    return dict;
}
private void LoadDomains(IObjectClass oc, Dictionary<string, List<string>> dict)
{
    if (oc is ISubtypes && ((ISubtypes)oc).HasSubtype)
        LoadSubtypeDomains(oc, dict);
    else
    {
        for (int i = 0; i < oc.Fields.FieldCount; i++)
        {
            var fld = oc.Fields.get_Field(i);
            if (fld.Domain == null)
                continue;
            if (dict.ContainsKey(fld.Domain.Name))
                dict[fld.Domain.Name].Add(String.Format("{0}.{1}",((IDataset)oc).Name,fld.Name));
            else
                throw new Exception("domain not found: " + fld.Domain.Name);
        }
    }
}
private void LoadSubtypeDomains(IObjectClass oc, Dictionary<string, List<string>> dict)
{
    ISubtypes subTypes = oc as ISubtypes;
    var enumSubtypes = subTypes.Subtypes;
    enumSubtypes.Reset();
    int code;
    string stName;
    while ((stName = enumSubtypes.Next(out code)) != null)
    {
        for (int i = 0; i < oc.Fields.FieldCount; i++)
        {
            string fldName = oc.Fields.get_Field(i).Name;
            var domain = subTypes.get_Domain(code, fldName);
            if (domain != null)
            {
                if (dict.ContainsKey(domain.Name))
                    dict[domain.Name].Add(String.Format("{0}.{1}.{2}",stName,((IDataset)oc).Name,fldName));
                else
                    throw new Exception("domain not found: " + domain.Name);
            }
        }
    }
}
private Dictionary<string, List<string>> InitDict(IWorkspace ws)
{
    var dict = new Dictionary<string, List<string>>(StringComparer.InvariantCultureIgnoreCase);
    var enumDomain = ((IWorkspaceDomains)ws).Domains;
    enumDomain.Reset();
    IDomain d = null;
    while ((d = enumDomain.Next()) != null)
        dict.Add(d.Name, new List<string>());
    return dict;
}

private IWorkspace Open(string fgdbPath)
{
    Type t = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
    var wsf = Activator.CreateInstance(t) as IWorkspaceFactory;
    return wsf.OpenFromFile(fgdbPath, 0);
}

অব্যবহৃত ডোমেন তালিকাবদ্ধ করার সময় দরকারী, সমস্যাটি সমাধান করার ক্ষেত্রে এটি বিপরীত। আমি আসলে "কোন এফসি ডোমেন এক্স ব্যবহার করছে?" (তাই আমি লিঙ্কটি সরান পারে, এবং করা ডোমেইন একটি অব্যবহৃত ডোমেন)। ((আমি এখনও কোডটি চেষ্টা করি নি, আমি কেবল ফাংশনটির নামে যাচ্ছি))
ম্যাট উইলকি

@ ম্যাট ওহ, হ্যাঁ, এটা বোঝা যায়। আমি কীভাবে এটি করব তা দেখানোর জন্য কোডটি পরিবর্তন করেছি।
কર્ક কুইকেনডাল

আহ, সম্ভবত এটি একটি পূর্ণ প্রশ্ন হওয়া উচিত, তবে, আমি এই কোডটি কোথায় রাখি? আমি ভিবিএ সম্পাদক ( সরঞ্জাম-> ম্যাক্রোস>> ভিজ্যুয়াল বেসিক সম্পাদক ) এর v10 সমতুল্য সনাক্ত করতে পারি না ।
ম্যাট উইলকি

আপনাকে ভিজ্যুয়াল স্টুডিও এক্সপ্রেস (ফ্রি) বা আরও বেশি এবং আরকজিআইএস এসডিকে ইনস্টল করতে হবে । একবার এটি হয়ে গেলে, কমান্ড বোতাম তৈরি করার জন্য আপনার এই ওয়াকথ্রু অনুসরণ করতে সক্ষম হওয়া উচিত , তারপরে ক্লিক ইভেন্টে আমার কোডটি অনুলিপি করুন এবং আটকান। আপনাকে প্রকল্পে উপযুক্ত রেফারেন্স যুক্ত করতে হবে।
কर्क কুইকেনডাল

5

এই কোডটি যা চাওয়া হচ্ছে তা ফিরিয়ে দেওয়া উচিত। এটি একটি কর্মক্ষেত্র GDB / FS- এর সমস্ত বৈশিষ্ট্য শ্রেণি এবং টেবিলগুলিকে সংক্ষেপে অতিক্রম করবে এবং একটি ডোমেন, ক্ষেত্রের নাম এবং বৈশিষ্ট্যযুক্ত শ্রেণি / সারণীর সাথে সম্পর্কিত সমস্ত ক্ষেত্র ফিরিয়ে দেবে।

import os
import arcpy
lst=[]
for dirpath,dirnames,files in arcpy.da.Walk( # the path to your workspace
, datatype=["FeatureClass","Table"]):
     for file in files:
         lst.append(os.path.join(dirpath,file))
for i in lst:
     for fld in arcpy.ListFields(i):
         if fld.domain != "":
             print os.path.basename(i),fld.name, fld.domain 

4

দুর্ভাগ্যক্রমে ব্রায়ানের উত্তর, যা জিজ্ঞাসা করা প্রশ্ন একটি প্রত্যক্ষ এবং ব্যবহারযোগ্য উত্তর, আমার আসল সমস্যাটি সমাধান করে না। আমি মনে করি হাতের জিডিবিতে একটি বাগ থাকায় (যদিও বৈশিষ্ট্য শ্রেণীর কোনওটিরও ডোমেন সংযুক্ত নেই, এখনও একটি রয়েছে যা আমাকে মুছার অনুমতি নেই)। যে কোনও ক্ষেত্রে আমি কোন এফসি এর সাথে ডোমেনগুলি যুক্ত করে তা নির্ধারণের জন্য অন্য একটি পদ্ধতি খুঁজে পেয়েছি। এটি ইন্টারেক্টিভ, তবে প্রতিটি একক এফসিতে প্রতিটি ক্ষেত্রের সম্পত্তি দিয়ে যাওয়ার চেয়ে অনেক দ্রুত:

সমস্যা জিডিবি থেকে অন্য জিডিবিতে এফসি'র বাচ্চাগুলি টেনে আনুন এবং ডেটা স্থানান্তর কথোপকথনটি পরীক্ষা করুন। লিঙ্কযুক্ত অ্যাট্রিবিউট ডোমেনগুলি, যদি থাকে তবে তালিকার নীচে থাকবে। আপনি @ $% ## fc যে কোনও কঠিন সময় দিচ্ছেন তা সংকুচিত না করা পর্যন্ত ছোট বা ছোট গুচ্ছগুলিতে পুনরাবৃত্তি করুন।

অবশেষে একটি সিভি ডোমেনের সাথে সংযুক্ত 2 টি এফসি সংকীর্ণ করা হয়েছে


কৌতূহলজনকভাবে, যদিও ড্রাগ-এন-ড্রপ HD_148009_2সিভি ডোমেনের সাথে লিঙ্কযুক্ত বলেছে Permanency, ব্রায়ানের আরকি স্ক্রিপ্ট কোনও লিঙ্কযুক্ত ডোমেনের প্রতিবেদন করে না, এবং আরকিগ্ল্যাটালগে ফিচার ক্লাস প্রোপার্টি ক্ষেত্র পরিদর্শকও নয়। তবে এখন অবশেষে আমি এএসরি প্রযুক্তি সমর্থন সহ একটি বাগ রিপোর্ট লগ করার জন্য এটি যথেষ্ট সংকুচিত করেছি।
ম্যাট উইলকি

4

আমি ম্যাট উইলকি ব্রায়ানের কোডটি বাড়িয়ে দেখতে চেয়েছিলাম imagine আমাকে টেবিলের জন্য সমস্ত ডোমেন, একটি ডাটাবেসের মূল ডিরেক্টরিতে বৈশিষ্ট্যযুক্ত ক্লাস এবং সমস্ত বৈশিষ্ট্য ডেটাসেটের বৈশিষ্ট্যগুলি পেতে হয়েছিল। আমি কিছু অন্যান্য কর্মীদের পুরানো ডোমেনগুলির জিওডাটাবেস পরিবেশ পরিষ্কার করার জন্য সিএসভি হিসাবে তথ্যটি রফতানি করেছি।

def domainInfo(csvExportFolder):
    import arcpy,csv,os

    fcTabList = []
    list = []

    #Set workspace environment to geodatabase
    arcpy.env.workspace = r"H:\GIS\SDEConnections\Admin\Infrastructure.sde"

    #Prepping the csv
    csvFile = csv.writer(open(csvExportFolder+"\\"+ "Infrastructure Domains" + ".csv","wb"),delimiter = "|")
    csvFile.writerow(["FeatureDataSet","FeatureClass","FieldName","Domain"])

    #Get list of all features in geodatabase
    fdsList = arcpy.ListDatasets()
    fcs = arcpy.ListFeatureClasses()
    tbs = arcpy.ListTables()

    for fds in fdsList:
        fcs = arcpy.ListFeatureClasses("","",fds)
        if len(fcs) != 0:
            for fc in fcs:
                fcTabList.append([fds,fc])

    for fc in fcs:
        fcTabList.append([None,fc])

    for tb in tbs:
        fcTabList.append([None,tb])

    # Loop through all features in the database list
    for item in fcTabList:
        fds = item[0]
        fc = item[1]
        # List fields in feature class
        fields = arcpy.ListFields(fc)

        # Loop through fields
        for field in fields:

            # Check if field has domain
            if field.domain != "":

                # Print feature class, field, domain name
                csvFile.writerow([fds,fc,field.name,field.domain])

def main():
    csvExportFolder = r"H:\GIS"
    domainInfo(csvExportFolder)

if __name__ == "__main__":
    main()

0

এসরি: এফএকিউ: আমার জিওডাটাবেসে ডোমেনগুলি রেফারেন্স করা সমস্ত জায়গাগুলি আমি কীভাবে খুঁজে পাব? "পাইথন ফাংশন যা জিওডাটাবেজে এই কাঠামোর বৈশিষ্ট্যগুলি তালিকাভুক্ত করতে পারে the বৈশিষ্ট্যের মধ্যে উল্লেখযোগ্য ডোমেনগুলিও রয়েছে A টেবিলসমূহ। ডোমেনগুলি কোনও বৈশিষ্ট্য শ্রেণি বা সারণিতে ক্ষেত্রগুলির সাথে যুক্ত হতে পারে; এগুলি একটি সাব টাইপ দ্বারা শ্রেণিবদ্ধ ক্ষেত্রগুলির জন্য অতিরিক্ত সেট করা যেতে পারে। "

ফলাফল এই প্রশ্নের জন্য কোলাহলপূর্ণ, ডোমেনগুলি কী ব্যবহৃত হচ্ছে তা ছাড়িয়ে গেলেও শুরু করার জন্য এটি বৃহত্তর প্ল্যাটফর্ম।

Executing: ParseDomainReferences [...]

fc at root level: Pt1
  fld OBJECTID
  fld SHAPE
  fld Field_Text, domain [Pets]
  fld Field_Long
  fld Field_Short, domain [Counts]
  fld Field_Double, domain [Ratios]
[...]
Subtype Code: 1
subCode: ('Default', False)
subCode: ('Name', u'One')
subCode: ('SubtypeField', u'Field_Long')
FieldValues
fldName: Field_Double, default: [no default], domain: Ratios
fldName: OBJECTID, default: [no default], domain: [no domain]
fldName: Field_Long, default: [no default], domain: [no domain]
fldName: Field_Short, default: 1, domain: Counts
fldName: SHAPE, default: [no default], domain: [no domain]
fldName: Field_Text, default: N, domain: [no domain]
[...etc]

কোড অংশ, সংক্ষিপ্তকরণ জন্য সম্পাদিত:

def ParseFieldList (fc, fcPath):
...
      for fld in fldList:
        if fld.domain != None:
          if fld.domain != "":
...
        arcpy.AddMessage ("  fld " + fld.name + s)

      # get subtype list
      subDict = arcpy.da.ListSubtypes (fcPath)
      if len (subDict) > 0:
        for stCode in subDict.iteritems():
...
          valkey, vallist = stCode
          arcpy.AddMessage ("Subtype Code: {0}".format(valkey))
          i = 0
          for subCode in vallist.iteritems():
            i += 1
            if i < 4:
              arcpy.AddMessage ("subCode: {0}".format(subCode))
            else:
              fldkey, fldlist = subCode
              arcpy.AddMessage (fldkey)
              for fld in fldlist.iteritems():
...
                if dom != None:
                  s2 = dom.name
                arcpy.AddMessage ("fldName: " + fldName + ", default: " + s1 + ", domain: " + s2)
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.