5

短時間に移動装置のリアルタイムの位置データが与えられた場合、どのようにこの道に沿って緯度/経度のペアをさらに、例えば2マイル、あるいはそれ以上の5分間の運転で得ることができますか?道路に沿ってさらに外挿することはできますか?

GoogleのRoads APIを使用して、緯度/経度のペアhttps://developers.google.com/maps/documentation/roads/snapが与えられた道路にスナップすることができますが、そこには途中で入るしかありません。

これはAndroidアプリになります。 List<LatLng>として表さ経路を考える

+0

がGoogle方向のAPIは、そのためのソリューションのいくつかの種類を持っていないのhttps:?//developers.google.com/maps/documentation/directions/intro#Waypoints – commonSenseCode

+0

あなたがこれを探していると思います – Ken

+0

https://developer.android.com/reference/android/telephony/TelephonyManager.html#getCellLocation() –

答えて

5

、この関数は(いくつかの計算を行うためGoogle Maps API Utility Libraryを使用して)その経路上originからdistanceメートルの走行に起因するルート上の点を計算する:

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; 
} 

現在地いくつかのテスト:

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

偉大な答え!残念ながら、私にはルートはありません。私はこれを明確にするために質問を編集しました。 – Ken

+1

あなたのニーズに合ったものを見つけたら私の回答を編集しますが、あなたが他の人を助けることができるようにこのメソッドを保存します – antonio

関連する問題