5

Gibt es Echtzeit-Standortdaten eines sich bewegenden Geräts über einen kurzen Zeitraum hinweg, wie kann ich ein lat/langes Paar weiter entlang dieser Straße erreichen, sagen wir 2 Meilen oder besser noch 5 Minuten Fahrt?Wie kann ich weiter entlang einer Straße extrapolieren?

Ich sehe, dass ich Googles Roads API verwenden kann, um an einer Straße bei einem lat/long Paar https://developers.google.com/maps/documentation/roads/snap zu schnappen, aber das bringt mich nur einen Weg dorthin.

Dies wird in einer Android App sein.

+0

Kann die google Richtungen API nicht hat irgendeine Art von Lösung für das https: //developers.google.com/maps/documentation/directions/intro#Waypoints – commonSenseCode

+0

Nicht, dass ich – Ken

+0

sehen kann Ich denke, Sie suchen nach diesem https://developer.android.com/reference/android/telephony/TelephonyManager.html#getCellLocation() –

Antwort

5

als List<LatLng> repräsentiert eine Route gegeben, berechnet er diese Funktion den Punkt auf der Route, die von Reisen distance Meter von origin auf dieser Strecke führt (die Google Maps API Utility Library mit einigen Berechnungen zu tun):

private LatLng extrapolate(List<LatLng> path, LatLng origin, float distance) { 
    LatLng extrapolated = null; 

    if (!PolyUtil.isLocationOnPath(origin, path, false, 1)) { // If the location is not on path non geodesic, 1 meter tolerance 
     return null; 
    } 

    float accDistance = 0f; 
    boolean foundStart = false; 
    List<LatLng> segment = new ArrayList<>(); 

    for (int i = 0; i < path.size() - 1; i++) { 
     LatLng segmentStart = path.get(i); 
     LatLng segmentEnd = path.get(i + 1); 

     segment.clear(); 
     segment.add(segmentStart); 
     segment.add(segmentEnd); 

     double currentDistance = 0d; 

     if (!foundStart) { 
      if (PolyUtil.isLocationOnPath(origin, segment, false, 1)) { 
       foundStart = true; 

       currentDistance = SphericalUtil.computeDistanceBetween(origin, segmentEnd); 

       if (currentDistance > distance) { 
        double heading = SphericalUtil.computeHeading(origin, segmentEnd); 
        extrapolated = SphericalUtil.computeOffset(origin, distance - accDistance, heading); 
        break; 
       } 
      } 
     } else { 
      currentDistance = SphericalUtil.computeDistanceBetween(segmentStart, segmentEnd); 

      if (currentDistance + accDistance > distance) { 
       double heading = SphericalUtil.computeHeading(segmentStart, segmentEnd); 
       extrapolated = SphericalUtil.computeOffset(segmentStart, distance - accDistance, heading); 
       break; 
      } 
     } 

     accDistance += currentDistance; 
    } 

    return extrapolated; 
} 

Hier sind einige Tests:

List<LatLng> route = new ArrayList<>(); 
route.add(new LatLng(40, 4)); 
route.add(new LatLng(40.1, 4)); 
route.add(new LatLng(40.1, 4.1)); 
route.add(new LatLng(40.2, 4.1)); 
route.add(new LatLng(40.2, 4.2)); 
route.add(new LatLng(40.3, 4.2)); 
route.add(new LatLng(40.3, 4.3)); 

LatLng origin; 
LatLng extrapolated; 

origin = new LatLng(40.1, 4.05); 
extrapolated = extrapolate(route, origin, 30000); 
Log.e("Extrapolated1", "" + extrapolated); // lat/lng: (40.25517043951189,4.2) 

origin = new LatLng(40.05, 4); 
extrapolated = extrapolate(route, origin, 100); 
Log.e("Extrapolated2", "" + extrapolated); // lat/lng: (40.05089932033549,4.0) 

origin = new LatLng(40.05, 4); 
extrapolated = extrapolate(route, origin, 50000); 
Log.e("Extrapolated3", "" + extrapolated); // lat/lng: (40.300010207449226,4.261348349980259) 

origin = new LatLng(40.05, 4); 
extrapolated = extrapolate(route, origin, 100000); 
Log.e("Extrapolated4", "" + extrapolated); // null (result out of the route) 
+0

Große Antwort! Leider habe ich keine Route. Ich habe die Frage bearbeitet, um dies zu klären. – Ken

+1

Ich werde meine Antwort bearbeiten, wenn ich etwas finde, das Ihren Bedürfnissen entspricht, aber ich werde diese Methode behalten, falls es anderen von Ihnen nichts ausmacht – antonio