आर्कजीआईएस 10.2 में कौन से तरीके उपलब्ध हैं, अंकों के चयन को बेतरतीब ढंग से कम करने के लिए। उदाहरण के लिए, संलग्न स्क्रीनशॉट में मुझे चयनित बिंदुओं का 20% रखने और बाकी को हटाने में दिलचस्पी है।
आर्कजीआईएस 10.2 में कौन से तरीके उपलब्ध हैं, अंकों के चयन को बेतरतीब ढंग से कम करने के लिए। उदाहरण के लिए, संलग्न स्क्रीनशॉट में मुझे चयनित बिंदुओं का 20% रखने और बाकी को हटाने में दिलचस्पी है।
जवाबों:
यहां एक अजगर फ़ंक्शन है जो वर्तमान चयन की अनदेखी करते हुए प्रतिशत के आधार पर एक परत में यादृच्छिक सुविधाओं का चयन करेगा:
def SelectRandomByPercent (layer, percent):
#layer variable is the layer name in TOC
#percent is percent as whole number (0-100)
if percent > 100:
print "percent is greater than 100"
return
if percent < 0:
print "percent is less than zero"
return
import random
fc = arcpy.Describe (layer).catalogPath
featureCount = float (arcpy.GetCount_management (fc).getOutput (0))
count = int (featureCount * float (percent) / float (100))
if not count:
arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
return
oids = [oid for oid, in arcpy.da.SearchCursor (fc, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
इसे ArcMap में अजगर के खोल में कॉपी / पेस्ट करें।
फिर शेल प्रकार में SelectRandomByPercent ("layer", num)
, जहां layer
आपकी परत का नाम है, और num
आपके प्रतिशत की पूरी संख्या है।
एक उप-चयन खोजने के लिए एक बदलाव के रूप में पूछा:
def SelectRandomByPercent (layer, percent):
#layer variable is the layer name in TOC
#percent is percent as whole number (0-100)
if percent > 100:
print "percent is greater than 100"
return
if percent < 0:
print "percent is less than zero"
return
import random
featureCount = float (arcpy.GetCount_management (layer).getOutput (0))
count = int (featureCount * float (percent) / float (100))
if not count:
arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
return
oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
अंत में, एक प्रतिशत के बजाय एक गिनती द्वारा एक परत का चयन करने के लिए एक और भिन्नता:
def SelectRandomByCount (layer, count):
import random
layerCount = int (arcpy.GetCount_management (layer).getOutput (0))
if layerCount < count:
print "input count is greater than layer count"
return
oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
random.sample()
।
sql
पैरामीटर के लिए स्ट्रिंग की लंबाई पर कोई ज्ञात सीमाएं हैं ?
आम तौर पर, मैं भी स्थानिक पारिस्थितिकी उपकरणों का उपयोग करने की सलाह देता हूं जैसा कि blah238 द्वारा चर्चा की गई है।
हालाँकि, एक और तरीका जिसे आप आज़मा सकते हैं, वह है रैंडम नंबर स्टोर करने के लिए रैंडम नामक एक विशेषता जोड़ना।
फिर, पायथन पार्सर के साथ उस विशेषता पर फ़ील्ड कैलकुलेटर का उपयोग करते हुए, निम्नलिखित कोडब्लॉक का उपयोग करें:
import random
def rand():
return random.random()
नीचे चित्र देखें:
यह 0 और 1. के बीच यादृच्छिक मान पैदा करेगा। यदि आप 20% सुविधाओं का चयन करना चाहते हैं, तो आप उन विशेषताओं का चयन कर सकते हैं जहाँ यादृच्छिक मान 0.2 से कम है। बेशक, यह कई विशेषताओं के साथ बेहतर काम करेगा। मैंने परीक्षण के रूप में केवल 7 सुविधाओं के साथ एक फीचर वर्ग बनाया और 0.2 से कम कोई मान नहीं था। हालाँकि, ऐसा लगता है कि आपके पास बहुत सारी सुविधाएँ हैं, ताकि कोई फर्क न पड़े।
ArcGIS डेस्कटॉप के लिए उपलब्ध @StephenLead से यादृच्छिक स्क्रिप्ट में पहले से चुनिंदा विशेषताएं भी हैं । हालाँकि, मैंने लिखा है, मुझे लगता है कि ArcGIS 9.x के लिए, और आखिरी बार 2008 में, मैंने इसे 2010 में 10.0 के आसपास इस्तेमाल किया, और इसने अच्छा काम किया।
आप Hawth's टूल्स को आज़मा सकते हैं: http://www.spatialecology.com/htools/rndsel.php
ध्यान दें कि मौजूदा चयन सम्मानित नहीं है, इसलिए आपको पहले मौजूदा चयन से एक फीचर लेयर बनाना होगा।
यहाँ एक और रैंडम सेलेक्शन ऐड-इन आर्कगिस 10, सैम्पलिंग डिज़ाइन टूल है । यह आपको अपने डेटासेट में 20% सुविधाओं का चयन करने देगा। हालाँकि, यह यादृच्छिक चयन करने के लिए एक चयनित सेट का उपयोग नहीं करता है, यह ब्लाह 238 द्वारा उल्लिखित हॉथ्स टूल्स के प्रतिबंधों के समान है।
आप सबसेट फीचर्स टूल का भी उपयोग कर सकते हैं । प्रलेखन के अनुसार:
मूल डेटासेट को दो भागों में विभाजित करता है: एक भाग का उपयोग स्थानिक संरचना को मॉडल करने के लिए और एक सतह का उत्पादन करने के लिए किया जाता है, दूसरे का उपयोग आउटपुट सतह की तुलना और मान्य करने के लिए किया जाता है।
एक नुकसान यह है कि आपको भूस्थैतिक विश्लेषक विस्तार की आवश्यकता है।