Ich habe eine PostGIS-Tabelle mit einigen Polygonen (gespeichert unter Verwendung des Geografiedatentyps). Sie repräsentieren Regionen auf einer kugelförmigen Erde.
Für jedes Scheitelpunktpaar, das aus allen Polygonen ausgewählt wurde, möchte ich berechnen, ob diese beiden Scheitelpunkte für einander "sichtbar" sind. (Es gibt n * ( n -1) / 2 solcher Paare, wobei n die Gesamtzahl der eindeutigen Eckpunkte über alle Polygone in der Tabelle ist.) Mit "für einander sichtbar" meine ich, dass der Großkreispfad zwischen dem Zwei Eckpunkte schneiden keines der Polygone in der Tabelle.
Was ist der schnellste Weg, um diese Berechnung durchzuführen, vorzugsweise in PostgreSQL / PostGIS?
Ich habe etwas, das funktioniert, aber es ist langsam. Ich iteriere nur naiv über alle Paare und sehe, ob der LineString zwischen ihnen Polygone schneidet. (Der Geografiedatentyp von PostGIS erledigt für mich die ganze harte Mathematik auf der Kugel.) Ich frage mich also, ob es eine clevere Datenstruktur oder einen cleveren Algorithmus gibt, der die Dinge beschleunigen könnte.
Antworten:
Leiten Sie ab, was nicht sichtbar ist. Angenommen, Sie stehen an einem Scheitelpunkt am Strand und betrachten zwei entfernte Scheitelpunkte eines benachbarten Polygons. Dann können Sie davon ausgehen, dass jeder Scheitelpunkt im gesamten Sektor hinter diesen Scheitelpunkten von diesem Scheitelpunkt aus unsichtbar ist.
quelle