Jakie metody są dostępne w ArcGIS 10.2 do losowego podziału wybranych punktów. Na przykład na załączonym zrzucie ekranu chcę zachować 20% wybranych punktów i usunąć resztę.
Jakie metody są dostępne w ArcGIS 10.2 do losowego podziału wybranych punktów. Na przykład na załączonym zrzucie ekranu chcę zachować 20% wybranych punktów i usunąć resztę.
Odpowiedzi:
Oto funkcja python, która wybiera losowe funkcje w warstwie na podstawie procentu, ignorując bieżący wybór:
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)
Skopiuj / wklej to do powłoki Pythona w ArcMap.
Następnie w typie powłoki SelectRandomByPercent ("layer", num)
, gdzie layer
jest nazwa warstwy i num
jest to cała liczba procentowa.
Wariant znalezienia wyboru podzbioru zgodnie z zapytaniem:
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)
Na koniec jeszcze jedna odmiana, aby wybrać warstwę według liczby zamiast wartości procentowej:
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
parametru?
Zasadniczo polecam także korzystanie z narzędzi ekologii przestrzennej, o czym mówi blah238.
Jednak inną metodą, którą możesz wypróbować, byłoby dodanie atrybutu o nazwie Losowo w celu przechowywania losowej liczby:
Następnie, korzystając z kalkulatora pola dla tego atrybutu, w parserze Python, użyj następującego kodu:
import random
def rand():
return random.random()
Zobacz zdjęcie poniżej:
Spowoduje to utworzenie losowych wartości od 0 do 1. Następnie, jeśli chcesz wybrać 20% funkcji, możesz wybrać funkcje, w których wartość Losowa jest mniejsza niż 0,2. Oczywiście będzie to działać lepiej z wieloma funkcjami. Stworzyłem klasę funkcji z tylko 7 funkcjami jako test i nie było wartości mniejszych niż 0,2. Wygląda jednak na to, że masz wiele funkcji, więc nie powinno to mieć znaczenia.
Istnieją również wcześniejsze funkcje Select losowego skryptu z @StephenLead dostępne dla ArcGIS Desktop. Chociaż napisane, jak sądzę, dla ArcGIS 9.x i ostatnio zmodyfikowane w 2008 roku, korzystałem z niego około 2010 roku w wersji 10.0 i nadal działało dobrze.
Możesz wypróbować narzędzia Hawtha: http://www.spatialecology.com/htools/rndsel.php
Zauważ, że istniejąca selekcja nie jest honorowana, więc najpierw musisz utworzyć warstwę obiektów z istniejącej selekcji.
Oto kolejny dodatek do losowego wyboru ArcGIS 10, Sampling Design Tool . Pozwoli ci to wybrać 20% funkcji w zbiorze danych. Jednak to nie używa wybranego zestawu do losowego wyboru, podobnie jak ograniczenia Hawth's Tools wspomniane przez blah238.
Możesz także użyć narzędzia Funkcje podzbioru . Zgodnie z dokumentacją:
Dzieli oryginalny zestaw danych na dwie części: jedna część służy do modelowania struktury przestrzennej i tworzenia powierzchni, a druga do porównywania i walidacji powierzchni wyjściowej.
Wadą jest to, że potrzebujesz rozszerzenia Geostatistic Analyst.