admin管理员组文章数量:1415145
var path = [
{ "lat": 43.00678, "lng": -89.53743 },
{ "lat": 43.00656, "lng": -89.53732 },
{ "lat": 43.005878, "lng": -89.53797 },
{ "lat": 43.005344, "lng": -89.53684 },
{ "lat": 43.003834, "lng": -89.535400 },
{ "lat": 43.003692, "lng": -89.533834 },
{ "lat": 43.006384, "lng": -89.533796 },
{ "lat": 43.0120328, "lng": -89.533667 },
{ "lat": 43.015931, "lng": -89.533635 },
{ "lat": 43.023030, "lng": -89.5335390 },
{ "lat": 43.032010, "lng": -89.533249 },
{ "lat": 43.040221, "lng": -89.5329596 },
{ "lat": 43.04632176, "lng": -89.5318224 },
{ "lat": 43.052562, "lng": -89.5277883 },
{ "lat": 43.060300, "lng": -89.52759526 },
{ "lat": 43.06401556, "lng": -89.5268978 },
{ "lat": 43.06681381, "lng": -89.5241620 },
{ "lat": 43.0714224, "lng": -89.52499888 },
{ "lat": 43.07468269, "lng": -89.52698371 },
{ "lat": 43.07490213, "lng": -89.53292749 },
{ "lat": 43.076203059, "lng": -89.53269145 },
{ "lat": 43.0765949, "lng": -89.5314576 },
{ "lat": 43.0793377, "lng": -89.53323862 },
{ "lat": 43.0803799, "lng": -89.53454754 },
{ "lat": 43.0835927, "lng": -89.5340754 },
{ "lat": 43.08458789, "lng": -89.5334853 },
{ "lat": 43.0844468, "lng": -89.53403256 },
{ "lat": 43.08445469, "lng": -89.5352985 },
{ "lat": 43.084619242, "lng": -89.5358993791 }
];
this is Javascript array by this I want to draw a polyline on google map for vehicle tracking and find total distance of vehicle trip.
var path = [
{ "lat": 43.00678, "lng": -89.53743 },
{ "lat": 43.00656, "lng": -89.53732 },
{ "lat": 43.005878, "lng": -89.53797 },
{ "lat": 43.005344, "lng": -89.53684 },
{ "lat": 43.003834, "lng": -89.535400 },
{ "lat": 43.003692, "lng": -89.533834 },
{ "lat": 43.006384, "lng": -89.533796 },
{ "lat": 43.0120328, "lng": -89.533667 },
{ "lat": 43.015931, "lng": -89.533635 },
{ "lat": 43.023030, "lng": -89.5335390 },
{ "lat": 43.032010, "lng": -89.533249 },
{ "lat": 43.040221, "lng": -89.5329596 },
{ "lat": 43.04632176, "lng": -89.5318224 },
{ "lat": 43.052562, "lng": -89.5277883 },
{ "lat": 43.060300, "lng": -89.52759526 },
{ "lat": 43.06401556, "lng": -89.5268978 },
{ "lat": 43.06681381, "lng": -89.5241620 },
{ "lat": 43.0714224, "lng": -89.52499888 },
{ "lat": 43.07468269, "lng": -89.52698371 },
{ "lat": 43.07490213, "lng": -89.53292749 },
{ "lat": 43.076203059, "lng": -89.53269145 },
{ "lat": 43.0765949, "lng": -89.5314576 },
{ "lat": 43.0793377, "lng": -89.53323862 },
{ "lat": 43.0803799, "lng": -89.53454754 },
{ "lat": 43.0835927, "lng": -89.5340754 },
{ "lat": 43.08458789, "lng": -89.5334853 },
{ "lat": 43.0844468, "lng": -89.53403256 },
{ "lat": 43.08445469, "lng": -89.5352985 },
{ "lat": 43.084619242, "lng": -89.5358993791 }
];
this is Javascript array by this I want to draw a polyline on google map for vehicle tracking and find total distance of vehicle trip.
Share Improve this question edited Jul 4, 2016 at 12:09 duncan 31.9k15 gold badges81 silver badges101 bronze badges asked Jul 4, 2016 at 11:05 Navin BhandariNavin Bhandari 1921 silver badge9 bronze badges 3- google has an API to calculate the distance (with a few limitations): Google API – Rene Commented Jul 4, 2016 at 11:27
- Check this developers.google./maps/documentation/roads/snap – sarath Commented Jul 4, 2016 at 11:44
- Hi @sarath, can you provide sample code on how to calculate distance using Snap-to-Road ? – aldrien.h Commented Oct 12, 2017 at 12:17
1 Answer
Reset to default 5The most simple way to calculate the total distance of the path is looping through the path array and calculate the distance between each points with
Haversine formula: https://stackoverflow./questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula or with
google.maps.geometry.spherical.puteDistanceBetween(latLngA, latLngB);
method and summarize the results.
(latter case you must load the geometry library: https://maps.googleapis./maps/api/js?libraries=geometry
)
e.g.:
function calcPathLength(path){
var total = 0;
for (var i = 0; i < path.length - 1; i++) {
var pos1 = new google.maps.LatLng(path[i].lat(), path[i].lng());
var pos2 = new google.maps.LatLng(path[i + 1].lat(), path[i + 1].lng());
total += google.maps.geometry.spherical.puteDistanceBetween(pos1, pos2);
};
return total;
};
This gives you only an approximate result, because the distances between two points sometimes too big and the path does not follow the roads precisely.
Another approach to solve this problem is using the Google Maps Roads API snap to roads feature. (https://developers.google./maps/documentation/roads/snap) In this case we still have the problem with the distances between the points, because the documentation says that the consecutive pairs of points should be within 300m of each other. I think the best we can do is adding more points to the path. In the following example I show you how to display and calculate the total distance of your path. I modified the google's Snap to Road demo for your purpose. Please note that the roads API requires an API key, so you should replace the YOUR_API_KEY with your key.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Roads API Demo</title>
<style>
html, body, #map {
height: 100%;
margin: 0px;
padding: 0px
}
</style>
<script src="https://ajax.googleapis./ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script
src="https://maps.googleapis./maps/api/js?libraries=geometry"></script>
<script>
var apiKey = 'YOUR_API_KEY'; //Replace it with your key
//This is the path you provided
var path = [
{ "lat": 43.00678, "lng": -89.53743 },
{ "lat": 43.00656, "lng": -89.53732 },
{ "lat": 43.005878, "lng": -89.53797 },
{ "lat": 43.005344, "lng": -89.53684 },
{ "lat": 43.003834, "lng": -89.535400 },
{ "lat": 43.003692, "lng": -89.533834 },
{ "lat": 43.006384, "lng": -89.533796 },
{ "lat": 43.0120328, "lng": -89.533667 },
{ "lat": 43.015931, "lng": -89.533635 },
{ "lat": 43.023030, "lng": -89.5335390 },
{ "lat": 43.032010, "lng": -89.533249 },
{ "lat": 43.040221, "lng": -89.5329596 },
{ "lat": 43.04632176, "lng": -89.5318224 },
{ "lat": 43.052562, "lng": -89.5277883 },
{ "lat": 43.060300, "lng": -89.52759526 },
{ "lat": 43.06401556, "lng": -89.5268978 },
{ "lat": 43.06681381, "lng": -89.5241620 },
{ "lat": 43.0714224, "lng": -89.52499888 },
{ "lat": 43.07468269, "lng": -89.52698371 },
{ "lat": 43.07490213, "lng": -89.53292749 },
{ "lat": 43.076203059, "lng": -89.53269145 },
{ "lat": 43.0765949, "lng": -89.5314576 },
{ "lat": 43.0793377, "lng": -89.53323862 },
{ "lat": 43.0803799, "lng": -89.53454754 },
{ "lat": 43.0835927, "lng": -89.5340754 },
{ "lat": 43.08458789, "lng": -89.5334853 },
{ "lat": 43.0844468, "lng": -89.53403256 },
{ "lat": 43.08445469, "lng": -89.5352985 },
{ "lat": 43.084619242, "lng": -89.5358993791 }
];
var map;
var snappedCoordinates = [];
var extendedPath = [];
var startMarker;
var endMarker;
var startIcon = 'https://mts.googleapis./maps/vt/icon/name=icons/spotlight/spotlight-waypoint-a.png&text=A&psize=16&font=fonts/Roboto-Regular.ttf&color=ff333333&ax=44&ay=48&scale=1';
var endIcon = 'https://mts.googleapis./maps/vt/icon/name=icons/spotlight/spotlight-waypoint-b.png&text=B&psize=16&font=fonts/Roboto-Regular.ttf&color=ff333333&ax=44&ay=48&scale=1';
var infowindow;
function initialize() {
var mapOptions = {
zoom: 12,
center: {lat: 43.040221, lng: -89.5329596}
};
map = new google.maps.Map(document.getElementById('map'), mapOptions);
startMarker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(path[0].lat, path[0].lng),
icon: startIcon
});
endMarker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(path[path.length - 1].lat, path[path.length - 1].lng),
icon: endIcon
})
infowindow = new google.maps.InfoWindow({content: ''});
extendedPath = getExtendedPath(path); //Let's extend the original path
runSnapToRoad(extendedPath);
}
function getExtendedPath(path) {
var extPath = path;
var newPath = [];
while (pointsTooFar(extPath)){ //We do it while all the distance between points are less then 250 meters
newPath = [];
for (var i = 0; i < extPath.length - 1; i++) {
var pos1 = new google.maps.LatLng(extPath[i].lat, extPath[i].lng);
var pos2 = new google.maps.LatLng(extPath[i + 1].lat, extPath[i + 1].lng);
var dist = google.maps.geometry.spherical.puteDistanceBetween(pos1, pos2);
newPath.push(extPath[i]);
if (dist > 250) { //If the distance between two points is greater than 250 metres we add an intermediate point
var insPos = { "lat": (extPath[i].lat + extPath[i + 1].lat)/2, "lng": (extPath[i].lng + extPath[i + 1].lng)/2 };
newPath.push(insPos);
}
}
newPath.push(extPath[extPath.length-1]);
extPath = newPath;
}
return extPath;
}
function pointsTooFar(pointPath){
var tooFar = false;
for (var i = 0; i < pointPath.length - 1; i++) {
var pos1 = new google.maps.LatLng(pointPath[i].lat, pointPath[i].lng);
var pos2 = new google.maps.LatLng(pointPath[i + 1].lat, pointPath[i + 1].lng);
var dist = google.maps.geometry.spherical.puteDistanceBetween(pos1, pos2);
if (dist > 250){
tooFar = true;
break;
};
};
return tooFar;
}
// Snap a user-created polyline to roads and draw the snapped path
function runSnapToRoad(path) {
var pathValues = [];
for (var i = 0; i < path.length; i++) {
pathValues.push((new google.maps.LatLng(path[i].lat, path[i].lng)).toUrlValue());
}
$.get('https://roads.googleapis./v1/snapToRoads', {
interpolate: true,
key: apiKey,
path: pathValues.join('|')
}, function(data) {
processSnapToRoadResponse(data);
drawSnappedPolyline();
calcPathLength(snappedCoordinates);
});
}
// Store snapped polyline returned by the snap-to-road service.
function processSnapToRoadResponse(data) {
snappedCoordinates = [];
for (var i = 0; i < data.snappedPoints.length; i++) {
var latlng = new google.maps.LatLng(
data.snappedPoints[i].location.latitude,
data.snappedPoints[i].location.longitude);
snappedCoordinates.push(latlng);
}
}
// Draws the snapped polyline (after processing snap-to-road response).
function drawSnappedPolyline() {
var snappedPolyline = new google.maps.Polyline({
path: snappedCoordinates,
strokeColor: '#00B3FD',
strokeOpacity: 0.6,
strokeWeight: 5
});
snappedPolyline.setMap(map);
}
function calcPathLength(cPath){
var total = 0;
for (var i = 0; i < cPath.length - 1; i++) {
var pos1 = new google.maps.LatLng(cPath[i].lat(), cPath[i].lng());
var pos2 = new google.maps.LatLng(cPath[i + 1].lat(), cPath[i + 1].lng());
total += google.maps.geometry.spherical.puteDistanceBetween(pos1, pos2);
console.log(google.maps.geometry.spherical.puteDistanceBetween(pos1, pos2).toFixed(0));
};
infowindow.setContent('<h4>Total length of the path: ' + (total / 1609.34).toFixed(1) + ' miles</h4>');
infowindow.open(map, endMarker);
};
$(window).load(initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
Hope this helps.
本文标签: javascriptget distance by array of latitude and longitude on google mapStack Overflow
版权声明:本文标题:javascript - get distance by array of latitude and longitude on google map - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745209829a2647815.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论