我先说明一下定定义,拉运地:地图中的一个点包含经度和维度,也是“起点”,运往地:地图中的一个点包含经度和维度,也是“终点”。我的数据库里存放着很多拉运地和运往地的坐标点。现在,我想要一个java语言编写的代码,我可以传入拉运地的偏差范围和运往地的偏差范围,然后从数据库中给我返回符合条件的坐标信息。注意:1. 我用的持久化框架是mybaties-plus。2. 我传入的偏差范围是一个单位为"千米"的数。3. 我要的代码类型为工具类。4. 要求有良好的注释。5.距离计算要精准
时间: 2023-03-30 17:02:49 浏览: 66
好的,这是一个关于Java语言编写的工具类的问题,我可以回答。首先,我们需要使用Haversine公式来计算两个经纬度之间的距离,这是一种精准的计算方法。然后,我们可以使用MyBatis-Plus来查询数据库中符合条件的坐标信息。
以下是一个示例代码,其中包含了注释和使用Haversine公式计算距离的方法:
```java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.additional.query.impl.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CoordinateUtil extends ServiceImpl<CoordinateMapper, Coordinate> {
/**
* 计算两个经纬度之间的距离(单位:千米)
* @param lat1 第一个点的纬度
* @param lon1 第一个点的经度
* @param lat2 第二个点的纬度
* @param lon2 第二个点的经度
* @return 两个点之间的距离(单位:千米)
*/
public static double distance(double lat1, double lon1, double lat2, double lon2) {
double earthRadius = 6371; // 地球半径,单位千米
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
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 distance = earthRadius * c;
return distance;
}
/**
* 根据拉运地和运往地的偏差范围查询符合条件的坐标信息
* @param fromLat 拉运地的纬度
* @param fromLon 拉运地的经度
* @param toLat 运往地的纬度
* @param toLon 运往地的经度
* @param fromRange 拉运地的偏差范围(单位:千米)
* @param toRange 运往地的偏差范围(单位:千米)
* @return 符合条件的坐标信息列表
*/
public List<Coordinate> getCoordinates(double fromLat, double fromLon, double toLat, double toLon, double fromRange, double toRange) {
// 计算拉运地和运往地之间的距离
double distance = distance(fromLat, fromLon, toLat, toLon);
// 计算拉运地和运往地的偏差范围
double fromMinLat = fromLat - fromRange / 111.;
double fromMaxLat = fromLat + fromRange / 111.;
double fromMinLon = fromLon - fromRange / (111. * Math.cos(Math.toRadians(fromLat)));
double fromMaxLon = fromLon + fromRange / (111. * Math.cos(Math.toRadians(fromLat)));
double toMinLat = toLat - toRange / 111.;
double toMaxLat = toLat + toRange / 111.;
double toMinLon = toLon - toRange / (111. * Math.cos(Math.toRadians(toLat)));
double toMaxLon = toLon + toRange / (111. * Math.cos(Math.toRadians(toLat)));
// 构造查询条件
QueryWrapper<Coordinate> wrapper = new QueryWrapper<>();
wrapper.between("latitude", Math.min(fromMinLat, toMinLat), Math.max(fromMaxLat, toMaxLat))
.between("longitude", Math.min(fromMinLon, toMinLon), Math.max(fromMaxLon, toMaxLon));
// 查询符合条件的坐标信息
List<Coordinate> coordinates = baseMapper.selectList(wrapper);
return coordinates;
}
}
```
在这个工具类中,我们使用了MyBatis-Plus来查询符合条件的坐标信息。我们首先计算了拉运地和运往地之间的距离,然后根据偏差范围计算出拉运地和运往地的范围,最后构造查询条件并查询符合条件的坐标信息。这个工具类可以直接调用,传入拉运地和运往地的经纬度以及偏差范围即可返回符合条件的坐标信息。