我需要检查折线是否在标记下运行。标记和折线在该点应具有相同的 latLng。问题是我的 map 上有多个标记。我似乎无法弄清楚如何才能选择正确的多段线。
标记/折线的对象:
{
latLng: Array with latLng's,
marker: Leaflet marker/polyline layer object,
selected: boolean
}
穿过标记的折线包含与标记相同的经纬度点,但我无法获得正确的结果。我认为这更像是一个数学问题
更多信息图片:
附言抱歉我的英语不好
最佳答案
你可以试试这个:
markerLatLng = marker.getLatLng()
for(var i = 0; i < latLng.length-1; i++){
if (isBetween(latLng[i], latLng[i+1], markerLatLng)){
// marker is between this line segment
selected = true; //or do what you want to here
}
}
def isBetween(a, b, c){
crossproduct = (c.lng - a.lng) * (b.lat - a.lat) - (c.lat - a.lat) * (b.lng - a.lng);
if(Math.abs(crossproduct) > epsilon) return false; //epsilon = 0 for integers, use small number operations on floating point coordinates
dotproduct = (c.lat - a.lat) * (b.lat - a.lat) + (c.lng - a.lng)*(b.lng - a.lng);
if(dotproduct < 0) return false;
squaredlengthba = (b.lat - a.lat)*(b.lat - a.lat) + (b.lng - a.lng)*(b.lng - a.lng);
if(dotproduct > squaredlengthba) return false;
return true;
}
注意:浮点算术错误会让您在这里感到痛苦。修改 epsilon 以增加标记被视为“在线”的行周围的缓冲区。
关于javascript - 单击标记并突出显示底层折线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29367661/