Java通过proj4处理地图数据

针对地图处理的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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值