प्रोग्राम में शामिल होने के लिए ArcMap में फील्ड की पहचान?


9

क्या यह संभव है कि प्रोग्राम से जुड़ने वाले फ़ील्ड की पहचान करें जिसे आर्कपेज़ में एक साथ दो डेटासेट्स टेबल में शामिल किया जा रहा है? मैं वर्तमान में ArcGIS 10.0, SP5 का उपयोग कर रहा हूं और एक ArcPy समाधान पसंद करूंगा , हालांकि मैं अन्य समाधानों का विरोध नहीं करूंगा, अगर कोई ArcPy समाधान उपलब्ध नहीं है।

एक तरीका जो मैंने आजमाया था, वह सभी क्षेत्रों से गुजर रहा था और एक मेल "बेसनेम" की तलाश कर रहा था, लेकिन यह सिर्फ एक "शिक्षित अनुमान" है जहां आप उम्मीद कर रहे हैं कि दोनों डेटाबेस में फ़ील्डनाम समान हैं।

के बाद मैं क्या कर रहा हूँ के एक ग्राफिक प्रतिनिधित्व के लिए, मैं मूल रूप से "इनपुट जॉइन फील्ड" और "आउटपुट जॉइन फील्ड" की पहचान करना चाहता हूं जैसा कि "ऐड ज्वाइन" संवाद में देखा गया है, लेकिन बाद में, वास्तव में।

"इनपुट जॉइन फील्ड" और "आउटपुट जॉइन फील्ड" की पहचान कैसे करें?

यह एक टैग-ऑन प्रश्न है जो प्रोग्राम में "ज्वाइन" का पता लगाया जा सकता है? , लेकिन इस मामले में मैं दो (या अधिक) डेटा को एक साथ जोड़ने के लिए इस्तेमाल की जा रही FIELD (s) की पहचान करने के लिए कार्यक्षमता का विस्तार करना चाहता हूं।


आप किस संस्करण के साथ काम कर रहे हैं? और मैं उन टैगों के आधार पर मान रहा हूं जो आप विशेष रूप से आर्कपी के साथ ऐसा करने के लिए देख रहे हैं न कि आर्कोबजेक्ट्स के साथ?
blah238

मैं वर्तमान में आर्कजीआईएस 10.0, एसपी 5 का उपयोग कर रहा हूं। और हां, मैं एक ArcPy समाधान की तलाश / उम्मीद कर रहा हूं, हालांकि मैं एक ArcObjects समाधान का विरोध नहीं करूंगा, अगर यह एकमात्र विकल्प है।
रयानकेडलटन

1
यहां कुछ संभावित रूप से प्रलेखित दस्तावेज हैं: edndoc.esri.com/arcobjects/9.2/ComponentHelp/esriGeoDatabase/… इसमें pRelClass शामिल है यह रिलेशनशिपक्लास शामिल है जो तालिकाओं को परिभाषित करने और फ़ील्ड के साथ-साथ कार्डिनलिटी को जोड़ने के लिए उपयोग किया जाता है। ओपन विधि या तो एक नया RelQueryTable बनाता है या किसी मौजूदा RelQueryTable का संदर्भ देता है यदि वह वर्ग पहले ही निर्मित हो चुका हो। आप इस विधि को लागू कर सकते हैं और संदर्भ पा सकते हैं thepRelClass
lewis

@lewis, आपको किसी मौजूदा RelQueryTable का संदर्भ प्राप्त करने के लिए फ़ैक्टरी ऑब्जेक्ट का उपयोग करने की आवश्यकता नहीं है - मेरा उत्तर देखें।
blah238

जवाबों:


8

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

  1. ILayerएक या एक से अधिक जुड़ने वालों का संदर्भ लें
  2. कास्ट ILayerकरने के लिएIDisplayTable
  3. के लिए IDisplayTable.DisplayTableसंपत्ति कास्ट करेंIRelQueryTable
  4. जबकि वर्तमान तालिका एक है IRelQueryTable:
    1. RelQueryTable'S DestinationTableऔर SourceTableगुणों का निरीक्षण करें
    2. संपत्ति के गुणों OriginPrimaryKeyऔर OriginForeignKeyगुणों का निरीक्षण करें IRelQueryTable.RelationshipClass
    3. वर्तमान के लिए वर्तमान तालिका सेट RelQueryTableकी SourceTableसंपत्ति

यह पायथन लिपि ( कॉम्पीप्स और इस हेल्पर मॉड्यूल का उपयोग करते हुए ) सभी जोड़ से गुजरती है , नवीनतम से जल्द से जल्द, और गंतव्य और स्रोत तालिका के नाम प्रिंट करें, प्राथमिक कुंजी और प्रत्येक जुड़ने के लिए मूल विदेशी कुंजी:

from ESRICOMHelpers import * # helper module from https://gis.stackexchange.com/a/5082/753
esriArcMapUI = GetESRIModule("esriArcMapUI")
esriCarto = GetESRIModule("esriCarto")
esriGeoDatabase = GetESRIModule("esriGeoDatabase")

def listJoins(table):
    while CType(table, esriGeoDatabase.IRelQueryTable):
        relQueryTable = CType(table, esriGeoDatabase.IRelQueryTable)
        destTable = relQueryTable.DestinationTable
        sourceTable = relQueryTable.SourceTable
        destDataset = CType(destTable, esriGeoDatabase.IDataset)
        sourceDataset = CType(sourceTable, esriGeoDatabase.IDataset)
        relClass = relQueryTable.RelationshipClass
        print destDataset.Name, sourceDataset.Name, relClass.OriginPrimaryKey, relClass.OriginForeignKey
        table = sourceTable

if __name__ == "__main__":
    #app = GetCurrentApp() # Use if run in-process
    app = GetApp("ArcMap") # Use if run in a standalone script
    mxd = CType(app.Document, esriArcMapUI.IMxDocument)

    # Gets the first layer in the active data frame
    map = mxd.FocusMap
    lyr = map.Layer[0]

    # Need to get the "display table" to access the joins
    displayTable = CType(lyr, esriCarto.IDisplayTable).DisplayTable

    # List the layer's joined tables
    listJoins(displayTable)

उदाहरण आउटपुट, तीन जोड़ों के साथ एक स्रोत परत दिया गया:

join_table_3 master_fc_join_table_1_join_table_2 JOIN_ID_3 master_fc.MASTER_ID
join_table_2 master_fc_join_table_1 JOIN_ID_2 master_fc.MASTER_ID
join_table_1 master_fc JOIN_ID_1 MASTER_ID

अधिक जानकारी के लिए, देखें कि मैं पायथन से ArcObjects का उपयोग कैसे करूं?


यह बहुत ही आशाजनक लग रहा है। मुझे कॉम्पटिप्स पैकेज स्थापित हो गया है और सहायक फ़ंक्शन कोड जोड़ा गया है, लेकिन मुझे त्रुटि मिलती है "global name 'esriGeoDatabase' is not defined"। लाइन से पहले कोड में इसे कहां / कैसे परिभाषित किया जाना चाहिए while CType(table, esriGeoDatabase.IRelQueryTable)?
रियानकैलटन

मैंने इसे शामिल नहीं किया, लेकिन कुछ बिंदु पर आपको उन विशिष्ट ईएसआरआई ऑब्जेक्ट पुस्तकालयों के चारों ओर कॉम्पटिप रैपर आयात करने होंगे जिनकी आपको आवश्यकता है। मेरे सहायक मॉड्यूल का उपयोग करना जितना आसान है esriGeoDatabase = GetESRIModule("esriGeoDatabase")
blah238

मिल गया धन्यवाद। क्या यह ArcMap में परतों के लिए भी काम करेगा? मैं प्रत्येक परत layerList = arcpy.mapping.ListLayers(mxd)को listJoins(table)कोड से पास कर रहा हूं , लेकिन यह whileकथन पर समाप्त हो जाता है।
रियानकैलटन

मुझे नहीं लगता कि आप आर्चिव ऑब्जेक्ट्स और कॉम्पटिप ऑब्जेक्ट्स के बीच कास्ट कर सकते हैं, इसलिए आपको आर्कोबजेक्ट्स के माध्यम से ILayer संदर्भ प्राप्त करना होगा। मैंने अधिक पूर्ण उदाहरण को शामिल करने के लिए कोड अपडेट किया है। यह संबंधित पंक्तियों को टिप्पणी / अनसुना करके प्रक्रिया के अंदर और बाहर दोनों का उपयोग करने में सक्षम होना चाहिए।
blah238

पास होने के लिए, वॉक-थ्रू धैर्य के लिए धन्यवाद ... अब, आपने वास्तविक मानचित्र दस्तावेज़ फ़ाइल (* .mxd) को कैसे भेजा है जिसे आप देखना चाहते हैं? app.Documentवापस आता है'NoneType' object has no attribute 'Document'
RyanKDalton

1

फ़ील्ड के सभी डेटा को स्ट्रिंग्स में रखें, (उन्हें ऑर्डर करने के बाद) उनकी तुलना एक फ़ज़ी-कम्पोज़र फ़ंक्शन के साथ करें और उन लोगों का चयन करें जिन्होंने सबसे अच्छा मैच दिया या सुपरबाउंड को एक निश्चित परिशुद्धता से मैच किया।

यह समाधान है जब कुछ डेटा फिट नहीं होगा। यदि आपको लगता है कि दोनों कॉलम हमेशा फिट होंगे, तो बस ऑर्डर करें और एक साधारण तुलना फ़ंक्शन के साथ एक परिपूर्ण मैच के लिए तुलना करें।


0

इसे इस्तेमाल करे:

  • प्रश्न में डेटासेट के लिए xml / html मेटाडेटा फ़ाइल लिखने के लिए मेटाडेटा टूलसेट से XSLT परिवर्तन टूल का उपयोग करें ।

    arcpy.XSLTransform_conversion(r'X:\temp\Scratch.gdb\fc_FeatureToPoint',"C:\Program Files\ArcGIS\Desktop10.1\Metadata\Stylesheets\ArcGIS.xsl", r'X:\temp\Metadata.html')
  • मेटाडेटा फ़ाइल में पढ़ने के लिए HTML पार्सर का उपयोग करें और जॉइन फ़ील्ड टूल के जियोप्रोसेसिंग इतिहास से जुड़ने वाले फ़ील्ड की खोज करें

  • XSLT परिवर्तन उपकरण से नमूना उत्पादन

XSLT परिवर्तन उपकरण से आउटपुट


1
यह वास्तव में एक चतुर विचार है जिसे मैंने सोचा था कि यह वास्तविक वादा था, लेकिन मेरे परीक्षण से, ऐसा प्रतीत होता है कि यह केवल तभी काम करेगा जब फ़ाइल "JoinField" नामक GP टूल का उपयोग करके जुड़ गई थी, क्योंकि यह GP प्रक्रिया इतिहास के भाग के रूप में लिखा गया है उस परत के लिए। यदि उपयोगकर्ता ने UI के माध्यम से ज्वाइन किया है, तो JoinField प्रोसेस लाइन आउटपुट फाइल में मौजूद नहीं है। महान विचार हालांकि!
रयान किडल्टन

1
मैं इस रास्ते के लिए जीपी इतिहास पर भरोसा नहीं करेगा। हम इसे जल्द से जल्द हटाने की कोशिश करते हैं क्योंकि आवर्ती प्रक्रियाओं के लिए यह एक बड़ी मात्रा में डेटा को जल्दी से मापता है जो एक फीचर क्लास को लगभग अनुपयोगी बनाता है।
blah238

-1

शामिल किए गए तालिका नाम IFeatureLayer - IFeatureLayerDefinition ऑब्जेक्ट में एक स्ट्रिंग के रूप में हैं .. जो मुझे लगता है कि संभवतः SQL में सम्मिलित हों और इस प्रकार फ़ील्ड नाम।

http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf

या आप मतलब है अगर आप उस वस्तु का उपयोग नहीं कर सकते हैं?


IFeatureLayerDefinition"जॉइन एसक्यूएल" सम्‍मिलित नहीं करता है, इसमें केवल DefinitionExpressionफीचर लेयर की डेफिनेशन क्‍वेरी को उजागर करने वाली प्रॉपर्टी होती है, यदि सेट किया जाता है, जो कि एक व्हाट्स क्लॉज है जो कि पंक्तियों को प्रदर्शित करता है।
blah238

RelationshipClassहालांकि, इसके पास एक संपत्ति है, लेकिन मुझे लगता है कि यह केवल सबसे हालिया जुड़ाव को उजागर करता है। आपको IRelQueryTableउन सभी को प्राप्त करने के बजाय उपयोग करने की आवश्यकता होगी ।
blah238

-2

फ़ील्ड नाम की परवाह किए बिना मिलान वाले फ़ील्ड खोजने के लिए, आप ऐसा कुछ कर सकते हैं:

import arcpy

fc = r"temp/RiversJoined.shp"

fldList1 = [f.name for f in arcpy.ListFields(fc)]
fldList2 =[g.name for g in arcpy.ListFields(fc)]

for f in fldList1:
    values1 = [f_row[0] for f_row in arcpy.da.SearchCursor(fc, (f))]
    for g in fldList2:
        values2 = [g_row[0] for g_row in arcpy.da.SearchCursor(fc,(g))]
        #compare field values
        #get names of matching fields
        if (fldList2.index(g) != fldList1.index(f) and values1 == values2):
            print "match: " + str(g) + " match: "+ str(f)

हे मेरे सवाल का जवाब दिया: क्या आप मुझे बता सकते हैं कि मेरे उत्तर में क्या गलत है? धन्यवाद।
mwil

1
यह पूछे गए प्रश्न का उत्तर देने के लिए प्रकट नहीं होता है। फजी के साथ एक ही जवाब की तुलना करें। फ़ील्ड समान (या यहां तक ​​कि समान रूप से) होने का कोई असर नहीं पड़ता है कि उनका वास्तव में उपयोग किया गया है या नहीं।
blah238
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.