首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android中两个地理位置之间的智能计算距离

android中两个地理位置之间的智能计算距离
EN

Stack Overflow用户
提问于 2014-11-14 15:45:32
回答 1查看 468关注 0票数 2

请看下面的示例:

代码语言:javascript
复制
public void start(){

    //...

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_SECONDS, TEN_METERS, this);
}


@Override
public void onLocationChanged(Location location) {

    if(location.distanceTo(_lastLocation) > TEN_KM_IN_METERS){
        actionA(location);
       _lastLocation = location;
    } else {
        actionB(location);
    }

}

Location#distanceTo(l)的实现相当复杂,而且需要大量的CPU.所以我不想在每次更新位置的时候都打电话给这个行动。

问题:这是避免不必要的 Location#distanceTo(l) 调用的正确方法吗?

到目前为止我尝试过的。根据Wiki -十进制度的说法,我是这样做的:

代码语言:javascript
复制
private boolean closeTogether(Location a, Location b) {

    double changeLat = Math.abs(a.getLatitude() - b.getLatitude());

    final float myNaiveMax = 0.005;

    if (changeLat > myNaiveMax) {
        return false;
    }

    double changeLon = Math.abs(a.getLongitude() - b.getLongitude());

    if (changeLon > myNaiveMax) {
        return false;
    }

    return true;
}

@Override
public void onLocationChanged(Location location) {

    if(!closeTogether(location, _lastLocation) && location.distanceTo(_lastLocation) > TEN_KM_IN_METERS){
        actionA(location);
       _lastLocation = location;
    } else {
        actionB(location);
    }

}
EN

回答 1

Stack Overflow用户

发布于 2014-11-14 15:51:34

我发现Haversine公式对此非常有用。适用于我的送货跟踪应用程序。这是我如何计算两点之间的距离。应该让你开始:)

代码语言:javascript
复制
/**
 * getDistanceBetweenTwoPoints
 * @param p1 - First point
 * @param p2 - Second point
 * @return distance between the two specified points (as the crow flys)
 */
public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
    double R = 6371000; // Earth radius
    double dLat = Math.toRadians(p2.x - p1.x);
    double dLon = Math.toRadians(p2.y - p1.y);
    double lat1 = Math.toRadians(p1.x);
    double lat2 = Math.toRadians(p2.x);

    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2)
            * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double d = R * c;

    return d;
}

编辑和另一个

代码语言:javascript
复制
public static PointF calculateDerivedPosition(PointF point,
        double range, double bearing)
{
    double EarthRadius = 6371000; // m

    double latA = Math.toRadians(point.x);
    double lonA = Math.toRadians(point.y);
    double angularDistance = range / EarthRadius;
    double trueCourse = Math.toRadians(bearing);

    double lat = Math.asin(Math.sin(latA) * Math.cos(angularDistance) +
            Math.cos(latA) * Math.sin(angularDistance) * Math.cos(trueCourse));

    double dlon = Math.atan2(Math.sin(trueCourse) * Math.sin(angularDistance) * Math.cos(latA),
            Math.cos(angularDistance) - Math.sin(latA) * Math.sin(lat));

    double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;

    lat = Math.toDegrees(lat);
    lon = Math.toDegrees(lon);

    PointF newPoint = new PointF((float) lat, (float) lon);

    return newPoint;

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26933694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档