डेस्कटॉप के लिए ArcGIS का उपयोग करके क्षेत्र में डुप्लिकेट रिकॉर्ड ढूँढना?


9

मैं 'ID' नामक विशेषता के आधार पर dbf फ़ाइलों में डुप्लिकेट रिकॉर्ड की तलाश कर रहा हूं। मेरे पास 500,000 से लेकर 1.5 मिलियन तक की विभिन्न dbf फाइलें हैं और मुझे पता है कि डुप्लिकेट के एक मेजबान हैं।

मैं एक फ़ील्ड 'डुप्लिकेट' जोड़ना चाहूंगा जो कहता है कि हां या नहीं (या 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 को डुप्लिकेट के रूप में चिह्नित करने की आवश्यकता होगी क्योंकि आईडी कहीं और मौजूद है।

निम्नलिखित कोड का उपयोग करने से आपको 1 बार और बाद में 1 अर्थ के साथ आईडी कितनी बार होती है, इसका एक वृद्धिशील काउंट होगा;

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

isDuplicateIndex( !YOUR_FIELD! )

मैं सिर्फ एक 1 (या हाँ) चाहता हूं अगर उस रिकॉर्ड की आईडी कहीं और मौजूद है! (ArcGIS संस्करण 10.1)

मैंने डुप्लिकेट रिकॉर्ड (फॉलो अप) की पहचान के लिए पायथन स्क्रिप्ट जैसे अन्य उत्तर देखे हैं, लेकिन यह काफी काम नहीं करता है।

जवाबों:


11

एक वैकल्पिक समाधान आर्कजीआईएस में मौजूदा " सारांश सांख्यिकी " उपकरण का उपयोग करना है , फिर आप आईडी फ़ील्ड के आधार पर परिणामी तालिका में शामिल होते हैं। डुप्लिकेट में 1 से बड़ा "COUNT" होगा, इसलिए इसे अपने फ़ील्ड कैलकुलेटर के साथ गणना करना सरल है।


आपकी विधि '0' के रूप में पाए गए पहले डुप्लिकेट रिकॉर्ड को कैसे प्राप्त करती है?
कलाकृति 21

@ radouxju आपके उत्तर के लिए धन्यवाद, मैं देख सकता हूं कि केवल विशेषता द्वारा चयन करके बहुभुज की कितनी मात्रा डुप्लिकेट हैं। जब सभी अजगर सामान किया तो मुझे यह आश्चर्य नहीं हुआ!
सैम

@ कलाकृति21 मैं नहीं चाहता था कि 1 डुप्लिकेट 0 हो, मुझे कुछ भी चाहिए था जो एक डुप्लिकेट था 'YES', या अब - जैसा कि यह है - 1 से अधिक संख्या
सैम

@Sam, आप इस कथन के बारे में क्या कह रहे हैं, "हालाँकि, 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। मैं वास्तव में इसे फाइल जियोडैट डेटाबेस में काम करने का एक तरीका नहीं देखता हूं। मुझे पता है कि यह तकनीकी लेख कुछ हद तक दिनांकित है, लेकिन यह आपके SQL कथन का स्रोत प्रतीत होता है और यह इंगित करता है कि यह फ़ाइल जियोडैट डेटाबेस में काम नहीं करता है। अगर मैं इसे फ़ाइल gdbs में काम कर सकता हूं, या आपके अपवाद को इंगित करने के लिए स्पष्टीकरण जोड़ा जाता है, तो मैं आपके उत्तर को तैयार करने के लिए तैयार हूं।
isburns

@ आईबर्न मुझे गलत थे, एसडीई वातावरण में काम करता है और जियोडैटबेस फाइल नहीं करता है। एक चीज़ जो आप वर्कअराउंड के रूप में कर सकते हैं, वह है एक्सेल में टेबल डेटा को डुप्लिकेट खोजने के लिए और फिर आर्कगिस में डुप्स की सूची में शामिल करें, जो तब केवल उन रिकॉर्ड को दिखाएगा, आदर्श नहीं बल्कि काम करता है।
ट्रिस्टन फॉरवर्ड

1
अद्यतन के लिए धन्यवाद। मैंने आपके उत्तर को गलत ठहराया क्योंकि यह काम करता है और समर्थित जियोडैट डेटाबेस में काफी सरल और तेज है। मुझे पता है कि यह अभी टिप्पणियों में है, लेकिन आप स्वयं यह इंगित करने के लिए पोस्ट को संपादित करना चाह सकते हैं कि यह व्यक्तिगत और एसडीई जियोडैट डेटाबेस में काम करता है, लेकिन जियोडैट डेटाबेस या आकृति फाइल नहीं।
इस्बर्न

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!)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.