Wie setze ich X% der ausgewählten Punkte zufällig ein?

15

Welche Methoden stehen in ArcGIS 10.2 zur Verfügung, um eine Auswahl von Punkten zufällig zu unterteilen? Im angehängten Screenshot möchte ich beispielsweise 20% der ausgewählten Punkte behalten und den Rest löschen.

Bildbeschreibung hier eingeben

Aaron
quelle
Nun, ich glaube nicht, dass es eine Standardmethode zum Auswählen von zufälligen Punkten aus Ebenen gibt. Hast du es mit Python-Skript versucht? Oder Add-In?
Marcin D

Antworten:

26

Hier ist eine Python-Funktion, mit der zufällige Features in einer Ebene basierend auf Prozent ausgewählt werden, wobei die aktuelle Auswahl ignoriert wird:

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)

Kopieren Sie diese in die Python-Shell in ArcMap.

Dann in der Shell-Typ SelectRandomByPercent ("layer", num), wo layerist der Name Ihres Layers und numist eine ganze Zahl Ihrer Prozent.

Zufällige Auswahl

Eine Variation, um eine Teilmengenauswahl wie folgt zu finden:

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)

Zum Schluss noch eine Variation, um eine Ebene nach Anzahl anstatt nach Prozent auszuwählen:

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)
Emil Brundage
quelle
Gute Verwendung von random.sample().
Aaron
Vielen Dank @Aaron. Ich habe die Antwort für eine Teilmengenauswahl aktualisiert, ohne sie zuerst zu exportieren.
Emil Brundage
+1. Gibt es bekannte Einschränkungen hinsichtlich der Stringlänge für den sqlParameter?
Paul
@Paul Ich habe diesen Code gerade getestet, um 100% der Features mit einem Layer auszuwählen, der fast 4 Millionen Features enthält, was zu einem Speicherfehler führte. Es scheint also keine feste Zeichenfolgenbeschränkung zu geben, aber es besteht eine Abhängigkeit vom Arbeitsspeicher. Es gibt auch ein SQL-Element-Limit für Oracle SDE-Datenbanken, über das ich hier gebloggt
Emil Brundage
1
Esri hat diesen Code in einem Blog verwendet. Support.esri.com/de/technical-article/000013141
Emil Brundage
13

Generell empfehle ich auch die von blah238 diskutierten räumlichen Ökologie-Tools.

Eine andere Methode, die Sie versuchen könnten, wäre das Hinzufügen eines Attributs namens Random, um eine Zufallszahl zu speichern: Bildbeschreibung hier eingeben

Verwenden Sie dann mit dem Feldrechner für dieses Attribut und dem Python-Parser den folgenden Codeblock:

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

Siehe Bild unten:

Dadurch werden Zufallswerte zwischen 0 und 1 erstellt. Wenn Sie 20% der Features auswählen möchten, können Sie Features auswählen, bei denen der Zufallswert unter 0,2 liegt. Natürlich wird dies mit vielen Funktionen besser funktionieren. Ich habe eine Feature-Class mit nur 7 Features als Test erstellt und es gab keine Werte unter 0,2. Es sieht jedoch so aus, als hättest du viele Funktionen, das sollte also keine Rolle spielen.

Bildbeschreibung hier eingeben

Fezter
quelle
7
Diese Methode wird im Durchschnitt 20% der Features zurückgeben, was in einigen Fällen bevorzugt wäre. Wenn Sie jedoch jedes Mal 20% möchten, können Sie wie vorgeschlagen vorgehen, indem Sie die Features nach dem Zufallswert sortieren und die ersten 20% auswählen.
Llaves
Esri hat diesen Prozess in einem Blog verwendet: support.esri.com/de/technical-article/000013141
Emil Brundage
6

Für ArcGIS Desktop ist auch ein früheres Zufallsskript für Select-Features von @StephenLead verfügbar. Obwohl ich glaube, dass es für ArcGIS 9.x geschrieben und zuletzt im Jahr 2008 geändert wurde, habe ich es etwa 2010 bei 10.0 verwendet, und es hat immer noch gut funktioniert.

PolyGeo
quelle
5

Sie können Hawth's Tools ausprobieren: http://www.spatialecology.com/htools/rndsel.php

Beachten Sie, dass die vorhandene Auswahl nicht berücksichtigt wird, sodass Sie zuerst einen Feature-Layer aus der vorhandenen Auswahl erstellen müssen.

blah238
quelle
Leider ist diese Version nicht mit ArcGIS 9.3 und höher kompatibel. Jetzt ist es Geospatial Modellierungsumgebung genannt: spatialecology.com/gme
kenbuja
Guter Punkt, hier ist der entsprechende Befehl in GME: spatialecology.com/gme/rsample.htm
blah238
Das GME-Toolset funktioniert nicht in ArcGIS, sondern ist ein eigenständiges Tool
Ryan Garnett,
3

Hier ist ein weiteres Zufallsauswahl-Add-In für ArcGIS 10, das Sampling Design Tool . Damit können Sie 20% der Features in Ihrem Datensatz auswählen. Hierbei wird jedoch kein ausgewählter Satz verwendet, um eine zufällige Auswahl zu treffen, ähnlich den Einschränkungen der von blah238 erwähnten Hawth's Tools.

Kenbuja
quelle
0

Sie können auch das Teilmengen-Feature- Tool verwenden. Nach der Dokumentation:

Unterteilt den Originaldatensatz in zwei Teile: Ein Teil dient zum Modellieren der räumlichen Struktur und zum Erzeugen einer Oberfläche, der andere zum Vergleichen und Validieren der Ausgabeoberfläche.

Ein Nachteil ist, dass Sie die Erweiterung Geostatistical Analyst benötigen.

Ernesto561
quelle