Comment obtenir la distance et le relèvement entre un point et la partie la plus proche d'un polygone?

9

Je suis assez nouveau pour écrire SQL et utiliser PostGIS, donc excuses si cela semble un peu simple ou évident. J'ai une table d'entités surfaciques dans une base de données postGIS et je dois écrire une requête SQL pour sélectionner tous les attributs, la distance et la direction des entités surfaciques à une certaine distance d'un point prédéfini. J'ai réussi à sélectionner les entités et à calculer la distance (à l'aide de ST_Distance) mais je ne peux pas déterminer comment obtenir le relèvement.

Voici le script que j'utilise jusqu'à présent:

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

Comment calculer le relèvement des entités ainsi que la distance?

JamesC
la source

Réponses:

4

Vous pouvez utiliser ST_Azimuth pour calculer le relèvement, mais cela ne prend que des géométries ponctuelles comme paramètres, vous devez donc décider quel relèvement vous voulez vraiment.

Vous pouvez choisir la ligne la plus courte comme l'a suggéré @Nicklas (c'est celle avec la distance que vous avez déjà calculée), ce qui est logique si vous avez besoin de la "direction" la plus rapide pour atteindre le polygone. Pour toute autre chose, je vous suggère de le calculer par rapport au polygone centroïde (ST_Centroid), ce qui devrait donner de meilleurs résultats pour les formes arbitraires.

lynxlynxlynx
la source
2

Utilisation

ST_Azimuth (ST_Shortestline (geom1, geom2))

Éditer

Je viens de réaliser que ST_Azimuth ne prend pas une chaîne de caractères comme argumetn, vous devrez donc lui donner deux points à la place.

Si l'une des géométries est un point, vous pouvez l'utiliser directement et utiliser ST_ClosestPoint pour obtenir le point sur le polygone.

Nicklas Avén
la source
1

ST_Azimuth est la fonction que vous souhaitez. Il renvoie l'angle en radians dans le sens horaire à partir du nord. Comme le montre l'exemple sur la ST_Azimuth()page, il suffit de l'envelopper dans la degrees()fonction pour vous donner l'angle en degrés si c'est ce dont vous avez besoin.

MerseyViking
la source