Ağırlıklı Thiessen çokgenleri mi oluşturuyorsunuz?


17

Bir nokta shapefile var ve ben bu komut dosyası sözdizimini kullanarak programlı olarak Thiessen (Voronoi) çokgenler oluşturmak:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Bununla birlikte, her nokta bir alanla ilgilidir (yani her çokgenin tercih edilen boyutu) ve Thiessen çokgenlerinin bu alana göre ağırlıklandırılmasını diliyorum.

Bu mümkün mü ve nasıl?

VBA'da alakalı bir kod var mı?

Yanıtlar:


15

Thiessen çokgenlerini oluşturmak için mesafeleri ağırlıklandırmanın birçok yolu vardır . Bunları inşa etmedeki temel fikir, rastgele bir nokta x ile iki sabit nokta p ve q arasındaki mesafenin karşılaştırılmasına dayanır ; Eğer karar vermeniz gerekir x "daha yakın" olduğunu p daha q ya da değil. Bu amaçla - en azından kavramsal olarak - dp = d ( x , p ) ve dq = d ( x , q ) mesafelerini dikkate alıyoruz . Ağırlıklandırma genellikle iki şekilde gerçekleşir: noktalara wp ve wq pozitif sayısal ağırlıklar verilebilir ve mesafelerin kendileri dönüştürülebilir.

Mantıklı olmak için , mesafeler arttıkça ( f olarak yazacağım ) dönüşüm artmalıdır; yani, d '> d> = 0 olduğunda f (d')> f (d). Bu dönüşümlerin örnekleri f (d) = d + 1, f (d) = d ^ 2'dir (Reilly'nin Perakende Yerçekimi Kanunu) ), f (d) = 1 - 1 / d (tüm mesafelerin 1'den az olduğu varsayılarak), f (d) = log (d), f (d) = exp (d) -1.

Sonra söyleyebilirim x "daha yakın" dır p daha q tam olarak ne zaman

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

Bölme işleminin çarpma işleminden ziyade ağırlıklara dikkat edin: bu, büyük ağırlıkların daha büyük mesafelerdeki noktaları "çekme" eğiliminde olduğu anlamına gelir. Bunu aşağıdaki çalışan örnekte göreceksiniz.

İşte güzel şey ve bu biraz soyut serginin bütün noktası: ortaya çıkan Thiessen bölgelerinin karmaşık, hesaplanması son derece zor olabilmesine rağmen, ızgara tabanlı bir gösterim kullanarak hesaplamak nispeten kolaydır. İşte tarif:

  1. Her giriş noktası p için , Öklid uzaklık ızgarasını [d (p)] hesaplayın.

  2. F ve ağırlıkları uygulamak için Harita Cebiri'ni kullanın , böylece her mesafe ızgarasını şu şekilde yeniden ifade edin:

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

    Burada f (d) = 100 + d ^ (3/2); ölçek 400 x 600'dür.

    Şekil 1

    F (d) arttıkça değer koyulaşır. Açıkçası bu örnekteki mesafe, merkezi kırmızı noktaya göredir; diğer dört nokta ayrı mesafe hesaplarını alır (gösterilmemiştir). Noktaların alanları 2, 10, 3, 4 ve 5 olan ağırlıklarıyla orantılıdır.

  3. Tüm bu ızgaraların yerel minimum değerini [fp] hesaplayın. Buna [f] deyin. İşte bir örnek.

    şekil 2

  4. [F] 'yi her [fp] ile karşılaştırarak, her ızgara hücresine [f]> = [fp] olan ilk p'nin tanımlayıcısını atayın . (Bu, örneğin en düşük konum işlemiyle bir adımda yapılabilir .)

    Figür 3

    (Herhangi bir yerde bu ağırlıklandırma fonksiyonu f için bir vektör formatı çözümü hesaplayacak bir algoritma olduğundan şüpheliyim.)

Açıkçası bir avuç p noktasından daha fazlasına sahipseniz, bunu senaryolayacaksınız ve sayıları binlere ulaşırsa, muhtemelen hesaplamayı uygulanamaz olarak denemeyi terk edersiniz (hesaplamayı döşeyerek hızlandırmanın yolları olsa da).

Elipsoid üzerinde Thiessen poligonlarını gösteren bir başka örnek, /gis//a/17377/ adresinde görünür .


3
+1 Raster bir yaklaşımla bu sorunun ne kadar kolay hale geldiğini hiç anlamadım.
Kirk Kuykendall

Whuber: Çok karmaşık bir süreç! Ancak, benim applciation odaklanmak için; Giriş dosyamın her noktası bir arazi parsel yaklaşık centoid temsil eder. Bir vektör Thiessen çokgenler dosyası yukarıda belirtilen komut dosyası satırını kullanarak oluşturun. Her poligon, eşit sınır mesafesine sahip hırsız poligon prensibine dayanan bir alana tahsis edilir. Öte yandan, her arazi parseline, alan alanında önceden belirlenmiş bir boyut verilir; ve bu dikkate almak istediğim faktör, çokgenler bu faktöre orantılı olacak. Herhangi bir fikir lütfen?
Demetris

Düşüncelerini anlamıyorum Demetris. Thiessen çokgenlerinden oluşan bir koleksiyondan ziyade gerçekten bir alan kartogramı istediğiniz gibi geliyorlar. Bu çokgenleri neden hesapladığınızı açıklamanıza yardımcı olur . Hangi sorunu çözecekler? Nasıl yorumlanacaklar?
whuber

Whuber: Thiessen poligon sürecine girdiğim her bir nokta, yeni bir arazi parseli setinin yaklaşık centroidini temsil ediyor. Böylece, arazi parsellerinin şeklini (bir nokta bir arazi parseli) temsil eden bu noktalara dayanarak hırsız poligonları oluşturuyorum. Genetik algoritmamı beslemek için bu noktaları hareket ettirerek birçok rastgele arazi parseli şekil kümesi üretebilirim. Sorun şu ki, bu üretilen parsel şekilleri (yaniTanessen poligonları) önceden tanımlanmış bir alana sahip olmalı ve Thiessen çokgenleri işlemini kullanırken bunu dikkate almanın mümkün olup olmadığını merak ediyorum. Umarım bu mantıklıdır.
Demetris

Genetik algoritmanız ne yapmaya çalışıyor? Eğer Thiessen poligonu ağırlıklı gerek yok gibi hala sesler: Orada varolduğuna inandığı hiçbir çokgenler önceden belirlenmifl- alanları ve hatta önceden belirlenmifl- göreli alanları ulaşmak sağlayacaktır mümkün ağırlıklandırma.
whuber

10

İstediğiniz ağırlıklı bir Voronoi diyagramıdır: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram , 2d düzleminde çarpma ağırlıklarıyla yapıldığında dairesel bir Dirichlet mozaikleme olarak da bilinir. Birisi bunları oluşturmak için bir arcgis 9 uzantısı oluşturmuş gibi görünüyor: http://arcscripts.esri.com/details.asp?dbid=15481 Burada bulunan bir kullanıcı kılavuzu ile http://geography.unt.edu/~pdong/software .htm ve Dong, P., 2008'de yayınlanan bir makale. CBS'de nokta, çizgi ve poligon özellikleri için çarpma ağırlıklı Voronoi diyagramlarının oluşturulması ve güncellenmesi. Bilgisayarlar ve Yerbilimleri, Cilt 34, Sayı 4, Sayfa 411-421.

Bunun için vektör tabanlı bir algoritma (P Dong'un algoritmasının raster tabanlı olduğunu varsayalım) hakkında yeni bir makale var. http://www.sciencedirect.com/science/article/pii/S0098300411003037 Özet, c # kodunun dahil olduğunu söylüyor.


1
Blord-castillo: Tüm bu bilgiler için çok teşekkürler. Çok faydalı ve bunu kapsamlı bir cevap olarak kabul edeceğim. Ancak, benim yeni sorun ben egas yukarıdaki komut satırı gibi girişler sağlayarak bu aracı benim kod içinde birkaç kez çalıştırmak istiyorum olmasıdır. Mümkün mü?
Demetris
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.