Leaflet JS:自定义点的最快路径

时间:2017-01-26 10:33:28

标签: leaflet

我正在开展一个项目,让我可以让用户浏览我的客户的建筑物。建筑物内部的路径绝对没有在OSM或谷歌等地图中定义。

是否有插件我可以在路径上定义每个,当我设置开始结束点时,它会找到最短的路径?

Custom Points and Route

图像显示绿色,开始(黄色)和结束(红色)点的声明点。插件或算法应链接相关点以形成最短路径(以紫色显示)

非常感谢你!如果那里没有插件,我可能必须自己创建一个插件。

PS。我使用的是Leaflet JS,我不依赖于OSM或Google地图,因为我有自己的自定义图像作为图层

1 个答案:

答案 0 :(得分:1)

好的,我设法做到这一点归功于andrewhayward的Dijkstra算法的JavaScript实现,可以找到here

除此之外,这就是我所做的......

这些函数只是为了帮助我在Dijkstra算法中导出节点和节点之间的距离:

步骤1:点击特定点

,将节点添加到地图中

单击特定点时启用节点。

map.on('click', function (e) {
    var node = [];
    node[0] = e.latlng.lat;
    node[1] = e.latlng.lng;
    addNodes(node,curr_node);
});

您必须创建一个textarea,以便打印必要的变量,供您在Dijkstra算法中使用。完成所有节点声明之后,您可以删除textarea以及所有其他不再需要的函数。

第2步:将添加到地图上的节点的功能

添加的每个节点都会有一个' ctr + click'功能,以便您可以选择将链接到该节点的其他节点。

例如,如果按住CTRL并单击节点A,则可以按住ALT(删除CTRL按钮后)并选择节点B,C& D将连接到节点A.完成后,只需按住ALT按钮即可。

这将在textarea上显示 A {B:25,C:15,D:32},,供您在Dijkstra算法中使用。

数字25,15和32是各个节点到节点A之间的距离。这是通过我从here即兴创作的 getDistanceFromLatLonInM 函数计算的。

function addNodes(polyNodes,num){
var marker = L.marker([polyNodes[0], polyNodes[1]]).addTo(map);
var myIcon = L.icon({
    iconUrl: 'images/point.png',
    iconSize: [16, 16],
    iconAnchor: [8, 8],
    popupAnchor: [-3, -76]
});
marker.setIcon(myIcon);
marker.on('click',function(e){
    if(ctrlPressed){
        curr_ctrl_pt = [polyNodes[0], polyNodes[1]];
        var oldText = $('#textarea_nodes').val();
        $('#textarea_nodes').val(oldText + num + ':{');
        var myIcon_2 = L.icon({
            iconUrl: 'images/point_c.png',
            iconSize: [16, 16],
            iconAnchor: [8, 8],
            popupAnchor: [-3, -76]
        });
        this.setIcon(myIcon_2); // custom marker to show that the node has been declared. This is just for your own reference
    }
    if(altPressed){
        var oldText = $('#textarea_nodes').val();
        $('#textarea_nodes').val(oldText + num + ':' + getDistanceFromLatLonInM(polyNodes[0], polyNodes[1],curr_ctrl_pt[0],curr_ctrl_pt[1]) + ',');
        }
    })
}
function getDistanceFromLatLonInM(lat1,lon1,lat2,lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return (d * 1000).toFixed(1);
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}

我希望这可以帮助那些人,因为我经历了很多想法。

一切顺利!