Wie erhalte ich Abstand und Peilung zwischen einem Punkt und dem nächsten Teil eines Polygons?

9

Ich bin ziemlich neu im Schreiben von SQL und in der Verwendung von PostGIS. Ich entschuldige mich, wenn dies ein bisschen einfach oder offensichtlich erscheint. Ich habe eine Tabelle mit Polygon-Features in einer PostGIS-Datenbank und muss eine SQL-Abfrage schreiben, um alle Attribute, den Abstand und die Richtung der Polygon-Features innerhalb eines bestimmten Abstands von einem vordefinierten Punkt auszuwählen. Ich habe es geschafft, die Merkmale auszuwählen und den Abstand zu berechnen (mit ST_Distance), kann aber nicht herausfinden, wie ich die Peilung erhalte.

Dies ist das Skript, das ich bisher verwende:

SELECT *,
  ST_Distance (Geometry, ST_GeomFromText ('POINT(292596 90785)', 27700))
FROM mytable
WHERE
  ST_DWithin(
    Geometry,
    ST_GeomFromText('POINT(292596 90785)', 27700),
    250) 

Wie berechne ich die Peilung der Merkmale sowie den Abstand?

JamesC
quelle

Antworten:

4

Sie können ST_Azimuth verwenden, um die Peilung zu berechnen, es werden jedoch nur Punktgeometrien als Parameter verwendet, sodass Sie entscheiden müssen, welche Peilung Sie wirklich möchten.

Sie können die kürzeste Linie auswählen, wie @Nicklas vorgeschlagen hat (es ist die mit der Entfernung, die Sie bereits berechnet haben). Dies ist sinnvoll, wenn Sie die schnellste "Richtung" benötigen, um das Polygon zu erreichen. Für alles andere schlage ich vor, dass Sie es anhand des Polygonschwerpunkts (ST_Centroid) berechnen, der für beliebige Formen bessere Ergebnisse liefern sollte.

lynxlynxlynx
quelle
2

Verwenden

ST_Azimuth (ST_Shortestline (geom1, geom2))

bearbeiten

Ich habe gerade festgestellt, dass ST_Azimuth keinen Linestring als Argument annimmt, daher müssen Sie ihm stattdessen zwei Punkte geben.

Wenn eine der Geometrien ein Punkt ist, können Sie diesen direkt verwenden und ST_ClosestPoint verwenden, um den Punkt auf dem Polygon abzurufen.

Nicklas Avén
quelle
1

ST_Azimuth ist die gewünschte Funktion. Es gibt den Winkel im Bogenmaß von Norden im Uhrzeigersinn zurück. Wie das Beispiel auf der ST_Azimuth()Seite zeigt, erhalten Sie durch einfaches Umschließen der degrees()Funktion den Winkel in Grad, wenn Sie dies benötigen.

MerseyViking
quelle