我正在做一个项目,我可以让用户在我的客户大楼周围导航。建筑物内的路径绝对不是像OSM或google这样的地图所定义的。
是否有一个插件可以定义路径上的每个点,并且当我设置start和end点时,它会找到最短的路径?

图像以绿色、起始点(黄色)和结束点(红色)显示声明的点。插件或算法应该将相关的点连接起来,形成最短的路径(以紫色显示)。
非常感谢!如果没有插件,我可能必须自己创建一个插件。
PS。我使用传单JS,我不依赖OSM或Google地图,因为我有自己的自定义图像作为图层
发布于 2017-01-30 17:20:20
好的,我成功地做到了,这要感谢和尾翼的Dijkstra算法的JavaScript实现,该算法可以找到这里。
除此之外,我还做了.
这些函数只是为了帮助我推导出Dijkstra算法中使用的节点和节点之间的距离:
步骤1:通过单击特定点向地图添加节点
当您单击特定点时,启用要创建的节点。
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函数计算的,这是我从这里临时提出的。
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)
}我希望这能帮助到外面的人,因为我花了很多心思才能做到这一点。
万事如意!
https://stackoverflow.com/questions/41871519
复制相似问题