我在我正在构建的一个小项目中使用Gmaps.js api。
基本上为了复制谷歌地图功能,我希望获得从一个地址到另一个地址的路线和距离(可以只是输入/表单字段)。我注意到这个演示,但它需要点击地图,而且也不显示总距离或行驶时间?
关于从表单中解析 2 个地址的最佳方式,然后使用 gmaps.js api 计算路线和行驶时间的任何意见?
我在我正在构建的一个小项目中使用Gmaps.js api。
基本上为了复制谷歌地图功能,我希望获得从一个地址到另一个地址的路线和距离(可以只是输入/表单字段)。我注意到这个演示,但它需要点击地图,而且也不显示总距离或行驶时间?
关于从表单中解析 2 个地址的最佳方式,然后使用 gmaps.js api 计算路线和行驶时间的任何意见?
将其分解为您需要的部分:
地理编码见这个例子:http ://hpneo.github.io/gmaps/examples/geocoding.html
GMaps.geocode({
address: $('#Start').val(),
callback: function(results, status) {
if (status == 'OK') {
var latlng1 = results[0].geometry.location;
}
}
}); //Repeat for destination / end point
现在你有了你的纬度/经度点。
然后,您可以采取一些方法来路由,但只需绘制它就可以像这个例子一样完成:http: //hpneo.github.io/gmaps/examples/routes.html
map.drawRoute({
origin: [latlng1.lat(), latlng1.lng()],
destination: [latlng2.lat(), latlng2.lng()],
travelMode: 'driving',
strokeColor: '#131540',
strokeOpacity: 0.6,
strokeWeight: 6
});
如果你打电话getRoutes
而不是drawRoute
你应该取回一个DirectionsResult
对象:https ://developers.google.com/maps/documentation/javascript/directions#DirectionsResults 。该TransitDetails
对象以到达时间的形式包含有关到达终点位置的旅行时间的信息。每个leg
还将包含一个持续时间和距离,您可以将它们加起来循环通过它们并访问如下内容:
foreach($directions->routes[0]->legs as $leg) {
$time+=$leg.duration.value
$distance+=$leg.distance.value
}
更新:
正在使用 API - 并原谅嵌套的回调 - 但这是一个工作示例:http: //jsfiddle.net/mdares/82Dp2/
jQuery(document).ready(function () {
var map;
var latlng1;
var latlng2;
GMaps.geocode({
address: $('#Start').val(),
callback: function (results, status) {
if (status == 'OK') {
latlng1 = results[0].geometry.location;
GMaps.geocode({
address: $('#End').val(),
callback: function (results, status) {
if (status == 'OK') {
latlng2 = results[0].geometry.location;
map = new GMaps({
div: '#map',
lat: latlng1.lat(),
lng: latlng1.lng(),
zoom: 12
});
map.drawRoute({
origin: [latlng1.lat(), latlng1.lng()],
destination: [latlng2.lat(), latlng2.lng()],
travelMode: 'driving',
strokeColor: '#131540',
strokeOpacity: 0.6,
strokeWeight: 6
});
map.getRoutes({
origin: [latlng1.lat(), latlng1.lng()],
destination: [latlng2.lat(), latlng2.lng()],
callback: function (e) {
var time = 0;
var distance = 0;
for (var i=0; i<e[0].legs.length; i++) {
time += e[0].legs[i].duration.value;
distance += e[0].legs[i].distance.value;
}
alert(time + " " + distance);
}
});
}
}
});
}
}
});
});
好吧,如果您只关心点 A. 和点 B. 之间的距离,而不关心转弯方向 - 它应该像获取两个点的坐标并计算距离一样简单。
function distanceFrom(points) {
var lat1 = points.lat1;
var radianLat1 = lat1 * (Math.PI / 180);
var lng1 = points.lng1;
var radianLng1 = lng1 * (Math.PI / 180);
var lat2 = points.lat2;
var radianLat2 = lat2 * (Math.PI / 180);
var lng2 = points.lng2;
var radianLng2 = lng2 * (Math.PI / 180);
var earth_radius = 3959; // or 6371 for kilometers
var diffLat = (radianLat1 - radianLat2);
var diffLng = (radianLng1 - radianLng2);
var sinLat = Math.sin(diffLat / 2);
var sinLng = Math.sin(diffLng / 2);
var a = Math.pow(sinLat, 2.0) + Math.cos(radianLat1) * Math.cos(radianLat2) * Math.pow(sinLng, 2.0);
var distance = earth_radius * 2 * Math.asin(Math.min(1, Math.sqrt(a)));
return distance.toFixed(3);
}
var distance = distanceFrom({
// NYC
'lat1': 40.713955826286046,
'lng1': -74.00665283203125,
// Philly
'lat2': 39.952335,
'lng2': -75.163789
});
结果是 80.524
英里或129.583
公里。
如果您希望用户能够输入城市名称、邮政编码等而不是坐标,您可以使用 GMaps 库首先对地址进行地理编码。
相关的SO问题在这里
您可以尝试 gebweb optimap tsp 求解器。它还可以解决旅行商问题。链接:http ://www.gebweb.net/optimap/