আর্কপি ব্যবহার করে দক্ষতার সাথে সম্পর্কিত রেকর্ড নির্বাচন করা?


14

আর্কম্যাপে "সম্পর্কিত সারণী" বোতামটির অনুলিপি তৈরি করতে আমি নীচের কোডটি ব্যবহার করছি is আর্কম্যাপে সেই বোতামটি অন্য কোনও বৈশিষ্ট্য শ্রেণি বা সারণীতে বৈশিষ্ট্যগুলির নির্বাচনের উপর ভিত্তি করে একটি বৈশিষ্ট্য শ্রেণি বা সারণীতে বৈশিষ্ট্য নির্বাচন করে।

আর্কম্যাপে আমি সেই বাটনটি কয়েক সেকেন্ডের মধ্যে আমার নির্বাচন সম্পর্কিত টেবিলটিতে "ধাক্কা" দিতে ব্যবহার করতে পারি। আমি আরকেপিতে অন্তর্নির্মিত এমন কোনও কিছুই খুঁজে পেতে অক্ষম ছিল যা বোতামটির প্রতিলিপি তৈরি করে তাই আমি একই কাজটি করতে কিছু নেস্টেড লুপ ব্যবহার করেছি।

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

কোডটি নিজেই সূক্ষ্মভাবে কাজ করে, তবে এটি যন্ত্রণাদায়কভাবে ধীর। এই ক্ষেত্রে "চিকিত্সার টেবিল" এর 16,000 রেকর্ড রয়েছে। "ট্রি" বৈশিষ্ট্য বর্গের 60,000 রেকর্ড রয়েছে।

ইএসআরআই যা করছে তা পুনরায় তৈরি করার আরও একটি কার্যকর উপায় আছে যখন এটি একটি টেবিল থেকে অন্য টেবিলে নির্বাচনকে ঠেলে দেয়? আমি কি টেবিলগুলির জন্য একটি সূচক তৈরি করব? দ্রষ্টব্য: এই ডেটা একটি এসডিইতে সঞ্চিত রয়েছে।

 # Create search cursor to loop through the treatments
treatments = arcpy.SearchCursor(treatment_tv)
treatment_field = "Facility_ID"

for treatment in treatments:

    #Get ID of treatment
    treatment_ID = treatment.getValue(treatment_field)

    # Create search cursor for looping through the trees
    trees = arcpy.SearchCursor(tree_fl)
    tree_field = "FACILITYID"

    for tree in trees:

        # Get FID of tree
        tree_FID = tree.getValue(tree_field)

        if tree_FID == treatment_FID:
            query = "FACILITYID = " + str(tree_FID)
            arcpy.SelectLayerByAttribute_management(tree_fl, "REMOVE_FROM_SELECTION", query)
            break

2
আপনি আরকিজিআইএস 10.1 ব্যবহার করছেন? যদি তা হয় তবে আরকিপিএইডা.সন্ধান সার্ভারটি সম্ভবত আরকিপি থেকে খুব দ্রুত (সম্ভবত 10 এক্স) হতে পারে earchসার্চকার্সার। এছাড়াও, আপনি পাইথন অভিধানের ব্যবহার বিবেচনা করতে চাইতে পারেন। আমি সন্দেহ করি যে এর মতো একটি "কীফিল নির্বাচন" এখানে
পলিজিও

আপনার এসডিই ডাটাবেস কি ওরাকল এ সুযোগ দ্বারা?
blah238

উত্তর:


12

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

দ্বিতীয়ত, আপনি SelectLayerByAttribute_managementএকটি শক্ত, নেস্টেড লুপ (চিকিত্সা প্রতি গাছ প্রতি একবার) কল করছেন। এটি বেশ কয়েকটি কারণে অত্যন্ত অদক্ষ is

  • আপনার দু'টি লুপের দরকার নেই, একজনের মধ্যে অন্যের মধ্যে নেস্ট করা, এর জন্য যতদূর আমি বলতে পারি। একটাই যথেষ্ট হবে।
  • জিওপ্রোসেসিং ফাংশনগুলি "চুনকি" এবং সাধারণত বিল্ট-ইন পাইথন ফাংশনের তুলনায় কল করতে প্রচুর সময় নেয়। আপনার একটি শক্ত লুপে কল করা এড়ানো উচিত।
  • একবারে একটি রেকর্ড / আইডি জিজ্ঞাসা করার ফলে ডাটাবেসে আরও বেশি রাউন্ড ট্রিপ হয়।

পরিবর্তে, আপনার SelectLayerByAttribute_managementকোডটিকে রিফ্যাক্টর করুন যাতে আপনি সম্পর্কিত সমস্ত রেকর্ড নির্বাচন করার জন্য কেবলমাত্র একবার কল করেছিলেন la

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

def selectRelatedRecords(sourceLayer, targetLayer, sourceField, targetField):
    sourceIDs = set([row[0] for row in arcpy.da.SearchCursor(sourceLayer, sourceField)])
    whereClause = buildWhereClauseFromList(targetLayer, targetField, sourceIDs)
    arcpy.AddMessage("Selecting related records using WhereClause: {0}".format(whereClause))
    arcpy.SelectLayerByAttribute_management(targetLayer, "NEW_SELECTION", whereClause)

আপনি এটিকে এভাবে কল করতে পারেন: selectRelatedRecords(treatment_tv, tree_fl, "Facility_ID", "FACILITYID")

মন্তব্য:

  • এটি একটি ব্যবহার করে arcpy.da.SearchCursor, যা কেবল 10.1 এ উপলব্ধ। @ পলিজিও যেমন উল্লেখ করেছে, এই কার্সারগুলি তাদের পূর্বসূরীদের ( arcpy.SearchCursor) এর চেয়ে অনেক বেশি দ্রুত । পুরানো সার্চকার্সার ব্যবহার করার জন্য এটি সহজেই সংশোধন করা যেতে পারে যদিও:

    sourceIDs = set([row.getValue(sourceField) for row in arcpy.SearchCursor(sourceLayer, "", "", sourceField)])
  • যদি আপনার এসডিই জিওডাটাবেস ওরাকল এ থাকে তবে আপনাকে সতর্ক করে দিন যে লিঙ্কিত INউত্তর থেকে ফাংশনে ব্যবহৃত বিবৃতিটি 1000 টি উপাদানগুলির মধ্যে সীমাবদ্ধ। এই উত্তরে একটি সম্ভাব্য সমাধান বর্ণিত হয়েছে , তবে আপনাকে এটিকে একের INপরিবর্তে একাধিক 1000-দৈর্ঘ্যের বিবৃতিতে বিভক্ত করতে ফাংশনটি সংশোধন করতে হবে।


5

উপরের সমাধানটি আমার পক্ষে দুর্দান্ত কাজ করে এবং খুব দ্রুত ছিল। অন্য পোস্টের উপরের কোড এবং রেফারেন্স কোডটি ব্যবহার করে আমি এটি এটি তৈরি করেছি:

# Local Variables
OriginTable = "This must be a Table View or Feature Layer"
DestinationTable = "This must be a Table View or Feature Layer"
PrimaryKeyField = "Matching Origin Table Field"
ForiegnKeyField = "Matching Destination Table Field"

def buildWhereClauseFromList(OriginTable, PrimaryKeyField, valueList):
  """Takes a list of values and constructs a SQL WHERE
       clause to select those values within a given PrimaryKeyField
       and OriginTable."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(OriginTable).path, PrimaryKeyField)

    # Determine field type
    fieldType = arcpy.ListFields(OriginTable, PrimaryKeyField)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
    valueList = ["'%s'" % value for value in valueList]

    # Format WHERE clause in the form of an IN statement
    whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(map(str, valueList)))
    return whereClause

def selectRelatedRecords(OriginTable, DestinationTable, PrimaryKeyField, ForiegnKeyField):
    """Defines the record selection from the record selection of the OriginTable
      and applys it to the DestinationTable using a SQL WHERE clause built
      in the previous defintion"""

    # Set the SearchCursor to look through the selection of the OriginTable
    sourceIDs = set([row[0] for row in arcpy.da.SearchCursor(OriginTable, PrimaryKeyField)])

    # Establishes the where clause used to select records from DestinationTable
    whereClause = buildWhereClauseFromList(DestinationTable, ForiegnKeyField, sourceIDs)

    # Process: Select Layer By Attribute
    arcpy.SelectLayerByAttribute_management(DestinationTable, "NEW_SELECTION", whereClause)

# Process: Select related records between OriginTable and DestinationTable
selectRelatedRecords(OriginTable, DestinationTable, PrimaryKeyField, ForiegnKeyField)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.