Những phương thức nào có sẵn trong ArcGIS 10.2 để tập hợp ngẫu nhiên một lựa chọn các điểm. Ví dụ, trong ảnh chụp màn hình đính kèm, tôi quan tâm đến việc giữ 20% số điểm đã chọn và xóa phần còn lại.
Những phương thức nào có sẵn trong ArcGIS 10.2 để tập hợp ngẫu nhiên một lựa chọn các điểm. Ví dụ, trong ảnh chụp màn hình đính kèm, tôi quan tâm đến việc giữ 20% số điểm đã chọn và xóa phần còn lại.
Câu trả lời:
Đây là một hàm python sẽ chọn các tính năng ngẫu nhiên trong một lớp dựa trên phần trăm, bỏ qua lựa chọn hiện tại:
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)
Sao chép / dán cái này vào shell python trong ArcMap.
Sau đó, trong loại vỏ SelectRandomByPercent ("layer", num)
, layer
tên của lớp của bạn và num
là một số phần trăm của bạn.
Một biến thể để tìm một lựa chọn tập hợp con như đã hỏi:
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)
Cuối cùng, thêm một biến thể để chọn một lớp theo số đếm, thay vì phần trăm:
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
tham số không?
Nói chung, tôi cũng khuyên bạn nên sử dụng các công cụ sinh thái không gian như được thảo luận bởi blah238.
Tuy nhiên, một phương pháp khác bạn có thể thử là thêm một thuộc tính có tên Random để lưu một số ngẫu nhiên:
Sau đó, bằng cách sử dụng máy tính trường trên thuộc tính đó, với Trình phân tích cú pháp Python, sử dụng bộ mã sau:
import random
def rand():
return random.random()
Xem hình ảnh dưới đây:
Điều này sẽ tạo các giá trị ngẫu nhiên trong khoảng từ 0 đến 1. Sau đó, nếu bạn muốn chọn 20% các tính năng, bạn có thể chọn các tính năng trong đó giá trị Ngẫu nhiên nhỏ hơn 0,2. Tất nhiên, điều này sẽ hoạt động tốt hơn với nhiều tính năng. Tôi đã tạo một lớp đối tượng chỉ có 7 tính năng dưới dạng thử nghiệm và không có giá trị nào dưới 0,2. Tuy nhiên, có vẻ như bạn có nhiều tính năng, vì vậy điều đó không quan trọng.
Ngoài ra còn có một tính năng Chọn trước đó ở tập lệnh ngẫu nhiên từ @StephenLead có sẵn cho ArcGIS Desktop. Mặc dù được viết, tôi nghĩ, đối với ArcGIS 9.x và lần sửa đổi cuối cùng vào năm 2008, tôi đã sử dụng nó vào khoảng năm 2010 ở mức 10.0 và nó vẫn hoạt động tốt.
Bạn có thể dùng thử Công cụ của Hawth: http://www.spatialecology.com/htools/rndsel.php
Lưu ý rằng lựa chọn hiện tại không được vinh danh nên trước tiên bạn phải tạo một lớp đối tượng từ lựa chọn hiện có.
Đây là một bổ trợ lựa chọn ngẫu nhiên khác cho ArcGIS 10, Công cụ thiết kế lấy mẫu . Nó sẽ cho phép bạn chọn 20% các tính năng trong bộ dữ liệu của bạn. Tuy nhiên, điều này không sử dụng một bộ được chọn để tạo một lựa chọn ngẫu nhiên, tương tự như các hạn chế của Công cụ Hawth được đề cập bởi blah238.
Bạn cũng có thể sử dụng công cụ Tính năng tập hợp con . Theo tài liệu:
Chia tập dữ liệu gốc thành hai phần: một phần được sử dụng để mô hình hóa cấu trúc không gian và tạo ra một bề mặt, phần còn lại được sử dụng để so sánh và xác nhận bề mặt đầu ra.
Một nhược điểm là bạn cần phần mở rộng Phân tích địa lý.