Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单击了多段线的哪一段?_Javascript_Google Maps_Google Maps Api 3_Map Projections - Fatal编程技术网

Javascript 单击了多段线的哪一段?

Javascript 单击了多段线的哪一段?,javascript,google-maps,google-maps-api-3,map-projections,Javascript,Google Maps,Google Maps Api 3,Map Projections,我已经设置了一个标记,并且允许用户单击多段线时创建新标记 我想知道是否有一个简单的方法来确定新标记是在标记0和1之间,还是在标记1和2之间。。。或者在4到5之间。我考虑过检查新标记是否在边界框内,以及点入线公式,但两者都不是100%精确的。由于谷歌地图用于投影GPS坐标,您不能使用“线方程”来表示GPS坐标,因为gps点的投影不是线性的,而是可以使用线性的世界坐标。在这里,我使用了线方程的参数形式来检查线段上的点: function isPointOnSegment( map, gpsPoint

我已经设置了一个标记,并且允许用户单击多段线时创建新标记

我想知道是否有一个简单的方法来确定新标记是在标记0和1之间,还是在标记1和2之间。。。或者在4到5之间。我考虑过检查新标记是否在边界框内,以及点入线公式,但两者都不是100%精确的。

由于谷歌地图用于投影GPS坐标,您不能使用“线方程”来表示GPS坐标,因为gps点的投影不是线性的,而是可以使用线性的
世界坐标。在这里,我使用了线方程的参数形式来检查线段上的

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 p.x == p1.x && p.y == 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 = (p.y - p1.y)/(p2.y-p1.y);
        return p.x == 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 = (p.x - p1.x)/(p2.x-p1.x);
        return p.y == p1.y && t_x >= 0 && t_x <= 1;
     }
     //-----Case 4----
     //      x = x1 + t(x2-x1)
     //      y = y1 + t(y2-y1) 
     //---------------
     t_x = (p.x - p1.x)/(p2.x-p1.x);
     t_y = (p.y - p1.y)/(p2.y-p1.y);
     return ( t_x == t_y && t_x >= 0 && t_x <= 1 && t_y >= 0 && t_y <= 1);
} 
函数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;
变量t_y;
//直线方程的参数形式为:
//--------------------------------
//x=x1+t(x2-x1)
//y=y1+t(y2-y1)
//--------------------------------
//如果“t”是[0,1]中的数字,则“p”位于[p1,p2]段上
//-----案例1----
//x=x1
//y=y1
//---------------
if(p2.x-p1.x==0&&p2.y-p1.y==0){
返回p.x==p1.x&&p.y==p1.y;
}否则
//-----案例2----
//x=x1
//y=y1+t(y2-y1)
//---------------
if(p2.x-p1.x==0&&p2.y-p1.y!=0){
t_y=(p.y-p1.y)/(p2.y-p1.y);

返回p.x==p1.x&&t\u y>=0&&t\u y=0&&t\u x=0&&t\u x=0&&t\u y我见过的最佳解决方案。它只会中断(被零除)如果分段完全是水平或垂直的,但在实践中不太可能发生这种情况,因为我让用户手动放置标记。@HeitorChang啊,是的,关于水平和垂直的情况,你是对的,我错过了。我已经更新了我的答案。请检查。谢谢你的详细说明。如果可以,我会再次投票:)