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ę.
Nie sądzę, że istnieje domyślna metoda wybierania losowych punktów z warstwy. Próbowałeś ze skryptem Python? Lub dodatek?
Marcin D
Odpowiedzi:
27
Oto funkcja python, która wybiera losowe funkcje w warstwie na podstawie procentu, ignorując bieżący wybór:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
fc = arcpy.Describe(layer).catalogPath
featureCount = float (arcpy.GetCount_management(fc).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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 layerjest nazwa warstwy i numjest to cała liczba procentowa.
Wariant znalezienia wyboru podzbioru zgodnie z zapytaniem:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
featureCount = float (arcpy.GetCount_management(layer).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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:
defSelectRandomByCount(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)
Dzięki @Aaron. Zaktualizowałem odpowiedź dotyczącą wyboru podzbioru bez wcześniejszego eksportowania.
Emil Brundage
+1. Czy są jakieś znane ograniczenia długości łańcucha dla sqlparametru?
Paul
@Paul Właśnie przetestowałem ten kod, aby wybrać 100% funkcji z warstwą, która ma prawie 4 miliony funkcji, co spowodowało błąd pamięci. Tak więc, chociaż wydaje się, że nie ma sztywnego limitu ciągów, istnieje zależność od pamięci. Istnieje również limit pozycji SQL dla baz danych Oracle SDE, o których pisałem tutaj na blogu
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.
metoda ta zwróci średnio 20% funkcji, co w niektórych przypadkach byłoby preferowane. Ale jeśli chcesz 20% za każdym razem, możesz zrobić zgodnie z sugestią, a następnie posortować funkcje według losowej wartości i wybrać pierwsze 20%.
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.
Niestety, ta wersja nie jest kompatybilna z ArcGIS 9.3 i nowszymi. Teraz nazywa się to Środowisko modelowania geoprzestrzennego: spatialecology.com/gme
Zestaw narzędzi GME nie działa „w” ArcGIS, a raczej jest samodzielnym narzędziem
Ryan Garnett
3
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.
Odpowiedzi:
Oto funkcja python, która wybiera losowe funkcje w warstwie na podstawie procentu, ignorując bieżący wybór:
Skopiuj / wklej to do powłoki Pythona w ArcMap.
Następnie w typie powłoki
SelectRandomByPercent ("layer", num)
, gdzielayer
jest nazwa warstwy inum
jest to cała liczba procentowa.Wariant znalezienia wyboru podzbioru zgodnie z zapytaniem:
Na koniec jeszcze jedna odmiana, aby wybrać warstwę według liczby zamiast wartości procentowej:
źródło
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:
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.
źródło
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.
źródło
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.
źródło
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.
źródło
Możesz także użyć narzędzia Funkcje podzbioru . Zgodnie z dokumentacją:
Wadą jest to, że potrzebujesz rozszerzenia Geostatistic Analyst.
źródło