Dieses Problem hat viele gültige Lösungen. Eine davon funktioniert ein wenig wie Ihre Beschreibung, aber anstatt die Polygone an "zufälligen" Stellen aufzuteilen, können Sie dies gezielt tun, um den Rechenaufwand zu minimieren.
Hier ist der grundlegende Algorithmus. Seine Eingabe besteht aus einer beliebigen Ebenenabtastrichtung, einem Polygon P mit einer Fläche ungleich Null, einer Zielfläche a zwischen Null und der Fläche des Polygons und einer nichtnegativen Schwelle t (in Flächeneinheiten). Sein Zweck ist es, P mit einer Linie senkrecht zur Abtastrichtung in zwei Teile zu teilen , einen rechts von der Linie und den anderen links von der Linie, so dass der Unterschied zwischen dem rechten Bereich und dem Zielbereich a nein ist größer als t .
Es sei L eine beliebige gerichtete Linie senkrecht zur Sweep-Richtung. Definiere f (L) als die Fläche von P rechts von L minus a . In diesen Begriffen besteht die Aufgabe darin , eine Null von f zu finden . Da es unwahrscheinlich ist, dass f differenzierbar ist, es aber stetig ist, verwenden Sie entweder eine Halbierungsmethode, die Sekantenmethode oder - meine Lieblingsmethode - die Methode von Brent . Alle sind einfach und konvergieren garantiert. Verwenden Sie t für die Konvergenztoleranz für das Argument.
Das ist es. Lassen Sie uns überlegen, wie das codiert wird. Die Wurzelfindung ist Routine - Sie können einen generischen Codeabschnitt dafür verwenden -, sodass die GIS-Arbeit auf die Codierung von f hinausläuft . Dies erfordert
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
Beide Operationen sind in nahezu jedem vektorbasierten GIS implementiert. Andernfalls können Sie die Linie durch ein sehr großes Rechteck ersetzen, das die Halbebene rechts von der Linie darstellt. Schritt 1 wird
1'. Clip the polygon to the rectangle.
Das ist eine wirklich grundlegende Operation.
Um mit der Wurzelfindung zu beginnen, müssen Sie ein Intervall finden, in dem die Null von f garantiert liegt. Dies ist ganz einfach: Projizieren Sie den Umschlag des Polygons ("Bounding Box") in Richtung des Linien-Sweeps. Die Projektion ist das gewünschte Intervall.
Diese Frage hat eine lange Geschichte. Ich habe diesen Algorithmus für ArcView 3.x vor langer Zeit implementiert und ihn in den alten ESRI-Benutzerforen oft beschrieben. Google
huber split polygon site: forums.esri.com
für Diskussionen, Links zu Code, Verbesserungen und Variationen (wie das Aufteilen von Polygonen in Teile gewünschter Größen, die so kompakt wie möglich sind) und Algorithmen für Rasterdaten.
So sehen die kontinentalen US-Bundesstaaten aus (in einer flächengleichen Projektion), wobei das untere Drittel jedes Bundesstaates schattiert ist. Offensichtlich war die Schwenkrichtung vertikal.