如何随机选择所选点的X%?


16

ArcGIS 10.2中提供了哪些方法来随机选择点集。例如,在所附的屏幕截图中,我有兴趣保留20%的选定点并删除其余的点。

在此处输入图片说明


好吧,我认为没有从图层中选择随机点的默认方法。您尝试使用python脚本吗?还是外接程序?
Marcin D

Answers:


27

这是一个python函数,它将基于百分比选择图层中的随机特征,而忽略当前选择:

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中的python shell中。

然后在shell中键入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()
亚伦

谢谢@亚伦。我更新了子集选择的答案,而没有先导出。
Emil Brundage 2015年

+1。sql参数的字符串长度是否存在已知限制?
保罗

@Paul我刚刚测试了这段代码,以选择具有100万个要素的图层,该图层具有将近400万个要素,这导致了内存错误。因此,尽管似乎没有硬字符串限制,但对内存有依赖性。Oracle SDE数据库还有一个SQL项限制,我已经在此处发布
Emil Brundage


13

通常,我还建议使用blah238讨论的空间生态工具。

但是,您可以尝试的另一种方法是添加一个名为Random的属性来存储随机数: 在此处输入图片说明

然后,使用该属性的字段计算器和Python Parser,使用以下代码块:

import random
def rand():
  return random.random()

见下图:

这将创建介于0和1之间的随机值。然后,如果要选择20%的特征,则可以选择Random值小于0.2的特征。当然,这将与许多功能一起更好地工作。我创建了一个只有7个要素作为测试的要素类,并且所有值都不小于0.2。但是,您似乎具有很多功能,所以没关系。

在此处输入图片说明


7
此方法将平均返回20%的功能,在某些情况下将是首选方法。但是,如果您每次都希望20%,则可以按照建议进行操作,然后按随机值对要素进行排序,然后选择前20%。
Llaves

Esri在博客中使用了此过程:support.esri.com/en/technical-article/000013141
Emil Brundage,

6

@StephenLead的随机脚本中还有早期版本的Select功能,可用于ArcGIS Desktop。虽然我认为是针对ArcGIS 9.x编写的,但最后一次修改是在2008年,但我在2010年的10.0左右才使用它,但它仍然运行良好。


5

您可以尝试使用霍斯工具:http : //www.spatialecology.com/htools/rndsel.php

请注意,现有选择不被接受,因此您必须首先从现有选择中制作要素图层。


不幸的是,该版本与ArcGIS 9.3及更高版本不兼容。现在,它被称为地理空间建模环境:spatialecology.com/gme
kenbuja

好点,这里是GME中的等效命令:spatialecology.com/gme/rsample.htm
blah238 2013年

GME工具集无法在“ ArcGIS内部”运行,而是一个独立的工具
Ryan Garnett 2015年

3

这是ArcGIS 10的另一个随机选择加载项,即采样设计工具。它可以让您选择数据集中20%的特征。但是,这不使用选择的集合进行随机选择,类似于blah238提到的Hawth工具的限制。


0

您也可以使用“ 子集特征”工具。根据文档:

将原始数据集分为两部分:一个部分用于对空间结构建模并生成表面,另一部分用于比较和验证输出表面。

缺点之一是您需要Geostatistical Analyst扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.