Jak losowo podzielić X% wybranych punktów?


16

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ę.

wprowadź opis zdjęcia tutaj


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:

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 layerjest nazwa warstwy i numjest to cała liczba procentowa.

Losowy wybór

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)

Niezłe wykorzystanie random.sample().
Aaron

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
Emil Brundage


13

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: wprowadź opis zdjęcia tutaj

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.

wprowadź opis zdjęcia tutaj


7
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%.
Llaves,

Esri zastosowała ten proces na blogu: support.esri.com/en/technical-article/000013141
Emil Brundage

6

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.


5

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.


Niestety, ta wersja nie jest kompatybilna z ArcGIS 9.3 i nowszymi. Teraz nazywa się to Środowisko modelowania geoprzestrzennego: spatialecology.com/gme
kenbuja

Dobra uwaga, oto równoważne polecenie w GME: spatialecology.com/gme/rsample.htm
blah238

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.


0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.