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.
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:
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)
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.
Eine Variation, um eine Teilmengenauswahl wie folgt zu finden:
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)
Zum Schluss noch eine Variation, um eine Ebene nach Anzahl anstatt nach Prozent auszuwählen:
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)
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
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:
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.
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.
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.
Beachten Sie, dass die vorhandene Auswahl nicht berücksichtigt wird, sodass Sie zuerst einen Feature-Layer aus der vorhandenen Auswahl erstellen müssen.
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.
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.
Antworten:
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:
Kopieren Sie diese in die Python-Shell in ArcMap.
Dann in der Shell-Typ
SelectRandomByPercent ("layer", num)
, wolayer
ist der Name Ihres Layers undnum
ist eine ganze Zahl Ihrer Prozent.Eine Variation, um eine Teilmengenauswahl wie folgt zu finden:
Zum Schluss noch eine Variation, um eine Ebene nach Anzahl anstatt nach Prozent auszuwählen:
quelle
random.sample()
.sql
Parameter?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:
Verwenden Sie dann mit dem Feldrechner für dieses Attribut und dem Python-Parser den folgenden Codeblock:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Sie können auch das Teilmengen-Feature- Tool verwenden. Nach der Dokumentation:
Ein Nachteil ist, dass Sie die Erweiterung Geostatistical Analyst benötigen.
quelle