首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传单JS:带有自定义点的最快路径

问传单JS:带有自定义点的最快路径
EN

Stack Overflow用户
提问于 2017-01-26 10:33:28
回答 1查看 2K关注 0票数 2

我正在做一个项目,我可以让用户在我的客户大楼周围导航。建筑物内的路径绝对不是像OSM或google这样的地图所定义的。

是否有一个插件可以定义路径上的每个点,并且当我设置start和end点时,它会找到最短的路径?

​

​

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-30 17:20:20

好的,我成功地做到了,这要感谢和尾翼的Dijkstra算法的JavaScript实现,该算法可以找到这里。

除此之外,我还做了.

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

步骤1:通过单击特定点向地图添加节点

当您单击特定点时,启用要创建的节点。

代码语言:javascript
复制
map.on('click', function (e) {
    var node = [];
    node[0] = e.latlng.lat;
    node[1] = e.latlng.lng;
    addNodes(node,curr_node);
});

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

步骤2:将添加到映射上的节点的函数

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

例如,如果您持有CTRL并单击节点A,您可以保持ALT (在删除CTRL按钮之后)并选择节点B、C&D,这些节点将在完成后连接到节点A。

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

数字25、15和32是各个节点到节点A之间的距离。这是由getDistanceFromLatLonInM函数计算的,这是我从这里临时提出的。

代码语言:javascript
复制
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)
}

我希望这能帮助到外面的人,因为我花了很多心思才能做到这一点。

万事如意!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41871519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档