나는 sample polyline with five segments을 설정하고, 나는 사용자가 폴리 라인을 클릭하면 새로운 마커를 생성 할 수 있도록하고있다.클릭 한 폴리 라인의 세그먼트는 어느 것입니까?
새 마커가 마커 0과 1 또는 1과 2 사이에 있는지 또는 4와 5 사이에 있는지를 확인하는 확실한 방법이 있는지 알고 싶습니다. 새로운 마커 경계 상자 안에 있고 포인트 인 라인 수식이 있지만 어느 것도 100 % 정확하지 않습니다.
나는 sample polyline with five segments을 설정하고, 나는 사용자가 폴리 라인을 클릭하면 새로운 마커를 생성 할 수 있도록하고있다.클릭 한 폴리 라인의 세그먼트는 어느 것입니까?
새 마커가 마커 0과 1 또는 1과 2 사이에 있는지 또는 4와 5 사이에 있는지를 확인하는 확실한 방법이 있는지 알고 싶습니다. 새로운 마커 경계 상자 안에 있고 포인트 인 라인 수식이 있지만 어느 것도 100 % 정확하지 않습니다.
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으로 나누기)하지만 사용자가 마커를 직접 가져 가야하므로 실제로는 그렇지 않습니다. –
@HeitorChang 아, 그래, 내가 놓친 수평 및 수직의 경우가 맞다. 나는 나의 대답을 업데이트했다. 확인해주십시오. – Engineer
철저히 해 주셔서 감사합니다. 내가 할 수 있으면 다시 upvote 것이다 :) –