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.
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:
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)
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.
Variasi untuk menemukan pilihan subset seperti yang diminta:
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)
Akhirnya, satu variasi lagi untuk memilih layer berdasarkan hitungan, bukan persen:
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)
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/...
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:
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.
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.
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.
Sayangnya, versi itu tidak kompatibel dengan ArcGIS 9.3 dan yang lebih baru. Sekarang itu disebut Geospasial Modeling Lingkungan: spatialecology.com/gme
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.
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.
Jawaban:
Berikut adalah fungsi python yang akan memilih fitur acak dalam sebuah layer berdasarkan pada persen, mengabaikan pilihan saat ini:
Salin / tempel ini ke kulit python di ArcMap.
Kemudian dalam jenis shell
SelectRandomByPercent ("layer", num)
, di manalayer
nama layer Anda, dannum
merupakan jumlah seluruh persen Anda.Variasi untuk menemukan pilihan subset seperti yang diminta:
Akhirnya, satu variasi lagi untuk memilih layer berdasarkan hitungan, bukan persen:
sumber
random.sample()
.sql
parameter yang diketahui ?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:
Kemudian, menggunakan kalkulator bidang pada atribut itu, dengan Python Parser, gunakan kunci kode berikut:
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.
sumber
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.
sumber
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.
sumber
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.
sumber
Anda juga bisa menggunakan alat Fitur Subset . Menurut dokumentasi:
Salah satu kelemahannya adalah Anda memerlukan ekstensi Analis Geostatistic.
sumber