ডেস্কটপের জন্য আর্কজিআইএস ব্যবহার করে মাঠে নকল রেকর্ড সন্ধান করছেন?


9

আমি 'আইডি' নামক বৈশিষ্ট্যের উপর ভিত্তি করে ডিবিএফ ফাইলগুলিতে নকল রেকর্ড খুঁজছি। আমার কাছে 500,000 রেকর্ড থেকে 1.5 মিলিয়ন পর্যন্ত বিভিন্ন ডিবিএফ ফাইল রয়েছে এবং আমি জানি যে এখানে অনেকগুলি নকল রয়েছে।

আইডি বৈশিষ্ট্যটি অন্য কোথাও উপস্থিত থাকলে আমি 'ফিল্ড' নকল করতে চাই যা হ্যাঁ বা না (বা 1 বা 0 জরিমানা) বলে। ফিল্ড ক্যালকুলেটরে নিম্নলিখিত পাইথন স্ক্রিপ্টটি ব্যবহার করে সদৃশ প্রবেশের জন্য 1 এবং অনন্য প্রবেশের জন্য 0 প্রদান করে;

uniqueList = []
def isDuplicate(inValue):
  if inValue in uniqueList:
    return 1
  else:
    uniqueList.append(inValue)
    return 0
isDuplicate(!FIELD_NAME!)

তবে এর 1 ম রেকর্ড, উদাহরণস্বরূপ, 5 টি সদৃশ আইডিও 0 হিসাবে প্রত্যাবর্তিত হবে (পরবর্তী 4 টি নকল হিসাবে বিবেচিত হবে)। আইডি অন্য কোথাও বিদ্যমান বলে নকল হিসাবে চিহ্নিত করার জন্য আমার সমস্ত 5 টির প্রয়োজন হবে।

নীচের কোডটি ব্যবহার করা আপনাকে সেই আইডি সংখ্যার সাথে প্রথমবারের মতো আরও কতবার আসে তার একটি বার্ষিক গণনা দেয়;

UniqueDict = {}
def isDuplicateIndex(inValue):
    UniqueDict.setdefault(inValue,0)
    UniqueDict[inValue] += 1
    return UniqueDict[inValue]

isDuplicateIndex( !YOUR_FIELD! )

আমি কেবল একটি 1 (বা হ্যাঁ) চাই যদি সেই রেকর্ডটির আইডি অন্য কোথাও উপস্থিত থাকে! (আরকজিআইএস সংস্করণ 10.1)

সদৃশ রেকর্ড সনাক্তকরণের জন্য পাইথন স্ক্রিপ্টের মতো অন্যান্য উত্তরগুলি আমি দেখেছি (ফলোআপ) তবে এটি কার্যকরভাবে কার্যকর হয় না।

উত্তর:


11

বিকল্প সমাধান হ'ল আর্কজিআইএস- এ বিদ্যমান " সংক্ষিপ্ত পরিসংখ্যান " সরঞ্জামটি ব্যবহার করা , তারপরে আপনি নিজের আইডি ক্ষেত্রের ভিত্তিতে ফলাফল সারণিতে যোগ দিন join সদৃশগুলিতে 1 এর চেয়ে বড় "COUNT" থাকবে, সুতরাং এটি আপনার ক্ষেত্রের ক্যালকুলেটর দিয়ে গণনা করা সহজ।


আপনার পদ্ধতিটি '0' হিসাবে পাওয়া প্রথম সদৃশ রেকর্ডটি নির্ধারণ করে কীভাবে অর্জন করে?
আর্টওয়ার্ক 21

@ রডউক্সজু আপনার উত্তরের জন্য ধন্যবাদ, আমি এখনই গুণাবলী দ্বারা নির্বাচন করে কতগুলি বহুভুজের নকল হতে পারে তা দেখতে পাচ্ছি। সমস্ত অজগর জিনিসগুলি যখন আমার কাছে ঘটে তখন অবাক!
স্যাম

@ আর্টওয়ার্ক 21 আমি 1 ম সদৃশ 0 হতে চাইনি, ডুপ্লিকেটটি 'হ্যাঁ' হওয়ার জন্য বা এখন যেমন
স্যাম

@ স্যাম, আপনি এই বিবৃতিটির সাথে কী উল্লেখ করছেন, "তবে 1 ম রেকর্ড, উদাহরণস্বরূপ, 5 টি সদৃশ আইডিও 0 হিসাবে ফিরে আসবে?"?
শিল্পকর্ম 21

@ artwork21। দুঃখিত, আমি মনে করি আমার মূল শব্দটি খুব পরিষ্কার ছিল না, আমি সংশোধন করব। আমি যা বলতে চাইছিলাম তা হ'ল যদি 5 টি রেকর্ডের সকলের একই আইডি থাকে তবে সেই পাইথন কোডের টুকরোটি 1 ম উদাহরণটিকে একটি অনন্য আইডি হিসাবে এবং পরবর্তী 4টিকে নকল হিসাবে চিহ্নিত করবে। আমি চেয়েছিলাম সমস্ত 5 জনকে নকল হিসাবে চিহ্নিত করা উচিত (অর্থাত্ এই আইডিটি অন্য কোথাও বিদ্যমান ছিল)
স্যাম

1

আর একটি বিকল্প সমাধান ( কেবলমাত্র এসডিই পরিবেশের সাথে কাজ করে ) হ'ল নকল রেকর্ডগুলি দেখানোর জন্য আর্কজিআইএস-এ বিদ্যমান এসকিউএল কার্যকারিতা ব্যবহার করা

সারণীতে সদৃশ রেকর্ডগুলি পান (গুণ অনুসারে নির্বাচন করুন)

[FIELD_NAME] In (SELECT [FIELD_NAME] FROM [TABLE_NAME] GROUP BY [FIELD_NAME] HAVING Count(*)>1 )

উদাহরণ:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )

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

কোয়েরিটি সরাসরি আপনার পোস্ট থেকে অনুলিপি করা হয় এবং সঠিক টেবিল এবং ক্ষেত্রের নামগুলি উল্লেখ করে। আমি সরিয়ে দিলে ক্যোয়ারীটি বৈধ HAVING COUNT(*) > 1ফাইল জিওডাটাবেজে কাজ করার উপায়টি আমি সত্যিই দেখছি না । আমি জানি এই প্রযুক্তি নিবন্ধটি কিছুটা তারিখযুক্ত তবে এটি আপনার এসকিউএল বিবৃতিটির উত্স বলে মনে হচ্ছে এবং এটি ইঙ্গিত করে যে এটি ফাইল জিওডাটাবেজে কাজ করে না। আমি যদি আপনার জিডিবিএসকে ফাইল জিডিবিএসে কাজ করতে পারি তবে আমি আপনার উত্তরটিকে উজ্জীবিত করতে প্রস্তুত বা সেগুলি ব্যতিক্রম তা বোঝাতে স্পষ্টতা যুক্ত করা হয়েছে।
isburns

@ আইসবার্নস আমার ভুল হয়েছে, এসডিই পরিবেশে কাজ করে জিওডাটাবেস ফাইল করে না। এক্সক্লুডে টেবিলের ডেটা ডুপ্লিকেটগুলি সন্ধান করতে এবং তারপরে আর্কজিআইএস-এ ফিরে আসা ডুপের তালিকায় যোগ দিতে হবে এমন একটি জিনিস যা আপনি কাজ করতে পারেন তা হ'ল আদর্শ নয় তবে কাজ করে।
ত্রিস্তান ফরোয়ার্ড

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

0

নিম্নলিখিত স্ক্রিপ্ট একটি নির্দিষ্ট ক্ষেত্র থেকে প্রতিটি মানের সংখ্যার সাথে একটি নতুন ক্ষেত্র তৈরি করে। সুতরাং, প্রাক্তন হিসাবে, যদি আপনার সেই ক্ষেত্রে 6 বার "প্যারিস" থাকে তবে "প্যারিস" সহ প্রতিটি সারি একটি 6 পাবে।

import arcpy

arcpy.env.workspace=r"D:\test.gdb"
infeature="sample_feature"
field_in="sample_field"
field_out="COUNT_"+field_in

#create the field for the count values
arcpy.AddField_management(infeature,field_out,"SHORT")

#creating the list with all the values in the field, including duplicates
lista=[]
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field_in)    
    lista.append(i)
del cursor1, row

#updating the count field with the number on occurrences of field_in values
#in the previously created list
cursor2=arcpy.UpdateCursor(infeature)
for row in cursor2:
    i=row.getValue(field_in)
    occ=lista.count(i)   
    row.setValue(field_out,occ)
    cursor2.updateRow(row)
del cursor2, row
print ("Done.")

এটি সহজেই সংশোধন করা যেতে পারে যাতে আপনার "হ্যাঁ" বা 1 গণনা> 1 থাকলে, তবে আমি অনুমান করি যে প্রকৃত গণনা সংখ্যাটি বেশি কার্যকর।

পরে সম্পাদনা করুন: অথবা আপনি এটি ফিল্ড ক্যালকুলেটরে ব্যবহার করতে পারেন। প্রাক-লজিক স্ক্রিপ্ট কোড:

infeature="sample_feature" #change with the name of your feature
lista=[]
field="sample_field" #change with your field with duplicates
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field)    
    lista.append(i)
del cursor1, row

def duplicates(field_in):        
    occ=lista.count(field_in)
    return occ

সদৃশ ক্ষেত্র =

duplicates(!sample_field!)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.