传单 JS : quickest path with custom points

标签 leaflet

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

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

Custom Points and Route

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

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

PS。我正在使用 Leaflet JS,并且不依赖 OSM 或 Google map ,因为我有自己的自定义图像作为图层

最佳答案

好吧,多亏了andrewhayward,我才成功做到了这一点。 Dijkstra 算法的 JavaScript 实现可以在 here 找到。 .

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

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

第 1 步:通过单击特定点将节点添加到 map

允许在单击特定点时创建节点。

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

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

第2步:将在 map 上添加的节点的函数

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

例如,如果按住 CTRL 并单击节点 A,则可以按住 ALT(移除 CTRL 按钮后)并选择将连接到节点 A 的节点 B、C 和 D。完成后,只需取消按住 ALT 按钮。

这将在文本区域上显示 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)
}

我希望这可以帮助那里的人,因为我经过了很多思考才做到这一点。

祝一切顺利!

关于传单 JS : quickest path with custom points,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871519/

相关文章:

javascript - 让 OverlappingMarkerSpiderfier 和 Leaflet 工作的问题

leaflet - 在Leaflet map 上显示方向路线

javascript - 为什么当我加长这条线时,它的方向会改变?

javascript - 将数据添加到第二个传单 map 会影响第一个 map 中的 mouseOff 行为

r - 使用 R 中的传单通过 ssl 加载提供商磁贴

javascript - 如何防止 map.on ("click") 通过点击触摸板一次触发两次?

r - R : How to customize the coloring of clusters?的传单

javascript - 如何在传单 map 上显示SQL查询

javascript - Leaflet:如何在数据库中保存各种标记位置并稍后加载

leaflet - Geojson/草坪 : merge multiple polygons to one polygon keeping hole