Bonjour
Quelqu'un d'entre vous sait-il comment calculer la distance minimale entre un point et une polyligne ou obtenir les coordonnées du point de la polyligne le plus plroc du point ?
Pascal
Bonjour
Quelqu'un d'entre vous sait-il comment calculer la distance minimale entre un point et une polyligne ou obtenir les coordonnées du point de la polyligne le plus plroc du point ?
Pascal
Salut Pascal,
regardes avec les fonctions turf si ça peut répondre à ton problème.
Calcul de la distance entre un point et une ligne
https://turfjs.org/docs/#pointToLineDistance
Si besoin, conversion d'un polygone en multilignes
https://turfjs.org/docs/#polygonToLine
Avec la librairie turf, les calculs se font en mode coordonnées géographiques.
Je te laisse voir si ça peut t'aider.
Xav
Salut XavLight
Je vais regarder mais j'ai trouvé des méthodes MySQL (ça tombe bien, les données sont dans une base MySQL)
Le résultat est pas mal sauf pour P2 qui contrairement aux P1 et P3 est vraiment loin de la stringline, le point de celle-ci le plus proche étant le bout nord-ouest de la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SET @ls = 'LineString(-1.330612337516323 46.1838784635389, -1.337450027016408 46.17007432243334, -1.319968698261084 46.16610051556031, -1.297392883040005 46.16218718163123, -1.287842996815222 46.16729994822109, -1.2932928099298 46.1743292669458, 1.303584490927381 46.18455617068945, -1.307852453145282 46.18732303600101)'; SET @p1s = 'point(-1.304473 46.186323)'; SELECT ST_Distance(ST_GEOMFROMTEXT(@p1s),ST_GEOMFROMTEXT(@ls)), ST_Distance(ST_GEOMFROMTEXT(@p1s),ST_GEOMFROMTEXT(@ls)) * 111139; SET @p2s = 'point(-1.314473 46.186323)'; SELECT ST_Distance(ST_GEOMFROMTEXT(@p2s),ST_GEOMFROMTEXT(@ls)), ST_Distance(ST_GEOMFROMTEXT(@p2s),ST_GEOMFROMTEXT(@ls)) * 111139; SET @p3s = 'point(-1.321463 46.168062)'; SELECT ST_Distance(ST_GEOMFROMTEXT(@p3s),ST_GEOMFROMTEXT(@ls)), ST_Distance(ST_GEOMFROMTEXT(@p3s),ST_GEOMFROMTEXT(@ls)) * 111139;
Tiercé gagnant avec turf
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <script src='https://unpkg.com/@turf/turf@6/turf.min.js'></script> <script> var line = turf.lineString([[-1.330612337516323,46.1838784635389],[-1.337450027016408,46.17007432243334],[-1.319968698261084,46.16610051556031],[-1.297392883040005,46.16218718163123],[-1.287842996815222,46.16729994822109],[-1.2932928099298,46.1743292669458],[1.303584490927381,46.18455617068945],[-1.307852453145282,46.18732303600101]]); var pt1 = turf.point([-1.304473,46.186323]); var distance = turf.pointToLineDistance(pt1, line, {units: 'kilometers'}); console.log(distance) var pt2 = turf.point([-1.314473,46.186323]); var distance = turf.pointToLineDistance(pt2, line,{units: 'kilometers'}); console.log(distance) var pt3 = turf.point([-1.321463, 46.168062]); var distance = turf.pointToLineDistance(pt3, line,{units: 'kilometers'}); console.log(distance) </script>
L'équivalent de turf javascript en PHP ou autre langage côté serveur ?
Hello Pascal,
alors d'abord côté JS toujours avec Turf pour trouver tes coordonnées, il y a peut-être une piste que je te laisse expérimenter.
Donc 1ère étape, tu as trouvé la distance avec la fonction précédente.
Avec cette distance, tu calcules un buffer par rapport à ton point de départ, en ajoutant la distance trouvée.
https://turfjs.org/docs/#buffer
Tu vas donc avoir un cercle avec un rayon de la distance trouvée.
Exemple (mettre steps à une valeur de 64 pour avoir un cercle le plus rond possible) :
Ensuite, il faut trouver l'intersection entre ce nouveau polygone (cercle) et ta ligne ou polygone.
Code : Sélectionner tout - Visualiser dans une fenêtre à part var buffered = turf.buffer(point, 500, {units: 'kilometers', steps: 64});
Tu as la fonction intersect pour ça.
https://turfjs.org/docs/#intersect
Je te laisse tester déjà pour voir si ça fonctionne.
*********************************************************************************************
Côté PHP
il y a une personne qui a réécrit un contrôleur turf en PHP (il y a 2 ans).
Il n'y a pas forcément toutes les fonctions, mais regardes si tu trouves ton bonheur.
En regardant rapidement, pas vu les fonctions qui t'intéresseraient.
https://gist.github.com/sahilkashyap...1452711dd69944
Sinon, encore autre chose :
https://geophp.net
et un fork de cette librairie, un peu plus récente https://github.com/funiq/geoPHP
ou encore https://github.com/mjaschen/phpgeo
Mais pas sûr que tu trouves ton bonheur côté PHP.
Xav
Merci pour tes réponses.
Pour trouver les coordonnées les plus proches sur la ligne, Turf bien sûr !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 var pt2 = turf.point([-1.314473,46.186323]); var distance = turf.pointToLineDistance(pt2, line,{units: 'kilometers'});
Partager