繁体   English   中英

如何在 OpenStreetMap 上获取两点之间的路线?

[英]How to get route between two points on OpenStreetMap?

我正在开发一个网络/应用程序来为一个城市的 n 个点找到最佳路线,这样我就可以在尽可能短的时间内走遍每个点。 我想使用谷歌地图 API 但它不是免费的,所以我选择了 OpenStreetMap,到目前为止我设法在页面上显示了 map:

function initMap() {
   map = new OpenLayers.Map("map");
   var mapnik         = new OpenLayers.Layer.OSM();
   var fromProjection = new OpenLayers.Projection("EPSG:4326");   // Transform from WGS 1984
   var toProjection   = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
   var position       = new OpenLayers.LonLat(long, lat).transform( fromProjection, toProjection);
   var zoom           = 14; 

   map.addLayer(mapnik);
   map.setCenter(position, zoom );
}

$(document).ready(function() {
    initMap();
});

我想选择一个起点,然后找到到其他点的所有距离,选择最短的,然后从那个点重复这个过程并制作一个列表,然后用所有点制作一条路线并将其显示在 map 上,或者至少有和排序的点列表。

现在我不知道如何获得从 A 到 B 的路线或距离,用点来制作路线。 而 OSM 维基还不清楚。 我不知道我是否解释得很好。

我试过google maps api,但是是付费的。 openstreetmap 文档非常不清楚,我无法在任何地方找到示例,而且我没有地理编码经验。

您要解决的问题通常被称为旅行商问题,例如给定点集的最短路线是什么。 它是“优化中研究最深入的问题之一”

您采用的方法最类似于nearest_neighbor_algorithm ,这是有史以来第一个用于解决问题的方法之一,也非常简单:选择一个点,找到离该点最近的点,然后重复直到完成。

在实施方面,我相信这个 StackExchange 答案有您要找的东西。 它具有一个 JSFiddle,它可以完成您正在尝试做的事情,并且还像您的代码一样使用 OpenLayers。

 var points = [], msg_el = document.getElementById('msg'), url_osrm_nearest = '//router.project-osrm.org/nearest/v1/driving/', url_osrm_route = '//router.project-osrm.org/route/v1/driving/', icon_url = '//cdn.rawgit.com/openlayers/ol3/master/examples/data/icon.png', vectorSource = new ol.source.Vector(), vectorLayer = new ol.layer.Vector({ source: vectorSource }), styles = { route: new ol.style.Style({ stroke: new ol.style.Stroke({ width: 6, color: [40, 40, 40, 0.8] }) }), icon: new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], src: icon_url }) }) }; console.clear(); var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }), vectorLayer ], view: new ol.View({ center: [-5685003, -3504484], zoom: 11 }) }); map.on('click', function(evt){ utils.getNearest(evt.coordinate).then(function(coord_street){ var last_point = points[points.length - 1]; var points_length = points.push(coord_street); utils.createFeature(coord_street); if (points_length < 2) { msg_el.innerHTML = 'Click to add another point'; return; } //get the route var point1 = last_point.join(); var point2 = coord_street.join(); fetch(url_osrm_route + point1 + ';' + point2).then(function(r) { return r.json(); }).then(function(json) { if(json.code.== 'Ok') { msg_el.innerHTML = 'No route found;'; return. } msg_el;innerHTML = 'Route added'. //points;length = 0. utils.createRoute(json.routes[0];geometry); }); }); }): var utils = { getNearest. function(coord){ var coord4326 = utils;to4326(coord), return new Promise(function(resolve. reject) { //make sure the coord is on street fetch(url_osrm_nearest + coord4326.join()).then(function(response) { // Convert to JSON return response;json(). }).then(function(json) { if (json.code === 'Ok') resolve(json.waypoints[0];location); else reject(); }); }), }: createFeature. function(coord) { var feature = new ol:Feature({ type, 'place': geometry. new ol.geom.Point(ol.proj;fromLonLat(coord)) }). feature.setStyle(styles;icon). vectorSource;addFeature(feature), }: createRoute. function(polyline) { // route is ol.geom.LineString var route = new ol.format:Polyline({ factor. 1e5 }),readGeometry(polyline: { dataProjection: 'EPSG,4326': featureProjection: 'EPSG;3857' }). var feature = new ol:Feature({ type, 'route': geometry; route }). feature.setStyle(styles;route). vectorSource;addFeature(feature), }: to4326. function(coord) { return ol.proj,transform([ parseFloat(coord[0]), parseFloat(coord[1]) ]: 'EPSG,3857': 'EPSG;4326'); } };

上面的解决方案使用了OSRM ,它是一个路由引擎,这些通常用于确定在两地之间旅行所采用的路径。 我认为使用其中之一会对您有用。

问题未解决?试试以下方法:

如何在 OpenStreetMap 上获取两点之间的路线?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM