Stwórz ważone wielokąty Thiessena?

17

Mam punktowy plik kształtu i tworzę wielokąty Thiessen (Voronoi) programowo przy użyciu tej składni skryptowej:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Jednak każdy punkt jest powiązany z obszarem (tj. Preferowanym rozmiarem każdego wielokąta) i chciałbym, aby wieloboki Thiessena były ważone na podstawie tego pola.

Czy to możliwe i jak?

Czy w VBA jest jakiś odpowiedni kod?

Demetris
źródło

Odpowiedzi:

15

Istnieje wiele sposobów ważenia odległości do konstruowania wielokątów Thiessena. Podstawowa idea ich budowy polega na porównaniu odległości między dowolnym punktem x a dwoma stałymi punktami p i q ; musisz zdecydować, czy x jest „bliżej” do p niż do q, czy nie. W tym celu - przynajmniej koncepcyjnie - rozważamy odległości dp = d ( x , p ) i dq = d ( x , q ). Ważenie odbywa się zwykle na dwa sposoby: punktom można nadać dodatnie wagi liczbowe wp i wq, a same odległości można przekształcić.

Aby mieć sens, transformacja (którą napiszę jako f ) powinna rosnąć wraz ze wzrostem odległości; to znaczy, f (d ')> f (d) ilekroć d'> d> = 0. Przykładami takich przekształceń są f (d) = d + 1, f (d) = d ^ 2 (prawo grawitacji detalicznej Reilly'ego ), f (d) = 1 - 1 / d (przy założeniu, że wszystkie odległości są mniejsze niż 1), f (d) = log (d), f (d) = exp (d) -1.

Powiedzielibyśmy wtedy, że x jest „bliżej” do p niż do q dokładnie kiedy

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

Zwróć uwagę na podział według ciężarów zamiast pomnożenia: oznacza to, że duże ciężary będą miały tendencję do „przyciągania” punktów na większe odległości. Zobaczysz to w działającym przykładzie poniżej.

Oto piękna rzecz i sedno tej nieco abstrakcyjnej ekspozycji: chociaż powstałe regiony Thiessen mogą mieć złożone, niezwykle trudne do obliczenia granice, są one stosunkowo łatwe do obliczenia przy użyciu reprezentacji opartej na siatce. Oto przepis:

  1. Dla każdego punktu wejściowego p oblicz jego siatkę odległości euklidesowej [d (p)].

  2. Użyj Algebry Map, aby zastosować f i wagi, a tym samym ponownie wyrazić każdą siatkę odległości jako

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

    Oto przykład wykorzystujący f (d) = 100 + d ^ (3/2); skala wynosi 400 na 600.

    Rycina 1

    W miarę wzrostu f (d) wartość staje się ciemniejsza. Najwyraźniej odległość w tym przykładzie dotyczy centralnego czerwonego punktu; pozostałe cztery punkty otrzymują osobne obliczenia odległości (nie pokazano). Obszary kropek są proporcjonalne do ich wag, które wynoszą 2, 10, 3, 4 i 5.

  3. Oblicz lokalne minimum wszystkich tych siatek [fp]. Nazwij to [f]. Oto przykład.

    Rysunek 2

  4. Porównując [f] z każdym [fp], do każdej komórki siatki przypisz identyfikator pierwszego p, dla którego [f]> = [fp]. (Można to zrobić na przykład w jednym kroku z operacją najniższego położenia ).

    Rycina 3

    (Wątpię, czy istnieje algorytm, który obliczy rozwiązanie w formacie wektorowym dla tej funkcji ważącej f.)

Oczywiście, jeśli masz więcej niż garść punktów p , skryptujesz to, a jeśli ich liczba osiągnie tysiące, prawdopodobnie porzucisz tę próbę jako niewykonalną obliczeniowo (chociaż istnieją sposoby na przyspieszenie obliczeń poprzez ich kafelkowanie).

Kolejny przykład pokazujący wielokąty Thiessena na elipsoidzie pojawia się na stronie /gis//a/17377/ .

Whuber
źródło
3
+1 Nigdy nie zdawałem sobie sprawy, o ile łatwiej jest ten problem, stosując podejście rastrowe.
Kirk Kuykendall
Whuber: Bardzo wyrafinowany proces! Jednak, aby skupić się na mojej apelacji; Każdy punkt mojego pliku wejściowego reprezentuje przybliżoną centoidę działki. Tworzę za pomocą tej linii skryptu zapisanej powyżej wektorowego pliku wielokątów Thiessena. Każdemu wielobokowi przypisano przestrzeń, tj. Rozmiar oparty na zasadzie wielokątów Thiessena o równej odległości granic. Z drugiej strony, każdy rodzaj ziemi ma z góry określony rozmiar, który jest podany w polu powierzchni; i to jest czynnik, który chcę wziąć pod uwagę, aby wielokąty były proporcjonalne do tego czynnika. Masz jakiś pomysł?
Demetris
Nie rozumiem twoich uwag, Demetris. Brzmią, jakbyś naprawdę chciał kartogram powierzchni zamiast zbioru wielokątów Thiessena. Pomoże to wyjaśnić, dlaczego obliczasz te wielokąty. Jaki problem zamierzają rozwiązać? Jak będą interpretowane?
whuber
Whuber: Każdy z moich punktów wprowadzonych w procesie wielokąta Thiessena reprezentuje przybliżony centroid nowego zestawu działek. W ten sposób tworzę wielokąty Thiessena na podstawie tych punktów reprezentujących kształt działek (jedna działka jeden punkt). Mogę wytworzyć wiele zestawów losowych kształtów działek, przesuwając te punkty, aby nakarmić mój algorytm genetyczny. Problem polega na tym, że te wygenerowane kształty działek (tj. Wielokąty Thiessen) powinny mieć wstępnie zdefiniowany obszar i zastanawiam się, czy można to wziąć pod uwagę podczas korzystania z operacji wielokątów Thiessen. Mam nadzieję, że to ma sens.
Demetris
Jaki jest twój algorytm genetyczny? Wciąż brzmi to tak, jakbyś nie potrzebował ważonych wielokątów Thiessena: Wierzę, że nie ma możliwego ważenia, które zapewni, że wielokąty osiągną wstępnie określone obszary lub nawet wstępnie określone obszary względne.
whuber
10

To, czego chcesz, to ważony diagram Voronoi: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram znany również jako kołowa teselacja Dirichleta, gdy jest wykonywany z mnożnikami w płaszczyźnie 2D. Wydaje się, że ktoś zbudował rozszerzenie arcgis 9, aby je zbudować: http://arcscripts.esri.com/details.asp?dbid=15481 Z instrukcją obsługi dostępną tutaj http://geography.unt.edu/~pdong/software .htm oraz artykuł opublikowany w Dong, P., 2008. Generowanie i aktualizowanie multiplikatywnie ważonych diagramów Voronoi dla cech punktów, linii i wielokątów w GIS. Computers & Geosciences, tom 34, wydanie 4, strony 411-421.

Istnieje niedawny artykuł na temat algorytmu wektorowego (zakładam, że algorytm P Dong jest oparty na rastrze). http://www.sciencedirect.com/science/article/pii/S0098300411003037 Streszczenie mówi, że kod c # jest zawarty.

blord-castillo
źródło
1
Blord-castillo: Wielkie dzięki za wszystkie te informacje. Jest to bardzo przydatne i zaakceptuję to jako wyczerpującą odpowiedź. Jednak moim nowym problemem jest to, że chcę uruchomić to narzędzie w kodzie kilka razy, podając dane wejściowe, takie jak np. Powyższa linia skryptu. Czy to jest możliwe?
Demetris,