0

나는 sample polyline with five segments을 설정하고, 나는 사용자가 폴리 라인을 클릭하면 새로운 마커를 생성 할 수 있도록하고있다.클릭 한 폴리 라인의 세그먼트는 어느 것입니까?

새 마커가 마커 0과 1 또는 1과 2 사이에 있는지 또는 4와 5 사이에 있는지를 확인하는 확실한 방법이 있는지 알고 싶습니다. 새로운 마커 경계 상자 안에 있고 포인트 인 라인 수식이 있지만 어느 것도 100 % 정확하지 않습니다.

답변

5

Google지도는 GPS 좌표를 투영하는데 Mercator Projection을 사용하기 때문에 gps 좌표에는 투영법이 선형이 아니므로 gps 좌표에는 'line equation'을 사용할 수 없습니다. 대신 선형 인 world coordinates을 사용할 수 있습니다. 여기에 내가 point 여부 세그먼트에서 확인할 라인 방정식의 파라 메트릭 양식을 사용하고 있습니다 :

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); 
} 

클릭 한 점과 폴리 라인의 모든 세그먼트를 가지고, 당신은 구현 기능 이상 사용하고 찾고 있던 세그먼트를 검색 할 수 있습니다.

+0

최고의 솔루션을 나는 보았다. 세그먼트가 정확히 수평 또는 수직 인 경우에만 나누기 (0으로 나누기)하지만 사용자가 마커를 직접 가져 가야하므로 실제로는 그렇지 않습니다. –

+0

@HeitorChang 아, 그래, 내가 놓친 수평 및 수직의 경우가 맞다. 나는 나의 대답을 업데이트했다. 확인해주십시오. – Engineer

+0

철저히 해 주셔서 감사합니다. 내가 할 수 있으면 다시 upvote 것이다 :) –

관련 문제