Bagaimana cara membagi secara acak X% dari poin yang dipilih?

15

Metode apa yang tersedia di ArcGIS 10.2 untuk secara acak mengelompokkan pilihan poin. Misalnya, dalam tangkapan layar terlampir saya tertarik untuk menyimpan 20% dari poin yang dipilih dan menghapus sisanya.

masukkan deskripsi gambar di sini

Harun
sumber
Yah saya tidak berpikir ada metode default untuk memilih poin acak dari layer. Apakah Anda mencoba dengan skrip python? Atau add-in?
Marcin D

Jawaban:

26

Berikut adalah fungsi python yang akan memilih fitur acak dalam sebuah layer berdasarkan pada persen, mengabaikan pilihan saat ini:

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)

Salin / tempel ini ke kulit python di ArcMap.

Kemudian dalam jenis shell SelectRandomByPercent ("layer", num), di mana layernama layer Anda, dan nummerupakan jumlah seluruh persen Anda.

Seleksi acak

Variasi untuk menemukan pilihan subset seperti yang diminta:

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)

Akhirnya, satu variasi lagi untuk memilih layer berdasarkan hitungan, bukan persen:

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
sumber
Penggunaan yang bagus random.sample().
Harun
Terima kasih @ Harun. Saya memperbarui jawaban untuk pilihan subset tanpa mengekspor terlebih dahulu.
Emil Brundage
+1. Apakah ada batasan panjang string untuk sqlparameter yang diketahui ?
Paul
@ Paul Saya baru saja menguji kode ini untuk memilih 100% fitur dengan lapisan yang memiliki hampir 4 juta fitur, yang mengakibatkan kesalahan memori. Jadi, meskipun tampaknya tidak ada batas string keras, ada ketergantungan pada memori. Ada juga batas item SQL untuk database Oracle SDE, yang saya blogged tentang di sini: emilsarcpython.blogspot.com/2015/10/...
Emil Brundage
1
Esri menggunakan kode ini di blog support.esri.com/en/technical-article/000013141
Emil Brundage
13

Secara umum, saya juga merekomendasikan menggunakan alat ekologi spasial seperti yang dibahas oleh blah238.

Namun, metode lain yang bisa Anda coba adalah menambahkan atribut yang disebut Acak untuk menyimpan nomor acak: masukkan deskripsi gambar di sini

Kemudian, menggunakan kalkulator bidang pada atribut itu, dengan Python Parser, gunakan kunci kode berikut:

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

Lihat gambar di bawah ini:

Ini akan membuat nilai acak antara 0 dan 1. Kemudian, jika Anda ingin memilih 20% dari fitur, Anda bisa memilih fitur di mana nilai acak kurang dari 0,2. Tentu saja, ini akan bekerja lebih baik dengan banyak fitur. Saya membuat kelas fitur dengan hanya 7 fitur sebagai tes dan tidak ada nilai kurang dari 0,2. Namun, sepertinya Anda memiliki banyak fitur, jadi itu tidak masalah.

masukkan deskripsi gambar di sini

Fezter
sumber
7
metode ini akan mengembalikan rata-rata 20% dari fitur, yang dalam beberapa kasus lebih disukai. Tetapi jika Anda ingin 20% setiap kali, Anda dapat melakukan seperti yang disarankan, lalu mengurutkan fitur berdasarkan nilai acak dan pilih 20% pertama.
Llaves
Esri menggunakan proses ini dalam sebuah blog: support.esri.com/en/technical-article/000013141
Emil Brundage
6

Ada juga fitur Pilih sebelumnya pada skrip acak dari @StephenLead tersedia untuk ArcGIS Desktop. Meskipun ditulis, saya pikir, untuk ArcGIS 9.x, dan terakhir dimodifikasi pada 2008, saya menggunakannya sekitar 2010 pada 10.0, dan masih berfungsi dengan baik.

PolyGeo
sumber
5

Anda dapat mencoba Hawth's Tools: http://www.spatialecology.com/htools/rndsel.php

Perhatikan bahwa pilihan yang ada tidak dihormati sehingga Anda harus membuat lapisan fitur dari pilihan yang ada terlebih dahulu.

blah238
sumber
Sayangnya, versi itu tidak kompatibel dengan ArcGIS 9.3 dan yang lebih baru. Sekarang itu disebut Geospasial Modeling Lingkungan: spatialecology.com/gme
kenbuja
Titik yang baik, di sini adalah perintah setara di GME: spatialecology.com/gme/rsample.htm
blah238
Toolset GME tidak berfungsi "di dalam" ArcGIS, melainkan merupakan alat yang berdiri sendiri
Ryan Garnett
3

Berikut ini tambahan tambahan acak untuk ArcGIS 10, Alat Desain Pengambilan Sampel . Ini akan memungkinkan Anda memilih 20% dari fitur dalam dataset Anda. Namun, ini tidak menggunakan set yang dipilih untuk membuat pilihan acak, mirip dengan pembatasan Hawth's Tools yang disebutkan oleh blah238.

kenbuja
sumber
0

Anda juga bisa menggunakan alat Fitur Subset . Menurut dokumentasi:

Membagi dataset asli menjadi dua bagian: satu bagian yang akan digunakan untuk memodelkan struktur spasial dan menghasilkan permukaan, yang lain untuk digunakan untuk membandingkan dan memvalidasi permukaan output.

Salah satu kelemahannya adalah Anda memerlukan ekstensi Analis Geostatistic.

Ernesto561
sumber