Dzielenie wielokąta na określone rozmiary za pomocą ArcGIS Desktop?

26

Mam kilka tysięcy wielokątów o nieregularnym kształcie w pliku kształtu. Chcę mieć możliwość podzielenia każdego wielokąta na trzy obszary i określenia wielkości tych obszarów (sumują się one do poprzedniego całkowitego obszaru). Nie ma znaczenia, jaki jest kształt sub-wielokąta, ponieważ służy to do celów wizualizacji.

Jak mogę to zrobić? Czy istnieje standardowy algorytm, którego mogę użyć?


Jednym podejściem, które rozważałem, było zebranie wszystkich punktów tworzących wielokąt. Następnie łączę dwa losowo razem za pomocą linii prostej, dzielę wielokąt, a następnie sprawdzam, czy obszar mieści się w zadowalającej tolerancji. Gdyby był zbyt mały, zmieniłbym punkt w jednym kierunku; jeśli byłby za duży, zmieniłbym się na punkt w przeciwnym kierunku.

djq
źródło

Odpowiedzi:

34

Ten problem ma wiele ważnych rozwiązań. Jeden z nich działa trochę jak opis, ale zamiast krojenia wielokątów w „losowe” miejsca, możesz to zrobić celowo w sposób zaprojektowany w celu zminimalizowania ilości obliczeń.

Oto podstawowy algorytm. Jego wejściowy składa się z dowolnego kierunku płaszczyzny cyklu, wieloboku P obszaru niezerową, obszar docelowy od zera do powierzchni wielokąta i dodatnią progowej T (w jednostkach powierzchni). Jego celem jest podzielenie P linią prostopadłą do kierunku przeciągnięcia na dwie części, jedną na prawo od linii, a drugą na lewo od linii, tak aby różnica między obszarem prawej ręki a obszarem docelowym a nie była większy niż t .

Niech L będzie dowolną zorientowaną linią prostopadłą do kierunku przeciągnięcia. Zdefiniuj f (L) jako obszar P znajdujący się po prawej stronie L, minus a . W tych terminach zadaniem jest znalezienie zera f . Ponieważ jest mało prawdopodobne, aby f był różniczkowalny, ale ciągły, użyj albo metody bisekcji, metody siecznej , albo - mojej ulubionej - metody Brenta . Wszystkie są proste i gwarantowane połączenie. Użyj t dla tolerancji zbieżności dla argumentu.

to jest to! Zastanówmy się, co należy do tego zakodować. Znalezienie roota jest rutynowe - możesz użyć do tego ogólnego fragmentu kodu - więc praca GIS sprowadza się do kodowania f . Takie postępowanie wymaga

1.  Splitting the polygon by a line.
2.  Computing the area of the piece(s) to the right of the line.

Obie operacje są realizowane w prawie każdym systemie GIS opartym na wektorze. Jeśli nie, możesz zastąpić linię bardzo dużym prostokątem reprezentującym półpłaszczyznę po prawej stronie linii. Krok 1 staje się

1'. Clip the polygon to the rectangle.

To naprawdę podstawowa operacja.

Aby rozpocząć wyszukiwanie roota, musisz znaleźć przedział, w którym zero f będzie gwarantowane. To proste: rzutuj obwiednię wielokąta („ramkę ograniczającą”) w kierunku przeciągnięcia linii. Projekcja to żądany przedział.

To pytanie ma długą historię. Zaimplementowałem ten algorytm dla ArcView 3.x dawno temu i opisałem go wiele razy na starych forach użytkowników ESRI. Google

Huber podzielona strona wielokąta: forums.esri.com

do dyskusji, łącza do kodu, ulepszeń i odmian (takich jak dzielenie wielokątów na części o pożądanych rozmiarach, które są możliwie jak najbardziej kompaktowe) oraz algorytmy danych rastrowych.

Oto jak wyglądają kontynentalne stany USA (w rzucie równego obszaru) z dolną trzecią częścią każdego stanu zacieniowaną. Najwyraźniej kierunek zamiatania był pionowy.

alternatywny tekst

Whuber
źródło
6

Istnieje gotowe narzędzie o nazwie „GeoTools” ET Spatial. Gdzie jest narzędzie o nazwie „ET Różne”. W tym narzędziu istnieją dwa rodzaje sposobu dzielenia wielokątów. Według procentu i powierzchni (kilka jednostek, np. Mkw, hektary itp.). To narzędzie dzieli wielokąty z dowolnej z czterech stron, tj. NESW, jak pokazują zdjęcia. Użyłem metody „z góry na dół”, tj. Z północy na południe.

Rozdzielać

SIslam
źródło
0

W ArcGIS Pro 2.3 dostępne jest nowe narzędzie o nazwie Subdivide Polygon .

Umożliwia podzielenie / podzielenie wielokąta na określoną liczbę części lub żądany obszar części.

0kcats
źródło