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




