2016-08-01 32 views
-2

我試圖想出可以在每秒兩點之間填充gps座標的函數。這裏有幾篇關於這方面的文章,但我找不到完整的東西。我找到的最接近的答案是:
Interpolate between 2 GPS locations based on walking speed
我修改了一個使用方位的答案。但是,它似乎仍然不起作用。特別是我認爲距離計算是錯誤的。有人可以看下面的代碼並更改嗎?
謝謝!java插值兩個gps點之間的速度

import java.util.ArrayList; 

public class Test { 

    double radius = 6371; 

    public Test() { 
     Location start = new Location(lat, lon); 
     Location end = new Location(lat, lon); 
     double speed = 1.39; 
     double distance = CalculateDistanceBetweenLocations(start, end); 
     double duration = distance/speed; 
     System.out.println(distance + ", " + speed + ", " + duration); 
     ArrayList<Location> locations = new ArrayList<Location>(); 
     for (double i = 0; i < duration; i += 1.0) { 
      double bearing = CalculateBearing(start, end); 
      double distanceInKm = speed/1000; 
      Location intermediaryLocation = CalculateDestinationLocation(start, bearing, distanceInKm); 
      locations.add(intermediaryLocation); 
      System.out.println(intermediaryLocation.latitude + ", " + intermediaryLocation.longitude); 
      start = intermediaryLocation; 
     } 
    } 

    double DegToRad(double deg) { 
     return (deg * Math.PI/180); 
    } 

    double RadToDeg(double rad) { 
     return (rad * 180/Math.PI); 
    } 

    double CalculateBearing(Location startPoint, Location endPoint) { 
     double lat1 = DegToRad(startPoint.latitude); 
     double lat2 = DegToRad(endPoint.latitude); 
     double deltaLon = DegToRad(endPoint.longitude - startPoint.longitude); 
     double y = Math.sin(deltaLon) * Math.cos(lat2); 
     double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon); 
     double bearing = Math.atan2(y, x); 
     return (RadToDeg(bearing) + 360) % 360; 
    } 

    Location CalculateDestinationLocation(Location point, double bearing, double distance) { 
     distance = distance/radius; 
     bearing = DegToRad(bearing); 
     double lat1 = DegToRad(point.latitude); 
     double lon1 = DegToRad(point.longitude); 
     double lat2 = Math 
       .asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(bearing)); 
     double lon2 = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(distance) * Math.cos(lat1), 
       Math.cos(distance) - Math.sin(lat1) * Math.sin(lat2)); 
     lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; 
     return new Location(RadToDeg(lat2), RadToDeg(lon2)); 
    } 

    double CalculateDistanceBetweenLocations(Location startPoint, Location endPoint) { 
     double lat1 = DegToRad(startPoint.latitude); 
     double lon1 = DegToRad(startPoint.longitude); 
     double lat2 = DegToRad(endPoint.latitude); 
     double lon2 = DegToRad(endPoint.longitude); 
     double deltaLat = lat2 - lat1; 
     double deltaLon = lon2 - lon1; 
     double a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) 
       + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLon/2) * Math.sin(deltaLon/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - 1)); 
     return (radius * c); 
    } 

    public static void main(String[] args) { 
     new Test(); 
    } 

    class Location { 
     public double latitude, longitude; 

     public Location(double lat, double lon) { 
      latitude = lat; 
      longitude = lon; 
     } 
    } 

} 
+0

什麼是預期的產出是什麼?你實際上得到? 「錯」是什麼意思? – Hulk

+0

我懷疑你的困惑的一部分來自這樣一個事實,即一個具有恆定方位的過程不是一條直線。 – Hulk

+0

我用直線上的兩點試了一下,它大約有250米,但它說了2萬多米,內插的GPS點完全關閉了。 – jl303

回答

0

你有行

double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - 1)); 

打字錯誤應該

double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
0

你的方法CalculateDistanceBetweenLocations含有這一行:

double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - 1)); 

這相當於

double c = 2 * Math.atan2(Math.sqrt(a), 0.0); 

這意味着的Math.atan2結果總是pi,獨立的a值的只要a是肯定的。

因此,CalculateDistanceBetweenLocations始終返回20015.086796020572獨立於輸入座標。