针对地图处理的lib比较多,个人经过实际项目经验,发现以下lib最好。话不多说,干货如下:
pom.xml引用lib
<!-- 地图 --> <dependency> <groupId>org.locationtech.geotrellis</groupId> <artifactId>geotrellis-proj4_2.12</artifactId> <version>3.3.0</version> </dependency>
3.3.0是引用最多的版本,虽然也有高版本,但是也要相信其他同学的判断,用的最多,封装的最好!!
我们在处理地图坐标数据的时候,会有以下困惑。不同坐标体系之间如何转换,比如:UTM的坐标x轴、y轴的数据是(440717.22098942276,4424876.480164963) 而常见的WGS84确是经纬度,比如(116°18'20.813",39°58'19.078")。这之间如何通过Java代码进行转换?
如果不是需要通过代码实现,大家可以通过访问 epsg官网 EPSG.io: Coordinate Systems Worldwide 进行在线转换。
我这里是因为项目需要,因此需要写成Java 方法。
// UTM 转 WGS84
private static double[] UtmToWgs(double lng, double lat) {
CRSFactory crsFactory = new CRSFactory();
// 创建一个WGS84坐标系
CoordinateReferenceSystem wgs84 = crsFactory.createFromName("epsg:4326");
// 创建一个UTM投影坐标系
CoordinateReferenceSystem utm = crsFactory.createFromName("epsg:32650");
//定义转换类
CoordinateTransformFactory ctf = new CoordinateTransformFactory();
CoordinateTransform transform = ctf.createTransform(utm, wgs84);
//坐标系转换
ProjCoordinate projCoordinate = new ProjCoordinate(lng, lat);
transform.transform(projCoordinate, projCoordinate);
System.out.println("转换后x:" + projCoordinate.x);
System.out.println("转换后y:" + projCoordinate.y);
return new double[]{projCoordinate.x, projCoordinate.y};
}
其中epsg code 大家可以去epsg官网查找,本次我设置50度带的utm进行转换。
第二个常见地图处理是计算两点坐标之间的距离计算,我这边结合上面的UTM转换,做出以下场景假设,你本地保存坐标是WGS84,也就是经纬度。现在你对接一个第三方,它传给你的是UTM的坐标,让你计算两点距离。因此工具类方法如下:
/**
* 地球半径,单位 m
*/
private static final double EARTH_RADIUS = 6378137.0;
// 查询两个经纬度坐标的距离
public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
// 先将utm转成wgs84
double[] coord = UtmToWgs(longitude2,latitude2);
// 纬度
double lat1 = Math.toRadians(latitude1);
double lat2 = Math.toRadians(coord[1]);
// 经度
double lng1 = Math.toRadians(longitude1);
double lng2 = Math.toRadians(coord[0]);
// 纬度之差
double a = lat1 - lat2;
// 经度之差
double b = lng1 - lng2;
// 计算两点距离的公式
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
// 弧长乘地球半径, 返回单位: 米
s = s * EARTH_RADIUS;
String format = String.format("%.2f", s);
return Double.parseDouble(format);
}