มีวิธีการใดบ้างใน ArcGIS 10.2 เพื่อเลือกคะแนนย่อยแบบสุ่ม ตัวอย่างเช่นในภาพหน้าจอที่แนบมาฉันสนใจที่จะเก็บคะแนนที่เลือกไว้ 20% และลบที่เหลือ
มีวิธีการใดบ้างใน ArcGIS 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)
คัดลอก / วางสิ่งนี้ลงใน python shell ใน 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
อย่างไรก็ตามวิธีอื่นที่คุณสามารถลองได้คือการเพิ่มแอททริบิวชื่อ Random เพื่อเก็บหมายเลขสุ่ม:
จากนั้นใช้ตัวคำนวณฟิลด์บนแอตทริบิวต์นั้นด้วย Python Parser ใช้ codeblock ต่อไปนี้:
import random
def rand():
return random.random()
ดูภาพด้านล่าง:
สิ่งนี้จะสร้างค่าสุ่มระหว่าง 0 ถึง 1 จากนั้นหากคุณต้องการเลือก 20% ของฟีเจอร์คุณสามารถเลือกฟีเจอร์ที่ค่าสุ่มน้อยกว่า 0.2 แน่นอนว่ามันจะทำงานได้ดีขึ้นด้วยคุณสมบัติมากมาย ฉันสร้างคลาสคุณลักษณะที่มีคุณสมบัติเพียง 7 แบบทดสอบและไม่มีค่าน้อยกว่า 0.2 อย่างไรก็ตามดูเหมือนว่าคุณมีคุณสมบัติมากมายดังนั้นไม่ควรสำคัญ
นอกจากนี้ยังมีคุณสมบัติเลือกก่อนหน้านี้ที่สคริปต์แบบสุ่มจาก @StephenLead สำหรับ ArcGIS Desktop แม้ว่าจะเขียนแล้วฉันคิดว่าสำหรับ ArcGIS 9.x และแก้ไขล่าสุดในปี 2008 ฉันใช้มันในปี 2010 เวลา 10.0 และมันยังทำงานได้ดี
คุณสามารถลองใช้เครื่องมือของ Hawth: http://www.spatialecology.com/htools/rndsel.php
โปรดทราบว่าการเลือกที่มีอยู่ไม่ได้รับเกียรติดังนั้นคุณจะต้องสร้างเลเยอร์คุณลักษณะจากการเลือกที่มีอยู่ก่อน
คุณสามารถใช้เครื่องมือคุณสมบัติการจัดกลุ่ม ตามเอกสาร:
แบ่งชุดข้อมูลดั้งเดิมออกเป็นสองส่วน: ส่วนหนึ่งที่จะใช้ในการสร้างแบบจำลองโครงสร้างเชิงพื้นที่และผลิตพื้นผิวส่วนอื่น ๆ ที่จะใช้ในการเปรียบเทียบและตรวจสอบพื้นผิวเอาท์พุท
ข้อเสียอย่างหนึ่งคือคุณต้องมีส่วนขยายนักวิเคราะห์ทางภูมิศาสตร์