আর্কজিআইএস ডেস্কটপ ব্যবহার করে বাছাই করা টেবিলটিতে ক্রমিক সংখ্যাগুলি গণনা করছেন?


11

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

#Pre-logic Script Code:
rec=0
def autoIncrement(): 
    global rec 
    pStart = 1  
    pInterval = 1 
    if (rec == 0):  
        rec = pStart  
    else:  
        rec += pInterval  
    return rec

#Expression:
autoIncrement()

আমি যা করার চেষ্টা করছি তার একটি উদাহরণ । আমি বছর, মাস, দিন অনুসারে বাছাই করার জন্য একটি উন্নত বাছাই ব্যবহার করেছি এবং এখন Seqক্ষেত্রটিতে ক্রমিক সংখ্যা পেতে চাই । আপনি দেখতে পাবেন যে আমার OBJECTIDক্ষেত্রটি ক্রমযুক্ত নয়, সুতরাং উপরের কোডটি কাজ করবে না।

এখানে চিত্র বর্ণনা লিখুন

এটি ফিল্ড ক্যালকুলেটরে বা আরকিটিতে আপডেট কার্সার ব্যবহার করে করা যায়?


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

@ মাইকেলমাইলস-সিমিটসন এটি কোনও খারাপ ধারণা নয়, আমি সিকের কাছে এই মানগুলি লিখতে চাইলে একটি সাজানোর ক্রম নির্ধারণ করতে সম্ভবত এটি অভিধানে লোড করতে পারতাম।
মিডাভালো

আমি এটি আগে এটি করেছি এবং এটি ভাল কাজ করেছে। আমি এখনই আমার কোড খুঁজে পাচ্ছি না; এটি একদিক বন্ধ ছিল তাই এটি সম্ভবত আমার একটি ব্যাকআপ ডিস্কে রয়েছে ... আমি যদি এটির সামনে এসে পৌঁছে যাই তবে আমি উত্তর হিসাবে পোস্ট করব - শর্ত থাকে যে ইতিমধ্যে এই প্রশ্নের কোনও ভাল উত্তর নেই isn't
মাইকেল সিলিমসন

আমি সর্বদা বিরক্ত হয়েছি যে আর্কজিআইএস এ এটি সহজে করা যায় না। যদিও এটি ম্যাপআইএনফো-তে তুচ্ছ। আমি যে সহজতম পথটি পৌঁছেছি তা হ'ল বাছাইয়ের সরঞ্জামটি ব্যবহার করা কিন্তু এটি অন্য একটি ডেটাसेट তৈরি করে যা আপনাকে আবার যোগ দিতে হবে।
Fezter

আপনার অজগর সিনট্যাক্স পুরোপুরি কাজ করে, এর জন্য ধন্যবাদ। আমি শুধু ভাবছি যে 0 এর পরিবর্তে 1 দিয়ে প্রথম সারিটি শুরু করা সম্ভব কিনা এটি সম্ভব হলে আপনি আমাকে এর জন্য কোডটি দিতে পারেন give ফ্রেড
ফ্রেড

উত্তর:


13

2 সাজানো ক্ষেত্র (আরোহণ) সহ "সমাধান":

mxd = arcpy.mapping.MapDocument("CURRENT")
lr=arcpy.mapping.ListLayers(mxd)[0]
tbl=arcpy.da.TableToNumPyArray(lr,("oid","A","B"))
bs=sorted(tbl, key=lambda x: (x[1], x[2]))
def sortSeq(fid,a,b):
 for i,ent in enumerate(bs):
   if ent[0]==fid: return i

--------------------------------------

sortSeq( !OID!, !A!, !B! )

এখানে চিত্র বর্ণনা লিখুন

নতুন সংস্করণ:

mxd = arcpy.mapping.MapDocument("CURRENT")
lr=arcpy.mapping.ListLayers(mxd)[0]
tbl=arcpy.da.TableToNumPyArray(lr,("oid","A","B"))
bs=sorted(tbl, key=lambda x: (x[1], x[2]))
aDict={}
for i,row in enumerate(bs):
 aDict[row[0]]=i
def sortSeq(fid):
 return aDict[fid]

-----------------------

sortSeq( !OID!)

10000 রেকর্ডে টাস্কটি শেষ করতে 1.5 সেকেন্ড সময় লাগে। আসল 2 মিনিটেরও বেশি সময় নেয়


আমি বিশ্বাস করি যে এই কোডের প্রথম চারটি লাইন প্রতিটি রেকর্ডের জন্য চলছে। এটি অনুমোদিত হতে হবে না, যেহেতু পুরো ক্যালকুলেশনের জন্য স্তরটি একবারে বাছাই করা দরকার। আমার পোস্টে আমি যে কৌশলটি দেখাব তা ব্যবহার করার বিষয়টি বিবেচনা করুন বা দেখান যে স্তরটি কেবলমাত্র প্রথম রেকর্ডের জন্য রেকর্ড সাজানোর ক্রম নির্ধারণ করতে একবারে কেবল পঠিত হচ্ছে।
রিচার্ড ফেয়ারহર્স্ট

@ রিচার্ডফায়ারহર્স্ট আমি আমার আসল প্রকাশটি 10 ​​হাজার রেকর্ডে পরীক্ষা করেছি, এটি সম্পূর্ণ করতে 2 মিনিট 06 সেকেন্ড সময় নিয়েছিল, পরিবর্তনের ফলে 5 সেকেন্ডের উন্নতি হয়েছিল in দেখে মনে হচ্ছে প্রতিটি রেকর্ডে প্রথম লাইনগুলি পুনরাবৃত্তি করা হয়নি। হ্যাঁ ফিল্ড ক্যালকুলেটরটি স্ক্রিপ্টের চেয়ে অনেক ধীর, যদিও সুবিধাজনক
ফেলিক্সআইপি

আমার গণনার বিপরীতে একই টেবিলটি পরীক্ষা করুন। যদি তারা গণনাটি করতে কার্যত একই সময় নেয় তবে আমি আপনার অনুমানটি গ্রহণ করব যে এটি কেবল একবারে প্রক্রিয়া করা হচ্ছে। 2 মিনিট 6 সেকেন্ড মোটামুটি ধীর।
রিচার্ড ফেয়ারহર્স্ট

ঠিক আছে 1.5 সেকেন্ডে মনে হয় যে প্রথম 4 টি লাইন প্রতিটি রেকর্ডের জন্য প্রক্রিয়া করা হচ্ছে না। যাইহোক, অভিধান হ'ল উভয় ক্ষেত্রে যাওয়ার উপায়। যাইহোক, যখন আমি চাই যে সেক নম্বরটি প্রতিটি ক্ষেত্রে রেকর্ডে অনন্য না হয় যখন অন্যান্য ক্ষেত্রের মান একই হয়? এটি 1: এম সম্পর্কের ক্ষেত্রে সম্পর্কিত টেবিলের জন্য আমি চাই।
রিচার্ড ফেয়ারহર્স্ট

অভিধানের জন্য +1 @ রিচার্ডফায়ারহર્স্ট। তালিকার মাধ্যমে পরিবর্তন করা আমার আসল অংশ ছিল। অনন্য হয়ে
উঠবেন না

6

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

তিনটি ক্ষেত্রের মানগুলি একটি কীতে ডুবিয়ে রাখতে হবে যা সঠিকভাবে বাছাই করবে key আমি ধরে নেব যে সমস্ত 3-ক্ষেত্রের সংমিশ্রণের মানগুলি স্যাম্পেলপয়েন্ট টেবিলের মধ্যে অনন্য, আপনি 8 নং লাইনে পাথ এবং শেপফিলের নাম সরবরাহ করতে হবে (বা আমি ফেলিক্সআইপি যে কৌশলটি ব্যবহার করতে পারি যেখানে বর্তমান মানচিত্রের প্রথম স্তরটি ব্যবহৃত হয়)। আপনি যদি কোনও কীটির জন্য বিভিন্ন ক্ষেত্র ব্যবহার করতে চান তবে আপনাকে 10 নং লাইনে ফিল্ডের তালিকাটি পরিবর্তন করতে হবে এবং লাইন 3 এবং লাইন 15 এর ইনপুট ক্ষেত্রগুলির সাথে তাদের মিলিয়ে নিতে হবে।

#Pre-logic Script Code:
relateDict = {}
def autoIncrement(myYear, myMonth, myDay, OID): 
    global relateDict  
    # only populate the dictionary if it has no keys  
    if len(relateDict) == 0:  
        # Provide the path to the relate feature class/table  
        relateFC = r"C:\Users\OWNER\Documents\ArcGIS\SamplePoints.shp"  
        # create a field list with the relate fields in sort order  
        relateFieldsList = ["Year", "Month", "Day", "OID@"]  
        # process a da search cursor to transfer the data to the dictionary  
        relateList = sorted([(r[0:]) for r in arcpy.da.SearchCursor(relateFC, relateFieldsList)])
        for relateSort in range(0, len(relateList)):
            relateDict[relateList[relateSort]] = relateSort + 1
    return relateDict[(myYear,myMonth,myDay,OID)]    

#Expression:
autoIncrement(!Year!, !Month!, !Day!, !OBJECTID!)

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

যদি এই টেবিলটির উদ্দেশ্য এটি একটি বহু-ক্ষেত্র কীতে অন্য টেবিল / বৈশিষ্ট্য বর্গের সাথে সম্পর্কিত হয়, তবে আমার ব্লগে আমি যে সরঞ্জামটি একক ক্ষেত্র কী থেকে একক ক্ষেত্র কী সরঞ্জাম হিসাবে তৈরি করেছি তা ব্যবহার করে বিবেচনা করুন - একের বেশি ভিত্তিতে দুটি স্তর সম্পর্কিত ক্ষেত্র


এটি ডুপ্লিকেটগুলি কীভাবে পরিচালনা করবে?
ফেলিক্সআইপি

ক্ষেত্র তালিকায় ওআইডি যুক্ত করুন। এটি অনন্য কিনা তা নিশ্চিত করতে আমি ফিল্ড তালিকায় ওআইডি যুক্ত করেছি।
রিচার্ড ফেয়ারহর্સ્ટ

বিকল্পভাবে যদি সেখানে ডুপ্লিকেট থাকে এবং ব্যবহারকারী সমস্ত ডুপ্লিকেট একই SEQ মান পেতে চায় তবে লজ জন্য চালানো এবং অভিধানে যুক্ত করার আগে তালিকায় অবজেক্টআইডি রেখে সেট () ব্যবহার করুন।
রিচার্ড ফেয়ারহর্સ્ટ

+1 ধন্যবাদ @ রিচার্ডফায়ারহર્স্ট, আরকিটিতে লেখার আমার প্রচেষ্টার মতোই, যদিও আমি বুঝতে পারি নি যে আপনি ফিল্ড ক্যালকুলেটরের মধ্যে থেকে বেশিরভাগটিকে কল করতে পারবেন
মিডাভালো

3

আমার একই প্রশ্ন ছিল তবে সরল সমস্যার জন্য, কেবলমাত্র একটি ক্ষেত্র বাছাই করার ভিত্তিতে। আমি নিম্নলিখিত স্ক্রিপ্ট দিয়ে সফল ছিল:

# Pre-Logic Script Code:
# Specify that the target Map Document is the current one
mxd = arcpy.mapping.MapDocument("CURRENT")
# Specify that the target layer is the first layer in the table of 
# content
lr=arcpy.mapping.ListLayers(mxd)[0]

tbl=arcpy.da.TableToNumPyArray(lr,("fid","Name_of_sorted_Field"))
bs=sorted(tbl,key=lambda x: x[1])
aDict={}
for i,row in enumerate(bs):
 aDict[row[0]]=i
def sortSeq(fid):
 return aDict[fid]

---------------------------------------------------------------
# to run the code, the following goes in the expression window
sortSeq(!FID!)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.