Buat poligon Thiessen tertimbang?

17

Saya punya titik shapefile dan saya membuat poligon Thiessen (Voronoi) secara terprogram menggunakan sintaks skrip ini:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Namun, setiap titik terkait dengan area (yaitu ukuran yang disukai dari setiap poligon) dan saya berharap poligon Thiessen ditimbang berdasarkan bidang ini.

Apakah itu mungkin dan bagaimana caranya?

Apakah ada kode yang relevan di VBA?

Demetris
sumber

Jawaban:

15

Ada banyak cara untuk mengukur jarak untuk membuat poligon Thiessen. Ide dasar dalam membangunnya didasarkan pada membandingkan jarak antara titik sembarang x dan dua titik tetap p dan q ; Anda perlu memutuskan apakah x "lebih dekat" dengan p daripada q atau tidak. Untuk tujuan ini - setidaknya secara konseptual - kami mempertimbangkan jarak dp = d ( x , p ) dan dq = d ( x , q ). Bobot biasanya terjadi dalam dua cara: titik dapat diberi bobot numerik positif wp dan wq dan jaraknya sendiri dapat diubah.

Agar masuk akal, transformasi (yang akan saya tulis sebagai f ) harus meningkat dengan meningkatnya jarak; yaitu, f (d ')> f (d) setiap kali d'> d> = 0. Contoh transformasi tersebut adalah f (d) = d + 1, f (d) = d ^ 2 (Hukum Gravitasi Eceran Reilly ), f (d) = 1 - 1 / d (dengan asumsi semua jarak kurang dari 1), f (d) = log (d), f (d) = exp (d) -1.

Kami kemudian akan mengatakan x "lebih dekat" ke p daripada ke q kapan tepatnya

f (d ( x , p )) / wp <f (d ( x , q )) / wq.

Perhatikan pembagian dengan bobot, daripada perkalian: ini berarti bobot besar akan cenderung "menarik" titik pada jarak yang lebih besar. Anda akan melihat ini dalam contoh yang berjalan di bawah ini.

Inilah hal yang indah, dan seluruh poin dari eksposisi yang agak abstrak ini: meskipun wilayah Thiessen yang dihasilkan dapat memiliki batas yang kompleks, sangat sulit untuk dihitung, mereka relatif mudah untuk dihitung menggunakan representasi berbasis grid. Inilah resepnya:

  1. Untuk setiap titik input p , hitung kisi jarak Euclidean [d (p)].

  2. Gunakan Peta Aljabar untuk menerapkan f dan bobot, sehingga menyatakan kembali setiap grid jarak sebagai

    [fp] = f ([d (p)]) / wp.

    Berikut ini adalah contoh menggunakan f (d) = 100 + d ^ (3/2); skalanya adalah 400 dengan 600.

    Gambar 1

    Ketika f (d) meningkatkan nilai semakin gelap. Jelas jarak dalam contoh ini sehubungan dengan titik merah pusat; empat titik lainnya mendapatkan perhitungan jarak terpisah (tidak ditampilkan). Area titik sebanding dengan bobotnya, yaitu 2, 10, 3, 4, dan 5.

  3. Hitung minimum lokal semua kisi ini [fp]. Sebut ini [f]. Berikut ini sebuah contoh.

    Gambar 2

  4. Dengan membandingkan [f] dengan masing-masing [fp], untuk setiap sel kisi, tentukan pengidentifikasi p pertama yang [f]> = [fp]. (Ini dapat dilakukan dalam satu langkah dengan operasi posisi terendah , misalnya.)

    Gambar 3

    (Saya ragu ada algoritma di mana saja yang akan menghitung solusi format vektor untuk fungsi pembobotan ini. F)

Tentunya jika Anda memiliki lebih dari beberapa poin p Anda akan membuat skrip ini, dan jika jumlahnya mencapai ribuan, Anda mungkin akan mengabaikan upaya tersebut karena secara komputasi tidak praktis (walaupun ada cara untuk mempercepat perhitungan dengan cara memasangnya).

Contoh lain, memperlihatkan poligon Thiessen pada ellipsoid, muncul di /gis//a/17377/ .

whuber
sumber
3
+1 Saya tidak pernah menyadari betapa mudahnya masalah ini dengan mengambil pendekatan raster.
Kirk Kuykendall
Whuber: Proses yang sangat canggih! Namun, untuk fokus pada aplikasi saya, setiap titik dari file input saya mewakili perkiraan sentoid dari paket tanah. Saya membuat menggunakan baris skrip yang disebutkan di atas file vektor Thiessen poligon. Setiap poligon diberi spasi yaitu ukuran berdasarkan prinsip poligon thiessen dengan jarak batas yang sama. Di sisi lain, setiap bidang tanah memiliki ukuran yang telah ditentukan yang disediakan di bidang area; dan ini adalah faktor yang ingin saya perhitungkan sehingga poligon akan sebanding dengan faktor ini. Ada ide?
Demetris
Saya tidak mengerti ucapan Anda, Demetris. Sepertinya Anda benar-benar menginginkan kartogram area daripada kumpulan poligon Thiessen. Ini akan membantu menjelaskan mengapa Anda menghitung poligon ini. Masalah apa yang akan mereka pecahkan? Bagaimana mereka akan ditafsirkan?
whuber
Whuber: Setiap input poin saya dalam proses poligon Thiessen mewakili perkiraan sentroid dari set paket tanah baru. Jadi, saya membuat poligon thiessen berdasarkan titik-titik ini yang mewakili bentuk bidang tanah (satu titik-satu bidang tanah). Saya dapat menghasilkan banyak set bentuk bidang tanah acak dengan memindahkan titik-titik ini untuk memberi makan algoritma genetik saya. Masalahnya adalah bahwa bentuk parsel yang dihasilkan ini (yaitu poli Tiessen) harus memiliki area yang telah ditentukan dan saya bertanya-tanya apakah mungkin untuk memperhitungkan ini ketika menggunakan operasi poligon Thiessen. Saya harap ini masuk akal.
Demetris
Apa yang ingin dilakukan oleh algoritma genetika Anda? Masih terdengar seperti Anda tidak perlu berbobot Thiessen poligon: Saya percaya terdapat ada pembobotan mungkin bahwa akan menjamin poligon mencapai daerah ditetapkan sebelumnya atau daerah relatif bahkan ditetapkan sebelumnya.
whuber
10

Yang Anda inginkan adalah diagram Voronoi berbobot: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram juga dikenal sebagai tessellation Dirichlet bundar ketika dilakukan dengan bobot multiplikatif dalam pesawat 2d. Seseorang tampaknya telah membangun ekstensi arcgis 9 untuk membangun ini: http://arcscripts.esri.com/details.asp?dbid=15481 Dengan panduan pengguna yang tersedia di sini http://geography.unt.edu/~pdong/software .htm dan sebuah makalah yang diterbitkan di Dong, P., 2008. Menghasilkan dan memperbarui diagram Voronoi berbobot ganda untuk fitur titik, garis, dan poligon di GIS. Komputer & Geosains, Volume 34, Edisi 4, Halaman 411-421.

Ada artikel terbaru tentang algoritma berbasis vektor (saya berasumsi algoritma P Dong berbasis raster) untuk ini. http://www.sciencedirect.com/science/article/pii/S0098300411003037 Abstrak mengatakan kode c # disertakan.

tuan-castillo
sumber
1
Blord-castillo: Terima kasih banyak atas semua informasi ini. Ini sangat berguna dan saya akan menerima ini sebagai jawaban yang komprehensif. Namun, masalah baru saya adalah bahwa saya ingin menjalankan alat itu di dalam kode saya untuk beberapa kali dengan memberikan masukan seperti misalnya baris skrip di atas. Apakah itu mungkin?
Demetris