Quali metodi sono disponibili in ArcGIS 10.2 per sottoporre casualmente una selezione di punti. Ad esempio, nello screenshot allegato sono interessato a mantenere il 20% dei punti selezionati e a eliminare il resto.
Quali metodi sono disponibili in ArcGIS 10.2 per sottoporre casualmente una selezione di punti. Ad esempio, nello screenshot allegato sono interessato a mantenere il 20% dei punti selezionati e a eliminare il resto.
Risposte:
Ecco una funzione Python che selezionerà le funzioni casuali in un livello in base alla percentuale, ignorando la selezione corrente:
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)
Copia / incolla questo nella shell python in ArcMap.
Quindi nel tipo di shell SelectRandomByPercent ("layer", num)
, dove si layer
trova il nome del layer, ed num
è un numero intero della percentuale.
Una variante per trovare una selezione di sottoinsieme come richiesto:
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)
Infine, un'altra variazione per selezionare un livello in base a un conteggio, anziché a una percentuale:
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
parametro?
In generale, consiglio anche di usare gli strumenti di ecologia spaziale discussi da blah238.
Tuttavia, un altro metodo che potresti provare sarebbe quello di aggiungere un attributo chiamato Casuale per memorizzare un numero casuale:
Quindi, usando il calcolatore di campo su quell'attributo, con Python Parser, usa il seguente blocco di codice:
import random
def rand():
return random.random()
Vedi l'immagine qui sotto:
Ciò creerà valori casuali tra 0 e 1. Quindi, se si desidera selezionare il 20% delle funzioni, è possibile selezionare funzioni in cui il valore Casuale è inferiore a 0,2. Naturalmente, questo funzionerà meglio con molte funzionalità. Ho creato una classe di funzionalità con solo 7 funzionalità come test e non c'erano valori inferiori a 0,2. Tuttavia, sembra che tu abbia molte funzionalità, quindi non dovrebbe importare.
Esiste anche una funzionalità Select precedente a script casuale da @StephenLead disponibile per ArcGIS Desktop. Anche se scritto, credo, per ArcGIS 9.xe modificato l'ultima volta nel 2008, l'ho usato a circa 2010 alla 10.0 e funzionava ancora bene.
Potresti provare Hawth's Tools: http://www.spatialecology.com/htools/rndsel.php
Si noti che la selezione esistente non viene onorata, quindi è necessario creare prima un layer funzionalità dalla selezione esistente.
Ecco un altro componente aggiuntivo di selezione casuale per ArcGIS 10, Sampling Design Tool . Ti permetterà di selezionare il 20% delle funzionalità nel tuo set di dati. Tuttavia, questo non utilizza un set selezionato per effettuare una selezione casuale, simile alle restrizioni degli strumenti di Hawth menzionate da blah238.
È inoltre possibile utilizzare le funzioni del sottoinsieme strumento . Secondo la documentazione:
Divide il set di dati originale in due parti: una parte da utilizzare per modellare la struttura spaziale e produrre una superficie, l'altra da utilizzare per confrontare e validare la superficie di output.
Uno svantaggio è che hai bisogno dell'estensione Geostatistical Analyst.