Какие методы доступны в ArcGIS 10.2 для случайного подмножества выбранных точек. Например, на прикрепленном скриншоте я заинтересован в сохранении 20% выбранных точек и удалении остальных.
Какие методы доступны в ArcGIS 10.2 для случайного подмножества выбранных точек. Например, на прикрепленном скриншоте я заинтересован в сохранении 20% выбранных точек и удалении остальных.
Ответы:
Вот функция 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)
Скопируйте / вставьте это в оболочку python в 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, используйте следующий кодовый блок:
import random
def rand():
return random.random()
Смотрите изображение ниже:
Это создаст случайные значения в диапазоне от 0 до 1. Затем, если вы хотите выбрать 20% объектов, вы можете выбрать объекты, в которых значение Random меньше 0,2. Конечно, это будет работать лучше со многими функциями. В качестве теста я создал класс пространственных объектов, в котором было всего 7 объектов, и значения не превышали 0,2. Тем не менее, похоже, у вас есть много функций, так что это не должно иметь значения.
Для ArcGIS Desktop доступны также более ранние функции выбора в произвольном сценарии из @StephenLead. Хотя написано, я думаю, для ArcGIS 9.x и последний раз изменено в 2008 году, я использовал его примерно в 2010 году в 10.0, и он все еще работал хорошо.
Вы можете попробовать инструменты Hawth's: http://www.spatialecology.com/htools/rndsel.php
Обратите внимание, что существующий выбор не учитывается, поэтому вам сначала нужно создать векторный слой из существующего выбора.
Вот еще одна надстройка случайного выбора для ArcGIS 10, Инструмент проектирования выборки . Это позволит вам выбрать 20% функций в вашем наборе данных. Однако, это не использует выбранный набор, чтобы сделать случайный выбор, аналогично ограничениям Инструментов Хота, упомянутым в blah238.
Вы также можете использовать инструмент Subset Features . Согласно документации:
Делит исходный набор данных на две части: одна часть используется для моделирования пространственной структуры и создания поверхности, а другая - для сравнения и проверки выходной поверхности.
Недостатком является то, что вам нужно расширение Geostatistical Analyst.