Seçilen noktaların% X'ini rastgele nasıl alt kümeye ekleyebilirim?


16

ArcGIS 10.2'de bir dizi noktayı rastgele alt kümeye koymak için hangi yöntemler mevcuttur. Örneğin, ekli ekran görüntüsünde seçilen noktaların% 20'sini tutmak ve geri kalanını silmekle ilgileniyorum.

resim açıklamasını buraya girin


Katmandan rastgele noktalar seçmek için varsayılan bir yöntem olduğunu düşünmüyorum. Python betiğini denediniz mi? Veya eklenti?
Marcin D

Yanıtlar:


27

Geçerli seçimi yok sayarak, yüzde cinsinden bir katmandaki rastgele özellikleri seçecek bir python işlevi şunlardı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)

Bunu kopyalayın / ArcMap'teki python kabuğuna yapıştırın.

Daha sonra kabuk türünde SelectRandomByPercent ("layer", num), layerkatmanınızın adı ve numyüzde değerinizin bir sayısıdır.

Rastgele seçim

Sorulduğu gibi bir alt küme seçimi bulmak için bir varyasyon:

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)

Son olarak, bir katmanı yüzde yerine sayıyla seçmek için bir varyasyon daha var:

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)

Güzel kullanımı random.sample().
Aaron

Teşekkürler @Aaron. İlk olarak dışa aktarmadan bir alt küme seçiminin yanıtını güncelledim.
Emil Brundage

+1. sqlParametre için dize uzunluğu konusunda bilinen herhangi bir sınırlama var mı?
Paul

@ Paul Bu kodu sadece yaklaşık 4 milyon özelliğe sahip bir katmanla özelliklerin% 100'ünü seçmek için test ettim, bu da bir bellek hatasına neden oldu. Bu yüzden sabit bir dize sınırı yok gibi görünüyor olsa da, belleğe bağımlılık vardır. Burada hakkında blog yazdığım Oracle SDE veritabanları için de bir SQL öğe sınırı var: emilsarcpython.blogspot.com/2015/10/…
Emil Brundage


13

Genel olarak, blah238 tarafından tartışıldığı gibi mekansal ekoloji araçlarını da kullanmanızı öneririm.

Bununla birlikte, deneyebileceğiniz başka bir yöntem, rastgele bir sayı depolamak için Rastgele adlı bir özellik eklemek olacaktır: resim açıklamasını buraya girin

Ardından, bu öznitelikteki alan hesaplayıcısını Python Parser ile kullanarak aşağıdaki kod bloğunu kullanın:

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

Aşağıdaki resme bakın:

Bu, 0 ile 1 arasında rastgele değerler oluşturur. Ardından, özelliklerin% 20'sini seçmek istiyorsanız, Rastgele değerinin 0,2'den düşük olduğu özellikleri seçebilirsiniz. Tabii ki, bu birçok özellik ile daha iyi çalışacaktır. Test olarak yalnızca 7 özelliğe sahip bir özellik sınıfı oluşturdum ve 0.2'den daha az değer yoktu. Ancak, birçok özelliğiniz var gibi görünüyor, bu yüzden önemli değil.

resim açıklamasını buraya girin


7
bu yöntem, bazı durumlarda tercih edilecek olan özelliklerin ortalama % 20'sine geri dönecektir . Ancak her seferinde% 20 istiyorsanız, önerildiği gibi yapabilirsiniz, ardından özellikleri rastgele değere göre sıralayın ve ilk% 20'yi seçin.
Llaves

Esri bu işlemi bir blogda kullandı: support.esri.com/tr/technical-article/000013141
Emil Brundage

6

ArcGIS Desktop için @StephenLead'in rastgele komut dosyasında daha önceki bir Select özelliği de var . Her ne kadar yazılmış olsa da, ArcGIS 9.x için ve son olarak 2008'de değiştirildi, 2010'da 10.0'da kullandım ve hala iyi çalıştı.


5

Hawth'in Araçlarını deneyebilirsiniz: http://www.spatialecology.com/htools/rndsel.php

Mevcut seçimin onurlandırılmadığından, önce mevcut seçimden bir özellik katmanı yapmanız gerekeceğini unutmayın.


Ne yazık ki, bu sürüm ArcGIS 9.3 ve üstü ile uyumlu değildir. Şimdi Jeo-Uzamsal Modelleme Ortamı olarak adlandırılıyor: spatialecology.com/gme
kenbuja

İyi nokta, GME'de
blah238 21:13

GME araç seti ArcGIS içinde "çalışmaz, bunun yerine bağımsız bir araçtır
Ryan Garnett

3

Örnekleme Tasarım Aracı ArcGIS 10 için başka bir rastgele seçim eklentisi . Veri kümenizdeki özelliklerin% 20'sini seçmenizi sağlar. Bununla birlikte, bu, blah238 tarafından belirtilen Hawth's Tools kısıtlamalarına benzer şekilde rastgele bir seçim yapmak için seçilen bir seti kullanmaz.


0

Altküme Özellikleri aracını da kullanabilirsiniz . Belgelere göre:

Orijinal veri kümesini iki parçaya ayırır: bir kısmı uzamsal yapıyı modellemek ve bir yüzey üretmek için kullanılır, diğeri çıktı yüzeyini karşılaştırmak ve doğrulamak için kullanılır.

Bir dezavantaj Geostatistic Analyst uzantısına ihtiyacınız olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.