我有一个正在接收有限航点数据的应用程序,虽然Google Maps Road Snapping根据该数据做出令人钦佩的猜测正确道路的工作,但我仍然遇到一定程度的不准确不能为我们的应用程序工作。
在这个例子中,紫色标记代表真实世界"来源"正在发送的航点,而蓝色标记显示基于来自源航点的数据从Google返回的快速航路点数据。我使用捕捉的蓝色航点生成折线来显示路线(紫色折线),不幸的是,捕捉的航点和后续路线应该看起来更像红色折线。
我已经在API的在线演示中使用类似的"来源"进行了手动测试。航路点和路线仍然是不正确的,因此我只能假设谷歌没有足够的数据准确捕捉。问题是,考虑到这样有限的数据,有没有办法提高正确快照的几率?有没有办法可以插入有限的源路点以尝试"指导"谷歌提供更准确的快照?
这里的代码类似于我使用的代码 - JSFiddle is here
//setup vars
var trip = [{
"lat": -27.068,
"lng": 153.1483
}, {
"lat": -27.0642,
"lng": 153.1546
}, {
"lat": -27.0552,
"lng": 153.156
}, {
"lat": -27.0518,
"lng": 153.1563
}, {
"lat": -27.0503,
"lng": 153.1552
}, {
"lat": -27.0457,
"lng": 153.1456
}, {
"lat": -27.042,
"lng": 153.1463
}, {
"lat": -27.0349,
"lng": 153.1476
}];
var unsnappedWaypoints = [];
var snappedWaypoints = [];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 14,
center: {
lat: 0,
lng: 0
}
});
var bounds = new google.maps.LatLngBounds();
//add each waypoint to an array of lat/lngs
$.each(trip, function(key, waypoint) {
unsnappedWaypoints.push(waypoint.lat + ',' + waypoint.lng);
var marker = new google.maps.Marker({
map: map,
icon: 'http://mt.google.com/vt/icon/name=icons/spotlight/spotlight-ad.png',
position: {
lat: waypoint.lat,
lng: waypoint.lng
}
});
});
//perform Google Maps API call with joined array for snapped results
$.ajax({
url: 'https://roads.googleapis.com/v1/snapToRoads?path=' + unsnappedWaypoints.join('|') + '&key=AIzaSyA1JWR3ohBFQ_P7F5eSMSJb0dwV9PbB3pA&interpolate=true',
crossDomain: true,
dataType: 'jsonp'
}).done(function(response) {
//iterate through returned waypoints to create array of lat/lngs for polyline
$.each(response, function(key, snappedPoints) {
$.each(snappedPoints, function(key, snappedPoint) {
snappedWaypoints.push({
lat: snappedPoint.location.latitude,
lng: snappedPoint.location.longitude
});
//add snapped waypoints to map to show difference between originals and returned
var marker = new google.maps.Marker({
map: map,
icon: 'http://mt.google.com/vt/icon?color=ff004C13&name=icons/spotlight/spotlight-waypoint-blue.png',
position: {
lat: snappedPoint.location.latitude,
lng: snappedPoint.location.longitude
}
});
//increase the bounds to take into account waypoints
bounds.extend(new google.maps.LatLng(snappedPoint.location.latitude, snappedPoint.location.longitude));
});
});
//create polyline from snapped waypoints
var tripRoute = new google.maps.Polyline({
path: snappedWaypoints,
gseodesic: true,
strokeColor: '#663496',
strokeOpacity: 1.0,
strokeWeight: 2
});
tripRoute.setMap(map);
//fit these bounds to the map
map.fitBounds(bounds);
});
答案 0 :(得分:0)
var ActualRoadpoints = routes[0].overview_path;
var resolution=100;// This number you can change.But less the number add more points on road.
getFineData(ActualRoadpoints, resolution).forEach(function (point) {
var ActualRoadmarker = new google.maps.Marker({
position: new google.maps.LatLng(point.lat(), point.lng()),
map: map,
// animation: google.maps.Animation.DROP,
visible: false
});
});
//This function call internally to find more points on route
function getFineData(roughData, resolution) {
var fineData = [];
var latLngA;
var latLngB;
var steps;
var step;
for (var i = 1; i < roughData.length; i++) {
latLngA = roughData[i - 1];
latLngB = roughData[i];
distanceDiff = google.maps.geometry.spherical.computeDistanceBetween(latLngA, latLngB);
steps = Math.ceil(distanceDiff / resolution);
step = 1 / steps;
previousInterpolatedLatLng = latLngA;
for (var j = 0; j < steps; j++) {
var interpolated = google.maps.geometry.spherical.interpolate(latLngA, latLngB, step * j);
fineData.push(interpolated)
}
}
// console.log(fineData.length)
return fineData;
}