2016-07-04 7 views
2
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 } 
]; 

dies ist Javascript Array durch das ich eine Polylinie auf Google Karte für Fahrzeug-Tracking zeichnen wollen und Gesamtdistanz Fahrzeug Reise zu finden.bekommen Abstand von Array von Breiten- und Längengrad auf google map

+0

Google hat eine API, um die Entfernung zu berechnen ([mit ein paar Einschränkungen] (https://developers.google.com/maps/documentation/distance-matrix/usage-limits)): [Google API] (https: //developers.google.com/maps/documentation/distance-matrix/intro) –

+0

Überprüfen Sie diese https://developers.google.com/maps/documentation/roads/snap – sarath

+0

Hi @sarath, können Sie Beispielcode zur Verfügung stellen Distanz berechnen mit Snap-to-Road? –

Antwort

1

Der einfachste Weg, um die Gesamtstrecke des Wegs wird Schleifen der Pfadanordnung und berechnen den Abstand zwischen den einzelnen Punkten mit Haversine formula: https://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula oder mit google.maps.geometry.spherical.computeDistanceBetween(latLngA, latLngB); Verfahren und fassen die Ergebnisse zu berechnen. (letzteren Fall müssen Sie die Geometriebibliothek laden: https://maps.googleapis.com/maps/api/js?libraries=geometry) z.B .:

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.computeDistanceBetween(pos1, pos2); 
    }; 
    return total; 
}; 

Dies nur ein ungefähres Ergebnis ergibt, weil die Abstände zwischen zwei Punkten manchmal zu groß und der Weg nicht über die Straßen genau folgen.

Ein weiterer Ansatz, um dieses Problem zu lösen, wird mit den Google Maps Roads API snap to roads feature. (https://developers.google.com/maps/documentation/roads/snap) In diesem Fall haben wir noch das Problem mit den Abständen zwischen den Punkten, weil die Dokumentation sagt, dass die aufeinanderfolgenden Paare von Punkten innerhalb 300m voneinander entfernt sein sollen. Ich denke, das Beste, was wir tun können, ist, dem Pfad mehr Punkte hinzuzufügen. Im folgenden Beispiel zeige ich Ihnen, wie Sie die Gesamtdistanz Ihres Pfades anzeigen und berechnen. Ich habe die Google Snap to Road-Demo für Ihren Zweck modifiziert. Beachten Sie, dass die Straßen-API einen API-Schlüssel benötigt. Ersetzen Sie daher den YOUR_API_KEY durch Ihren Schlüssel.

<!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.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <script 
     src="https://maps.googleapis.com/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.com/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.com/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.computeDistanceBetween(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.computeDistanceBetween(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.com/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.computeDistanceBetween(pos1, pos2); 
     console.log(google.maps.geometry.spherical.computeDistanceBetween(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> 

Ich hoffe, dies hilft.