用java 写一个经纬度是否在指定范围内,不使用geotools库
时间: 2023-06-25 14:05:18 浏览: 127
可以使用经纬度计算公式来实现判断点是否在指定区域内:
1. 将经纬度转换为弧度制:
```
double radLat = Math.toRadians(lat);
double radLng = Math.toRadians(lng);
```
2. 根据经纬度计算出该点的球面坐标:
```
double x = Math.cos(radLat) * Math.cos(radLng);
double y = Math.cos(radLat) * Math.sin(radLng);
double z = Math.sin(radLat);
```
3. 计算指定范围的球面坐标:
```
double range = 10; // 单位为千米
double R = 6371; // 地球半径,单位为千米
double latRange = range / R; // 纬度跨度
double lngRange = range / (R * Math.cos(radLat)); // 经度跨度
double xMin = x - lngRange;
double xMax = x + lngRange;
double yMin = y - latRange;
double yMax = y + latRange;
```
4. 判断该点是否在指定范围内:
```
boolean inRange = (x >= xMin && x <= xMax && y >= yMin && y <= yMax);
```
完整代码如下:
```
public class LocationUtils {
/**
* 判断经纬度是否在指定范围内
* @param lat 纬度
* @param lng 经度
* @param centerLat 中心点纬度
* @param centerLng 中心点经度
* @param range 范围,单位为千米
* @return 是否在范围内
*/
public static boolean isInRange(double lat, double lng, double centerLat, double centerLng, double range) {
double radLat = Math.toRadians(lat);
double radLng = Math.toRadians(lng);
double radCenterLat = Math.toRadians(centerLat);
double radCenterLng = Math.toRadians(centerLng);
double x = Math.cos(radLat) * Math.cos(radLng);
double y = Math.cos(radLat) * Math.sin(radLng);
double z = Math.sin(radLat);
double R = 6371; // 地球半径,单位为千米
double latRange = range / R; // 纬度跨度
double lngRange = range / (R * Math.cos(radCenterLat)); // 经度跨度
double xMin = Math.cos(radCenterLat) * Math.cos(radCenterLng - lngRange);
double xMax = Math.cos(radCenterLat) * Math.cos(radCenterLng + lngRange);
double yMin = Math.sin(radCenterLat - latRange);
double yMax = Math.sin(radCenterLat + latRange);
boolean inRange = (x >= xMin && x <= xMax && y >= yMin && y <= yMax);
return inRange;
}
}
```
使用方法:
```
double lat = 39.908722;
double lng = 116.397496;
double centerLat = 39.908722;
double centerLng = 116.397496;
double range = 10; // 单位为千米
boolean inRange = LocationUtils.isInRange(lat, lng, centerLat, centerLng, range);
```