Quel segment d'une polyligne a été cliqué?

J'ai configuré un échantillon de polyligne avec cinq segments , et j'autorise les nouveaux marqueurs à être créés lorsque l'utilisateur clique sur la polyligne.

J'aimerais savoir s'il existe un moyen infaillible de déterminer si le nouveau marqueur se situe entre les marqueurs 0 et 1, ou 1 et 2 … ou entre 4 et 5. J'ai envisagé de vérifier si le nouveau marqueur se trouve dans une limite Boîte, et les formules point-en-ligne, mais aucune n'est 100% précise.

Comme Google Maps utilise Mercator Projection pour projeter des coordonnées GPS, vous ne pouvez pas utiliser 'équation de ligne' pour les coordonnées gps, car la projection n'est pas linéaire pour les points gps. Mais vous pouvez utiliser world coordinates linéaires. Ici, j'ai utilisé une forme paramétrique d'équation de ligne pour vérifier si point sur le segment:

 function isPointOnSegment( map, gpsPoint1, gpsPoint2, gpsPoint ){ var p1 = map.getProjection().fromLatLngToPoint( gpsPoint1 ); var p2 = map.getProjection().fromLatLngToPoint( gpsPoint2 ); var p = map.getProjection().fromLatLngToPoint( gpsPoint ); var t_x; var t_y; //Parametric form of line equation is: //-------------------------------- // x = x1 + t(x2-x1) // y = y1 + t(y2-y1) //-------------------------------- //'p' is on [p1,p2] segment,if 't' is number from [0,1] //-----Case 1---- // x = x1 // y = y1 //--------------- if( p2.x-p1.x == 0 && p2.y-p1.y == 0){ return px == p1.x && py == p1.y; }else //-----Case 2---- // x = x1 // y = y1 + t(y2-y1) //--------------- if( p2.x-p1.x == 0 && p2.y-p1.y != 0){ t_y = (py - p1.y)/(p2.y-p1.y); return px == p1.x && t_y >= 0 && t_y <= 1; }else //-----Case 3---- // x = x1 + t(x2-x1) // y = y1 //--------------- if( p2.x-p1.x != 0 && p2.y-p1.y == 0){ t_x = (px - p1.x)/(p2.x-p1.x); return py == p1.y && t_x >= 0 && t_x <= 1; } //-----Case 4---- // x = x1 + t(x2-x1) // y = y1 + t(y2-y1) //--------------- t_x = (px - p1.x)/(p2.x-p1.x); t_y = (py - p1.y)/(p2.y-p1.y); return ( t_x == t_y && t_x >= 0 && t_x <= 1 && t_y >= 0 && t_y <= 1); } 

En ayant un point cliqué et tous les segments de polyligne, vous pouvez utiliser la fonction mise en place ci-dessus et récupérer le segment que vous recherchiez.