You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用中判断手机当前经纬度是否在指定GPS位置半径内

判断当前经纬度是否在指定GPS半径范围内的实现方案

嘿,我来帮你搞定这个功能!因为地球是个球体,直接用平面坐标算距离会有明显误差,所以咱们用Haversine公式来计算两个GPS点之间的球面距离,再和你设定的半径对比就可以了。

步骤1:实现球面距离计算方法

先写个工具方法,专门算两个经纬度点之间的直线距离(单位:米):

/**
 * 计算两个GPS点之间的球面距离(单位:米)
 * @param currentLat 当前纬度
 * @param currentLon 当前经度
 * @param targetLat 目标点纬度
 * @param targetLon 目标点经度
 * @return 两点之间的距离(米)
 */
private double calculateDistance(double currentLat, double currentLon, double targetLat, double targetLon) {
    final int EARTH_RADIUS = 6371000; // 地球半径,单位:米

    // 把角度转换成弧度(三角函数计算需要弧度值)
    double latDiff = Math.toRadians(targetLat - currentLat);
    double lonDiff = Math.toRadians(targetLon - currentLon);

    double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2)
            + Math.cos(Math.toRadians(currentLat)) * Math.cos(Math.toRadians(targetLat))
            * Math.sin(lonDiff / 2) * Math.sin(lonDiff / 2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

    return EARTH_RADIUS * c; // 返回最终距离,单位米
}

步骤2:写范围判断逻辑

有了距离计算方法,就可以封装一个判断当前位置是否在目标点半径内的方法:

/**
 * 判断当前位置是否在目标GPS点的指定半径范围内
 * @param currentLat 当前纬度
 * @param currentLon 当前经度
 * @param targetLat 目标点纬度
 * @param targetLon 目标点经度
 * @param radius 半径(单位:米)
 * @return true表示在范围内,false表示不在
 */
private boolean isWithinRadius(double currentLat, double currentLon, double targetLat, double targetLon, double radius) {
    // 先排除初始化的无效值(你代码里初始是0.0,这时候还没拿到真实位置)
    if (currentLat == 0.0 && currentLon == 0.0) {
        return false;
    }
    double distance = calculateDistance(currentLat, currentLon, targetLat, targetLon);
    return distance <= radius;
}

步骤3:结合你的现有代码使用

在你获取到有效的Location之后(比如locationManager.getLastKnownLocation的逻辑里),就可以直接调用这个判断方法:

// 举个例子:目标点设为北京天安门,半径1000米(1公里)
double targetLat = 39.9042;
double targetLon = 116.4074;
double radius = 1000; // 单位:米

if (location != null) {
    this.longitude = location.getLongitude();
    this.latitude = location.getLatitude();
    // 执行范围判断
    boolean isInRange = isWithinRadius(this.latitude, this.longitude, targetLat, targetLon, radius);
    if (isInRange) {
        // 这里写在范围内的业务逻辑
        Log.d("LocationCheck", "当前位置在目标点半径范围内");
    } else {
        // 这里写不在范围内的逻辑
        Log.d("LocationCheck", "当前位置不在目标点半径范围内");
    }
}

额外小技巧

如果你不想自己写Haversine公式,Android自带了更简洁的API:Location.distanceBetween(),内部也是用类似的球面算法实现的,直接用就行:

float[] results = new float[1];
Location.distanceBetween(currentLat, currentLon, targetLat, targetLon, results);
double distance = results[0]; // 结果单位是米

把这个替换掉咱们自己写的calculateDistance方法,代码会更简洁~

内容的提问来源于stack exchange,提问作者Deeper Shade

火山引擎 最新活动