【问题标题】:GPS Distance CalculationGPS距离计算
【发布时间】:2012-01-19 15:00:51
【问题描述】:

我想计算两个 GPS 位置之间的距离,每个位置都有一个纬度值和一个经度值。对于短距离结果,计算应该是准确的。例如。 http://www.movable-type.co.uk/scripts/latlong.html(haversine 公式),则结果与此相差无几。

使用的代码:

public void GpsCalc(){
    double d = getDistance(51.342299,4.371359, 51.342490,4.371997); 
    Log.e("GpsCalc", String.valueOf(d));
}

public static double getDistance(double lat1, double lng1, double lat2, double lng2){
    double R = 6371; // earth’s radius (mean radius = 6,371km)
    double dLat =  Math.toRadians(lat2-lat1);

    double dLon =  Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
               Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double dr1 = R * c;//in radians      

    Log.e("getDistance-dr1", String.valueOf(dr1));

    return dr1;
}

我确定应该是一些小改动,但我看不到。

【问题讨论】:

  • Google 为android gps distance 提供了很多答案。例如:tutorials-android.com/learn/…
  • 你提到你期望
  • kabuko,这正是我的问题。 GoogleEarth 返回更真实的 136m。我不介意小于 10m 的小偏差,但 136 和 49 相差太大。
  • 彼得,谢谢。我会查看教程并回复您。
  • Peter,我已经实现了代码,但是当我使用代码中给出的 gps 坐标时,它返回的值是 3108.398468379165m。所以我几乎被困在这里。还是谢谢。

标签: gps haversine


【解决方案1】:

该页面上的半正弦公式也有问题。我知道这并不完全是您问题的答案,但我在余弦公式上取得了更大的成功,它给出了与谷歌地球相同的结果。如果有帮助,它看起来像这样:

public double getDistance(double lat1, double lon1, double lat2, double lon2) {
    double latA = Math.toRadians(lat1);
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2);
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
                    (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang * EARTH_RADIUS;
    return dist;
}

编辑:

我在 Google 地图和 Google 地球以及我的代码中尝试了您的坐标,所有这些都得到了 49m。也许从来没有问题?

【讨论】:

  • Steve,你的代码基本上返回相同的 49m。你能用我用过的坐标来测试吗?无法想象 Google 地球是错误的。
  • 当我在movable-type.co.uk/scripts/latlong.html 中输入我的坐标值时,计算是正确的。所以上层函数和网站上的理论函数在细节上肯定有细微的差别。
  • FWIW,我也在 movable-type.co.uk/scripts/latlong.html 获得了 49m 的结果。
  • 嗨史蒂夫。这张截图对我帮助很大!我注意到我们的坐标表示法有所不同。您对 gps 点的表示法就像用逗号分隔的浮点表示法。当我在添加地标时输入坐标时,我输入 51°34'22.99"N 和 4°37'13.59"E。这导致地球上的另一个地方。所以我认为该函数计算了正确的距离,但我的坐标格式是错误的。
【解决方案2】:

有点晚了,但还有两个选择

  1. 使用 Apple Corelocation(49.2733 米)

    CLLocation *currentLocation = [[CLLocation alloc] initWithLatitude:_posGPSCurrent.latitude longitude:_posGPSCurrent.longitude];
    
    CLLocation *location = [[CLLocation alloc] initWithLatitude:_posGPSTarget.latitude longitude:_posGPSTarget.longitude];
    
    // in kilometers
    CLLocationDistance distance =[currentLocation distanceFromLocation:location]/1000;
    
  2. 手动计算(49.1393米)

包含数学库

#include <math.h>

// distance in Kilometers (Haversine)

-(double)distanceFromGPSlat1:(double)tlat1 lon2:(double)tlon1 lat2:(double)tlat2 lon2:(double)tlon2
{
double distance = ((acos(sin(tlat1*M_PI/180)*sin(tlat2*M_PI/180)+cos(tlat1*M_PI/180)*cos(tlat2*M_PI/180)*cos((tlon1-tlon2)*M_PI/180))*180/M_PI)*60*1.1515*1.609344);

return distance;
}

也许我更喜欢第二种方法(手动计算)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多