Suite

Détecter si le point se trouve à gauche ou à droite de la ligne dans PostGIS ?

Détecter si le point se trouve à gauche ou à droite de la ligne dans PostGIS ?


J'ai une table de chaînes de lignes et une table de points dans postgis.

Je connais la ligne la plus proche d'un point donné. Ce que j'ai besoin de savoir, c'est de quel "côté" de cette ligne se trouve le point. Je suppose que je dois le faire en créant une ligne perpendiculaire d'un point donné à la ligne (point le plus proche de la ligne), puis en comparant les coordonnées, mais je ne sais pas exactement comment faire cela, et si c'est la bonne façon, puisque la ligne change de direction.

J'ai fait une photo pour illustrer ma tâche.

La ligne elle-même est noire, sa direction est indiquée par des flèches vertes. Je dois ajouter une colonne "latérale" à la table des points, de sorte que les points rouges aient la valeur "droite" et les points bleus aient la valeur "gauche".

Quelqu'un peut-il donner un exemple de code SQL pour calculer une valeur "latérale" d'un point ?


sélectionnez (ST_Azimuth(h.vec) - ST_Azimuth(h.seg)) à partir de ( sélectionnez ST_MakeLine(cp.p, point.geom) vec, ST_MakeLine(cp.p, ST_LineInterpolatePoint( line.geom, ST_LineLocatePoint(line.geom, cp) .p) * 1.01) ) sépare de ( sélectionnez ST_ClosestPoint(line.geom, point.geom) ) p comme cp ) comme h

L'idée est donc de calculer l'angle entre le segment de ligne le plus proche et le vecteur du point le plus proche de la ligne à votre point.

obtenir un point le plus proche sur une ligne

sélectionnez ST_ClosestPoint(line.geom, point.geom)

créer le vecteur du point le plus proche de votre point

ST_MakeLine(cp.p, point.geom) vec

créer un vecteur parmi votre ligne

ST_MakeLine( --original point cp.p, --trouver un point à côté du point le plus proche sur la ligne ST_LineInterpolatePoint(line.geom, ST_LineLocatePoint(line.geom, cp.p) * 1.01)) seg

faire la différence entre les directions

ST_Azimut(h.vec) - ST_Azimut(h.seg)

Ainsi, la droite et la gauche seront supérieures à zéro et inférieures à zéro.


Une méthode alternative si vous utilisez la version 2.5.0 ou ultérieure de PostGIS, vous pouvez fournir un argument "side" àST_Tampon. Une méthode alternative à laST_LineInterpolatePointavec une valeur de projection mise à l'échelle est d'utiliser

ST_Contains(ST_Buffer(line.geom, 100, 'côté=gauche'), point.geom)

Un inconvénient de ceci est la nécessité de donner une distance (dans ce cas 100) pour construire le tampon sur le côté gauche de la LineString mais dans mon cas j'ai déjà un seuil de proximitépoint.geomdoit être associé àligne.geom.