geoinformation.net Folie 1 von 43 Punkt-in-Polygon-Suche Übersicht ! ! Praxisbeispiel/Problemstellung Zählen von Schnittpunkten Schnitt einer Halbgerade mit der Masche Aufwandsbetrachtung Streifenkarte Vorgehen und Eigenschaften Speicherung der Daten / Suche in den Daten Aufwandsbetrachtung Trapezkarte " " ! " " " ! geoinformation.net Praxisbeispiel Rollover am Bildschirm Folie 2 von 43 geoinformation.net Folie 3 von 43 Problemstellung 1 In welcher Masche liegt Punkt P? Allgemein: Gegeben ist eine räumliche Datenbank und eine Klasse typischer Anfragen Gesucht wird eine Datenstruktur, die einen effizienten Algorithmus unterstützt ! ! Konkret: Gegeben ist eine Landkarte S und ein Punkt P Gesucht wird die Masche M, die den Punkt P beinhaltet ! ! geoinformation.net Folie 4 von 43 Lösungsansatz 1 Halbgerade am Punkt anlegen Aus dem >>Jordanschen Kurvensatz folgt: ! ! ! 1x Konstruiere ausgehend von P eine Halbgerade in beliebiger Richtung P liegt außerhalb des begrenzten Gebietes, wenn eine gerade Anzahl von Schnittpunkten entsteht. P liegt innerhalb des begrenzten Gebietes, wenn eine ungerade Anzahl von Schnittpunkten entsteht. geoinformation.net Folie 5 von 43 Theorem Jordanscher Kurvensatz Nach Jordan: ! ! Eine geschlossene Jordankurve S zerlegt die Ebene in zwei zusammenhängende Gebiete, von denen genau eines nicht beschränkt ist. Zwei Punkte der Ebene können genau dann durch eine Jordankurve J verbunden werden, die S nicht schneidet, wenn sie entweder beide im Inneren oder beide im Äußeren von S liegen. geoinformation.net Folie 6 von 43 Lösungsansatz 1 Suchaufwand Das Verfahren muss für jede Masche iteriert werden: ! ! Aufwand für ein Polygon mit n Kanten: O(n) Aufwand bei m Polygonen: O(m*n) Der Aufwand für eine Suche nach dem Jordanschen Kurvensatz beträgt O(m*n). Mit welchem Verfahren kann der Suchaufwand verringert werden? geoinformation.net Folie 7 von 43 Praxisbeispiel Bundesrepublik Deutschland In der Praxis kann die Anzahl der Maschen und Kanten sehr schnell hoch werden: Bundesrepublik Deutschland: 1 Masche Bundesländer: 16 Maschen mit 17.700 Kanten Kreise: 440 Maschen mit 75.000 Kanten Gemeinden: 13.900 Maschen mit 300.000 Kanten Angaben für den Massstab 1:500.000 Quelle: ArcDeutschland 500, ESRI geoinformation.net Folie 8 von 43 Vorgehensweise 2 Konstruktion eines Index Der Aufbau eines Index kostet Zeit. Diese amortisiert sich jedoch bei der Abfrage. Allgemein: Gegeben: Räumliche Datenbank und eine Klasse typischer Anfragen Gesucht: Datenstruktur, die einen möglichst schnellen Algorithmus unterstützt Konkret: Gegeben: Landkarte S und ein Punkt P Gesucht: Index für die schnelle Identifikation der zugeordneten Masche M . ! ! ! ! geoinformation.net Folie 9 von 43 Lösungsansatz 2 Konstruktion der Streifenkarte S' Vorgehen: ! Konstruktion einer Karte S' durch Aufteilung der Landkarte mit vertikalen Geraden durch alle Knoten. Folge: ! In allen Schnittpunkten der Geraden mit den Kanten entstehen neue Knoten. 2x geoinformation.net Folie 10 von 43 Lösungsansatz 2 Eigenschaften von S' S' hat folgende Eigenschaften: ! ! 2x Die Maschen sind in Trapeze (ggf. Dreiecke) zerlegt. Kanten sind in Teilkanten zerlegt. geoinformation.net Folie 11 von 43 Lösungsansatz 2 Vorteil von S' Die Karte erhält eine Struktur, die wir ausnutzen können: ! ! Die Streifen sind in x-Richtung angeordnet. Innerhalb eines Streifens sind die Teilkanten und damit die Trapeze in y-Richtung angeordnet. 2x geoinformation.net Folie 12 von 43 Lösungsansatz II Speicherung der Daten Die Datenspeicherung erfolgt in Arrays: ! ! Ein Array enthält die x-Koordinaten der Streifen. Jeder Streifen enthält ein Array der y-Koordinaten der Teilkanten. geoinformation.net Folie 13 von 43 Lösungsansatz 2 Intervall-Bisektion Zwei schnelle binäre Suchalgorithmen werden für die Suche nach der Masche hintereinander geschaltet: ! ! Binäre Suche im Array der xKoordinaten nach dem Streifen, der P enthält. Binäre Suche nach dem zugehörigen Trapez in diesem Streifen. Sobald die Teilkante direkt >>unterhalb/ oberhalb von P gefunden ist, ist die gesuchte Masche gefunden. 3x geoinformation.net Folie 14 von 43 Bemerkungen Eigenschaften der Maschen Es gilt: ! ! ! Jeder Abschnitt eines Streifens liegt genau in einer Masche. Jede Kante lässt sich einer in yRichtung folgenden Masche zuordnen. Die Fläche"Außen" muss ebenfalls als Masche angesehen werden. geoinformation.net Folie 15 von 43 Lösungsansatz 2 Suchaufwand Der Suchaufwand dieses Lösungsansatzes entsteht durch: ! ! Binäre Suche im Array der x-Koordinaten nach dem Streifen, der P enthält: Binäre Suche in einem Array mit maximaler Länge 2n: O(log n) Binäre Suche nach der Lage von P zu den Teilkanten im Array der y-Koordinaten: Binäre Suche in einem Array mit maximaler Länge n: O(log n) Der Aufwand für die binäre Suche in einer Streifenkarte beträgt O(log n). Im >>Vergleich zum Lösungsansatz 1 hat sich der Suchaufwand verbessert. geoinformation.net Folie 16 von 43 Vergleich Suchaufwand der zwei Lösungsansätze Der Aufwand für eine Suche nach dem Jordanschen Kurvensatz beträgt O(n). Der Suchaufwand für die binäre Suche in einer Streifenkarte beträgt O(log n). geoinformation.net Folie 17 von 43 Lösungsansatz 2 Speicherbedarf Es entsteht eine hohe Speicheranforderung durch: ! ! die sortierte Speicherung der x-Koordinaten der vertikalen Geraden in einem Array: Array der x-Koordinaten: O(n) die sortierte Speicherung der y-Koordinaten der Teilkanten jedes Streifens von oben nach unten in einem Array: Array der y-Koordinaten: O(n) Die Speicheranforderung für die Daten dieses Lösungsansatzes beträgt O(n²) geoinformation.net Folie 18 von 43 Lösungsansatz 2 Worst Case Speicherbedarf Der Worst Case tritt tatsächlich auf: ! In ungünstigen Fällen erfolgt mit diesem Verfahren eine sehr hohe Knoten- und Teilkantenbildung und damit ein hohes Datenaufkommen. Wie kann der Speicherbedarf verringert werden? 1x geoinformation.net Folie 19 von 43 Problemstellung 3 Verringerung des Speicherbedarfs Zwischenresümee: ! ! Die Zerlegung in Streifen führt zu einer schnellen Suche. Allerdings ist der Speicherbedarf unvertretbar hoch. Problem: ! Gibt es eine bessere Zerlegung, die die Laufzeit erhält und den Speicherbedarf verringert? geoinformation.net Folie 20 von 43 Lösungsansatz 3 Vereinfachung des Beispiels Um im Folgenden die Übersicht zu wahren, wird die Beispielkarte geändert: ! ! 2x Löschen zweier Knoten: Ersetzen von drei Kanten durch eine Kante Verschieben zweier Knoten geoinformation.net Folie 21 von 43 Lösungsansatz 3 Vereinfachende Annahmen ! ! Umschließen der Karte durch ein achsenparalleles Rechteck R: Vermeidung der unbeschränkte Masche "Außen" Es existieren keine Knoten mit gleicher x-Koordinate: Scherung oder Rotation um den Winkel ε um den Ursprung ε ist sehr klein wodurch die Topologie erhalten bleibt Später wird gezeigt, dass diese Transformation rein virtuell ist " " 2x geoinformation.net Folie 22 von 43 Lösungsansatz 3 Konstruktion der Trapezkarte T(S) Vorgehen: ! 2x Bei der Salamikarte werden alle Kanten der Landkarte durchschnitten. Beim Tranchieren endet der Schnitt an der Kante. Dadurch werden nur die direkt betroffenen Kanten zerlegt. geoinformation.net Folie 23 von 43 Lösungsansatz 3 Konstruktionsprinzip Trapezkarte Gegeben ist eine Landkarte S, umschlossen von einem Rechteck R; es existieren keine Knoten mit gleicher x-Koordinate Konstruiere für jeden Knoten aus S eine obere und eine untere vertikale Extension (Linie); diese Linien enden am Schnittpunkt mit der nächsten Kante aus S oder an R ! Die Trapezkarte T(S) ist eine Zerlegung, bestehend aus der Landkarte S, dem Rechteck R und den vertikalen Extensionen T(S) besteht aus disjunkten Trapezen (Dreiecken), die von (höchstens) vier Seiten (Kanten) begrenzt werden: Ein oder zwei vertikale Seiten, gebildet aus den Extensionen Genau zwei nicht-vertikale Seiten, gebildet aus Segmenten von Kanten ! " " geoinformation.net Folie 24 von 43 Lösungsansatz 3 Eigenschaften von T(S) 5 Fälle für die vertikalen Kanten (in der Abbildung die linken Kanten): 1. Die Kante entartet zu einem Punkt 2. Die untere vertikale Erweiterung trifft auf eine Kante von S 3. Die obere vertikale Erweiterung trifft auf eine Kante von S 4. Die Kante besteht aus oberer und unterer Extension 5. Die Kante besteht aus einer Kante des Rechtecks R (genau zwei Trapeze) 5x geoinformation.net Folie 25 von 43 Lösungsansatz 3 Bezeichnungen Ein Trapez ∆ ist durch vier Elemente eindeutig festgelegt: ! ! ! ! top(∆) bottom(∆) leftp(∆): Linker Endpunkt von top(∆) oder bottom(∆) oder rechter Knoten einer dritten Kante (Trapez ganz links: einer der linken Knoten von R) rightp(∆): analog zu leftp(∆) geoinformation.net Lösungsansatz 3 Komplexität der Trapezkarte Satz 1: Eine Trapezkarte T(S) einer Landkarte S mit n Kanten enthält höchstens: a) 6n + 4 Knoten und b) 3n + 1 Trapeze. Beweis: a) >>Addition der vorkommenden Knoten b) mit Eulers Formel aus a) (als Übung) Folie 26 von 43 geoinformation.net Folie 27 von 43 Lösungsansatz 3 Beweis zu Satz 1a Satz 1: Eine Trapezkarte T(S) einer Landkarte S mit n Kanten enthält höchstens: (a) 6n + 4 Knoten Beweis: Ein Knoten der Trapezkarte ist entweder 4 ein Eckpunkt von R 2·n ein Knoten der Karte S 2 ·2·n Endknoten einer Extension (n Kanten 2 · n Knoten 2 · 2 · n Endknoten) Insgesamt: 6n + 4 ! ! ! geoinformation.net Folie 28 von 43 Lösungsansatz 3 Adjazenz von Trapezen Zwei Trapeze ∆ und ∆' heißen adjazent, wenn sie sich entlang einer vertikalen Linie berühren. Es gilt entweder: top(∆) = top(∆') oder: bottom(∆) = bottom(∆') Ein Trapez kann höchstens zu vier Trapezen adjazent sein. geoinformation.net Folie 29 von 43 Lösungsansatz 3 Datenstruktur für T(S) ! ! Möglich wäre eine doppelt verkettete Kantenliste Wegen der einfachen Struktur der Trapeze bietet sich folgende Alternative an: Elemente für Knoten (mit Koordinaten) von S (leftp(∆), rightp(∆)) Elemente für Kanten (mit Referenzen auf Knoten) von S (top(∆), bottom(∆)) Elemente für Trapeze von S'' mit Referenzen auf: leftp(∆) rightp(∆) top(∆) bottom(∆) alle (maximal 4) adjazenten Trapeze " " " # # # # # ! Beachte: Die Geometrie der Trapeze ist nur implizit, kann aber in konstanter Zeit rekonstruiert werden geoinformation.net Folie 30 von 43 Lösungsansatz 3 Konstruktion und Suche ! Probleme: Konstruktion der Trapezkarte T(S) Unterstützung der Suche in einer Trapezkarte " " ! Idee für das weitere Vorgehen: Unterstützung der Suche durch eine Art „binärer Suchbaum“ D mit 2 Arten von Elementen X-Elemente für Knoten: Links oder Rechts? Y-Elemente für Kanten: Oben oder Unten? Trapezkarte und „Baum“ werden simultan konstruiert " # # " geoinformation.net Folie 31 von 43 Lösungsansatz 3 Beispiel für T(S) und D geoinformation.net Lösungsansatz 3 Aufbau des Beispiels 33x Folie 32 von 43 geoinformation.net Folie 33 von 43 Lösungsansatz 3 Zum Algorithmus ! ! ! ! ! ! ! T(S) und D werden simultan konstruiert Die Suchstrukur wird schrittweise aufgebaut: Nach "Einfügen" eines Elements in der Karte S erfolgt ein Update von Suchstruktur und Trapezkarte D ist kein Baum, sondern ein „DAG“, ein „directed acyclic graph“, ein gerichteter azyklischer Graph Dieser DAG ist zusammenhängend, hat genau eine Wurzel und genau ein Blatt für jedes Trapez von T(S) In der berechneten Suchstruktur referenzieren sich die Blätter von D und die Trapeze von T(S) gegenseitig Wie stets hängt die Tiefe (=Güte) des Baumes von der Reihenfolge der Bearbeitung der Segmente ab Idee: Zufällige Permutation der Segmente von S geoinformation.net Folie 34 von 43 Lösungsansatz 3 Pseudocode: Aufbau von T(S) & D Input: Eine Landkarte S mit n Kanten Output:Eine Trapezkarte T(S) und eine Suchstruktur D für T(S) in einem Rechteck R 1. 2. 3. 4. 5. 6. Konstruiere ein umschließendes Rechteck R Berechne eine Permutation s1, s2,...,sn der Kanten von S for i = 1 to n do Finde die Trapeze ∆0,..., ∆k in T(Si-1), die von si geschnitten werden Lösche ∆0,..., ∆k aus T(Si-1) und ersetze sie durch neue Trapeze Entferne die Elemente für ∆0,..., ∆k aus Di-1 und füge neue innere Knoten und Blätter an geoinformation.net Folie 35 von 43 Lösungsansatz 3 Übergang von i-1 zu i Offene Frage: Wie finden wir ∆0,..., ∆k? ! ! ! Konstruktion von T(Si) und Di mit Si = {s1, ..., si} unter Verwendung von T(Si-1) und Di-1 "Schleifeninvariante": T(Si-1) ist eine Trapezkarte und D(Si-1) ist eine Suchstruktur für diese Trapezkarte Der Unterschied zwischen "i - 1" und " i " betrifft genau die Trapeze in T(Si-1), die von si geschnitten werden geoinformation.net Lösungsansatz 3 Pseudocode: Finde Trapeze Input: Das Segment si , T(Si-1) und D(Si-1) Output: Die Trapeze ∆0, ..., ∆k, die von si geschnitten werden. 1. 2. 3. 4. 5. 6. 7. 8. 9. Seien pi und qi linker und rechter Knoten von si Punkt-in-Polygon für pi in Di-1: Finde ∆0 j = 0; while qi liegt rechts von rightp(∆j) do if rightp(∆j) liegt oberhalb von si then ∆j+1 ist der untere rechte Nachbar von ∆j else ∆j+1 ist der obere rechte Nachbar von ∆j j = j + 1 return ∆0, ..., ∆k Wir erhalten zwei Fälle Folie 36 von 43 geoinformation.net Folie 37 von 43 Lösungsansatz 3 Trapezfolge Fall 1 geoinformation.net Lösungsansatz 3 Beispiel zum Fall 1 15x Folie 38 von 43 geoinformation.net Folie 39 von 43 Lösungsansatz 3 Trapezfolge Fall 2 geoinformation.net Lösungsansatz 3 Beispiel für Fall 2 21x Folie 40 von 43 geoinformation.net Folie 41 von 43 Lösungsansatz 3 Effizienz I - Erwartungswerte Der oben beschriebene Algorithmus hat folgende Erwartungswerte (gemittelt über alle Permutationen von n Segmenten): ! ! ! Konstruktion von T(S) und Aufbau von D(S): O(n log n) Speicherplatz von D(S): O(n) Punkt-in-Polygon-Suche mittels D(S): O(log n) geoinformation.net Folie 42 von 43 Lösungsansatz Effizienz II - Bemerkungen ! ! ! ! Der Erwartungswert bezieht sich auf die Menge aller Permutationen Pech bei der Permutation kann zum Worst – Case O(n) für die Suche und zu entsprechender Tiefe der Suchstruktur führen Abhilfe durch Stop-Loss-Punkt setzen: Brich ab, falls D(S) zu tief wird, und fange neu an mit einer neuen Permutation Differenz zum Worst-Case O(n) für die Suche und O(n2) für die Konstruktion kann beliebig klein gemacht werden, ohne daß man von der O(n log n) – Laufzeit für die Konstruktion von D(S) sehr stark abweicht geoinformation.net Folie 43 von 43 Lösungsansatz 3 Sonderfallbetrachtung Was macht man, wenn 2 Knoten die gleichen x-Koordinaten haben? ! ! ! ! ! Beobachtung: die vertikalen Extensionen müssen eigentlich nicht vertikal, sondern nur parallel sein Wichtig sind nur die topologischen Invarianten links / rechts an den x-Knoten und oben / unten an den y-Knoten Abhilfe durch Transformation (x,y) (x + ε * y, y) für „geeignet kleines“ Epsilon Diese Transformation wird aber in Wirklichkeit gar nicht durchgeführt, sondern: (x,y) liegt rechts von (x',y') falls x > x' oder x = x' und y > y' Oben / Unten – Vergleich an y-Knoten für Segmente „in the same spirit“ (als Übung)