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.
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.
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:
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 layer
ist der Name Ihres Layers und num
ist eine ganze Zahl Ihrer Prozent.
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)
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:
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.
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.
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.
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.