J'utilise PostGIS depuis longtemps mais je n'ai jamais eu à utiliser la LINESTRING
géométrie ...! :)
Voici ce que je voudrais faire: j'ai un tableau des lignes de ligne (représentant les rues d'une ville donnée, SRID 3395) et je voudrais trouver les lignes de ligne les plus proches d'un point donné (position GPS, SRID 4326).
La solution que j'ai trouvée est de sélectionner toutes les chaînes de lignes de mon point en utilisant la expand()
méthode et de déterminer la distance entre chaque chaîne de lignes et mon point en utilisant la ST_Distance()
méthode.
Voici le SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Les résultats que j'obtiens semblent corrects mais j'ai l'impression que quelque chose ne va pas dans ma mise en œuvre.
1) Pensez-vous que les gars expand()
peuvent obtenir toutes les chaînes de caractères concernées?
2) Pensez-vous que ST_Distance()
c'est la bonne méthode à utiliser? Je suppose que je me trompe, car la distance que je voudrais obtenir est la plus petite distance entre le point et ma ligne et non la distance entre le point et l'un des points de la chaîne.
Illustration:
Bonjour
Tout d'abord, la question de savoir ce que ST_Distance renvoie. ST_Distance renvoie la distance la plus courte entre la ligne et le point (ou quels types de géométrie sont entrés) Cela signifie que ST_Distance entre le point (1 3) et la chaîne de caractères (0 0,0 10) renverra 1. La distance ne sera pas mesurée entre le point et (0 0) ou le point et (0 10) mais du point (1 3) à (0 3).
Donc d'après ce que je comprends, ST_Distance vous donne la réponse que vous voulez.
Si vous voulez trouver le point (0 3) dans l'exemple ci-dessus, vous pouvez utiliser ST_Closestpoint si vous avez PostGIS 1.5 Pour mon exemple, vous l'utilisez comme ceci: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' POINT (1 3) ':: geometry) alors vous devriez obtenir le point (0 3) en retour, le point sur la ligne qui est le plus proche de votre point.
HTH Nicklas
la source
Je l'ai trouvé :) (Bon je suppose: P)
En utilisant le
ST_Line_Locate_Point()
etST_Line_Interpolate_point()
j'ai réussi à obtenir un point qui NE fait PAS partie de la définition de LINESTRING mais EST sur ladite ligne :) Tout ce que j'ai à faire est d'obtenir la distance de mon point à ce point et j'ai terminé.La
ST_Line_Locate_Point()
méthode recherche l'emplacement du point le plus proche sur la ligne jusqu'au point donné, laST_Line_Interpolate_Point
méthode transforme cet emplacement en un point.la source
ST_Distance(geometry g1, geometry g2)
Ce fil d'archive Postgis peut vous répondre http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
la source