আরাকম্যাপে যোগদানের ক্ষেত্রটি চিহ্নিত করুন?


9

আর্কম্যাপে একসাথে দুটি ডেটাসেটে যোগদানের টেবিলের সাথে ব্যবহৃত হয়ে যাওয়া ক্ষেত্রটি প্রোগ্রামযুক্তভাবে চিহ্নিত করা সম্ভব ? আমি বর্তমানে আরকজিআইএস 10.0, এসপি 5 ব্যবহার করছি এবং একটি আরকিপি সমাধানটি পছন্দ করব, তবে আমি যদি আরকিপাই সমাধান না পাই তবে আমি অন্যান্য সমাধানগুলির বিরোধিতা করব না।

একটি পদ্ধতি যা আমি চেষ্টা করেছিলাম তা সমস্ত ক্ষেত্রের মধ্য দিয়ে লুপিং করা এবং একটি "বেসনাম" এর সাথে মিল খুঁজে পাওয়া।

আমি যা করছি তার গ্রাফিক উপস্থাপনের জন্য, আমি মূলত "ইনপুট জয়েন ফিল্ড" এবং "আউটপুট জয়েন ফিল্ড" শনাক্ত করতে চাই "অ্যাড জয়েন অ্যাড" সংলাপে, তবে বাস্তবে, অবশ্যই।

"ইনপুট জয়েন ফিল্ড" এবং "আউটপুট জয়েন ফিল্ড" কীভাবে সনাক্ত করবেন?

এটি কোনও ট্যাগ-অন প্রশ্ন যা প্রোগ্রামে কোনও "যোগদান" শনাক্ত করা যায়? , তবে এই ক্ষেত্রে আমি দুটি (বা আরও) ডেটাসেট একসাথে যোগদানের জন্য ব্যবহৃত FIELD (গুলি) সনাক্ত করতে কার্যকারিতা প্রসারিত করতে চাই।


আর্কজিআইএস এর কোন সংস্করণ আপনি কাজ করছেন? এবং আমি ট্যাগগুলির উপর ভিত্তি করে ধরে নিয়েছি যে আপনি আরকিপি দিয়ে নয় এমনভাবে আর্কওবজেক্টস দিয়ে কোনও উপায় অনুসন্ধান করছেন?
blah238

আমি বর্তমানে আরকিজিআইএস 10.0, এসপি 5 ব্যবহার করছি। এবং হ্যাঁ, আমি একটি আর্কপাই সমাধানের জন্য সন্ধান করছি / আশা করছি, তবে আমি যদি আরকোবজেক্টস সমাধানটির বিরোধিতা করব না, যদি এটিই বিকল্প বিকল্প হয়।
রায়ানকডালটন

1
এখানে কিছু সম্ভবত প্রকাশিত ডকুমেন্টেশন রয়েছে: edndoc.esri.com/arcobjects/9.2/CompenderHelp/esriGeoDatabase/… এতে পিআরএল ক্লাস জড়িত রয়েছে এটি জোড় টেবিলগুলি সংজ্ঞায়িত করতে এবং ক্ষেত্রের পাশাপাশি কার্ডিনালিটির সাথে যুক্ত হওয়ার জন্য ব্যবহৃত সম্পর্ক সম্পর্কিত ক্লাস lass ওপেন পদ্ধতিটি হয় একটি নতুন RelQueryTable তৈরি করে বা বিদ্যমান ক্লাসটি ইতিমধ্যে তৈরি করা থাকলে একটি বিদ্যমান RelQueryTable- এ একটি রেফারেন্স দেয়। আপনি এই পদ্ধতিটি শুরু করতে পারেন এবং thepelelClass জড়িত রেফারেন্সটি খুঁজে পেতে পারেন
লুইস

@ লেউইস, আপনার বিদ্যমান কারিগরি টেবিলের রেফারেন্স পেতে কারখানার অবজেক্টটি ব্যবহার করার দরকার নেই - আমার উত্তর দেখুন।
blah238

উত্তর:


8

সমস্ত স্তরের সাথে যোগ দিয়ে একটি স্তরতে তালিকাভুক্ত করতে এবং তাদের গন্তব্য এবং উত্স টেবিলের নাম এবং প্রাথমিক এবং বিদেশী কীগুলি তালিকাভুক্ত করতে এখানে এই উদাহরণ হিসাবে ভিত্তি করে একটি আর্কওবজেক্ট পদ্ধতি রয়েছে :

  1. ILayerএক বা একাধিক যোগদান করে এমন একটি রেফারেন্স পান
  2. কাস্ট ILayerকরার জন্যIDisplayTable
  3. IDisplayTable.DisplayTableসম্পত্তি কাস্টIRelQueryTable
  4. যদিও বর্তমান সারণীটি একটি IRelQueryTable:
    1. পরিদর্শন করুন RelQueryTableএর 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 মাস্টার_এফসি_জাইন_সারণী__জয়িন_সেবিকা_2 JOIN_ID_3 মাস্টার_এফসি.এমএসটিআইডিআইডি
join_table_2 মাস্টার_এফসি_জাইন_সারণযোগ্য JOIN_ID_2 মাস্টার_এফসি। MASTER_ID
join_table_1 মাস্টার_এফসি JOIN_ID_1 MASTER_ID

আরও তথ্যের জন্য, আমি পাইথন থেকে আর্কওবজেক্টগুলি কীভাবে অ্যাক্সেস করব?


এটি খুব আশাব্যঞ্জক দেখাচ্ছে। আমি কমপাইটস প্যাকেজ ইনস্টল করেছি এবং সহায়ক ফাংশন কোড যুক্ত করেছি, তবে আমি ত্রুটি পেয়েছি "global name 'esriGeoDatabase' is not defined"। রেখার আগের কোডটিতে এটি কোথায় / কীভাবে সংজ্ঞায়িত করা উচিত while CType(table, esriGeoDatabase.IRelQueryTable)?
রায়ানকডাল্টন

আমি এটি অন্তর্ভুক্ত করি নি, তবে এক পর্যায়ে আপনাকে আপনার প্রয়োজনীয় নির্দিষ্ট ESRI অবজেক্ট লাইব্রেরির আশেপাশে কমপাইট র‌্যাপগুলি আমদানি করতে হবে। আমার সহায়ক মডিউলটি ব্যবহার করা এটি যতটা সহজ esriGeoDatabase = GetESRIModule("esriGeoDatabase")
blah238

বুঝেছি ধন্যবাদ. এটিও আর্কম্যাপে স্তরগুলির জন্য কাজ করবে? আমি প্রতিটি স্তরটি কোডের layerList = arcpy.mapping.ListLayers(mxd)মধ্যে দিয়ে যাচ্ছি listJoins(table)তবে এটি whileবিবৃতিতে এড়িয়ে যায় ।
রায়ানকডালটন

আমি মনে করি না আপনি আরকি অবজেক্ট এবং কমটাইপস অবজেক্টগুলির মধ্যে কাস্ট করতে পারেন, সুতরাং আপনাকে আরকোবজেক্টসের মাধ্যমে আইলায়ার রেফারেন্সটি পাওয়া দরকার। আমি আরও সম্পূর্ণ উদাহরণ অন্তর্ভুক্ত করতে কোড আপডেট করেছি। প্রাসঙ্গিক লাইনগুলিকে মন্তব্য / সঙ্কোচিত করে প্রক্রিয়াটির বাইরে এবং বাইরে উভয়ই এটি ব্যবহার করতে সক্ষম হওয়া উচিত।
blah238

কাছাকাছি আসার জন্য, হাঁটার মধ্য দিয়ে ধৈর্য ধরার জন্য ধন্যবাদ ... এখন আপনি কীভাবে প্রকৃত মানচিত্র ডকুমেন্ট ফাইল (* .mxd) প্রেরণ করেছেন যা আপনি দেখতে চান? app.Documentসাথে ফিরে আসে'NoneType' object has no attribute 'Document'
রায়ানকডাল্টন

1

ক্ষেত্রগুলির সমস্ত ডেটা স্ট্রিংয়ে রাখুন, (তাদের অর্ডার দেওয়ার পরে) তাদেরকে একটি ফজিকম্প্পারে ফাংশনটির সাথে তুলনা করুন এবং যারা সেরা ম্যাচ দিয়েছেন বা ম্যাচটি নির্দিষ্ট নির্ভুলতার সাথে দিয়েছেন তাদের নির্বাচন করুন।

এই সমাধানটি যখন কিছু ডেটা ফিট না করে। আপনি যদি ভাবেন যে উভয় কলামই সর্বদা ফিট হয়ে যায়, তবে কেবল একটি সাধারণ তুলনা ফাংশনটির সাথে একটি নিখুঁত ম্যাচের জন্য কেবল অর্ডার করুন এবং তুলনা করুন।


0

এটা চেষ্টা কর:

  • ব্যবহার করুন XSLT ট্রান্সফরমেসন থেকে টুল মেটাডেটা টুলসেট প্রশ্নে ডেটা সেটটি জন্য একটি XML / HTML মেটাডেটা ফাইল আউট লিখতে।

    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')
  • মেটাডেটা ফাইলে পড়ার জন্য এইচটিএমএল পার্সার ব্যবহার করুন এবং যোগদানের ক্ষেত্রের সরঞ্জামের জিওপ্রসেসিংয়ের ইতিহাস থেকে যোগদানের ক্ষেত্রটি অনুসন্ধান করুন

  • এক্সএসএলটি রূপান্তর সরঞ্জাম থেকে নমুনা আউটপুট

এক্সএসএলটি রূপান্তর সরঞ্জাম থেকে আউটপুট


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

1
আমি যাইহোক, এর জন্য জিপি ইতিহাসের উপর নির্ভর করব না। আমরা যত তাড়াতাড়ি সম্ভব এটি মুছতে চেষ্টা করি কারণ পুনরাবৃত্ত প্রক্রিয়াগুলির জন্য এটি দ্রুত বিশাল আকারের ডেটাতে পরিণত হয় যা কোনও বৈশিষ্ট্য শ্রেণিকে প্রায় অকেজো করে তোলে।
blah238

-1

যুক্ত টেবিলের নামগুলি IFeatureLayer - IFeatureLayerD Definition অবজেক্টটিকে স্ট্রিং হিসাবে .. যা আমার মনে হয় সম্ভবত এসকিউএল এবং এইভাবে ফিল্ডের নামগুলি অন্তর্ভুক্ত রয়েছে।

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
এটি জিজ্ঞাসিত প্রশ্নের উত্তর দিতে উপস্থিত হবে না to অস্পষ্ট তুলনা উত্তর একই। ক্ষেত্রগুলি অভিন্ন হওয়ার (বা এমনকি অদ্ভুতরূপে অনুরূপ) ক্ষেত্রগুলির বাস্তবে একটি যোগে ব্যবহৃত হয়েছে কিনা তা নিয়েও তার কোনও ফল নেই।
blah238
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.