java实现WGS84转其他地图坐标

本文介绍了一种用于处理GPS坐标与中国坐标(如GCJ-02)转换的实用工具,包括经纬度计算、坐标校正方法和判断是否在中国的函数,适合开发人员进行地理位置数据处理。

以下工具皆可使用
工具一:

import lombok.Data;



/**
 * @author: YXY
 * @date: 2021/7/16 12:04
 * @Version 1.0
 * 定位的几个基本信息
 */


@Data
public class LocateInfo {
   
   
    /**
     * 经度
     */
    private double longitude;
    /**
     * 维度
     */
    private double Latitude;
    /**
     * 是否在中国
     */
    private boolean isChina;
}


/**
 * @author: YXY
 * @date: 2021/7/16 12:05
 * @Version 1.0
 *
 * WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)
 * GCJ-02:中国坐标偏移标准,Google Map、高德、腾讯使用
 * BD-09:百度坐标偏移标准,Baidu Map使用
 *
 */
public class GCJ02_WGS84Utils {
   
   

    public static double pi = 3.1415926535897932384626;//圆周率
    public static double a = 6378245.0;//克拉索夫斯基椭球参数长半轴a
    public static double ee = 0.00669342162296594323;//克拉索夫斯基椭球参数第一偏心率平方
    //从GPS转高德
    public static LocateInfo wgs84_To_Gcj02(double lat, double lon) {
   
   
        LocateInfo info = new LocateInfo();
        if (isOutOfChina(lat, lon)) {
   
   
            info.setChina(false);
            info.setLatitude(lat);
            info.setLongitude(lon);
        }else {
   
   
            double dLat = transformLat(lon - 105.0, lat - 35.0);
            double dLon = transformLon(lon - 105.0, lat - 35.0);
            double radLat = lat / 180.0 * pi;
            double magic = Math.sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
            double mgLat = lat + dLat;
            double mgLon = lon + dLon;
            info.setChina(true);
            info.setLatitude(mgLat);
            info.setLongitude(mgLon);
        }
        return info;
    }
    //从高德转到GPS
    public static LocateInfo gcj02_To_Wgs84(double lat, double lon) {
   
   
        LocateInfo info = new LocateInfo();
        LocateInfo gps = transform(lat, lon);
        double lontitude = lon * 2 - gps.getLongitude();
        double latitude = lat * 2 - gps.getLatitude();
        info.setChina(gps.isChina());
        info.setLatitude(latitude);
        info.setLongitude(lontitude);
        return info;
    }
    // 判断坐标是否在国外
    private static boolean isOutOfChina(double lat, double lon) {
   
   
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }
    //转换
    private static LocateInfo transform(double lat, double lon) {
   
   
        LocateInfo info = new LocateInfo
### Java 实现 WGS84 坐标换为百度坐标 为了实现WGS84到百度坐标换,在Java中可以采用两种主要的方法:一种是通过直接计算的方式,另一种则是借助第三方库来完成复杂的地理空间变换。 #### 方法一:基于公式的手动换 这种方法涉及到具体的数学运算,适用于简单的应用场景。下面是一个基本的例子: ```java public class CoordinateTransform { private static final double PI = 3.14159265358979323846; public static void main(String[] args){ double lng = 116.397428; // 经度示例值 double lat = 39.90923; // 纬度示例值 Double[] bdLatlng = wgs84ToBd09(lng, lat); System.out.println("经度:" + bdLatlng[0]); System.out.println("纬度:" + bdLatlng[1]); } /** * 将GPS设备获取的原始经纬度数据(即WGS84标准下的)化为百度地图所使用的BD-09编码方式。 */ public static Double[] wgs84ToBd09(double lon, double lat) { if (outOfChina(lon, lat)) { return new Double[]{lon, lat}; } double dLon = transformLon(lon - 105.0, lat - 35.0); double dLat = transformLat(lon - 105.0, lat - 35.0); double radLat = lat / 180.0 * PI; double magic = Math.sin(radLat); magic = 1 - 0.00669342162296594323 * magic * magic; double sqrtMagic = Math.sqrt(magic); dLat = (dLat * 180.0) / ((6378245 * (1 - 0.00669342162296594323)) / (magic * sqrtMagic) * PI); double mgLat = lat + dLat; double mgLon = lon + dLon; return bd09Encode(mgLon, mgLat); } private static boolean outOfChina(double lon, double lat) { if (lon < 72.004 || lon > 137.8347) return true; if (lat < 0.8293 || lat > 55.8271) return true; return false; } private static double transformLat(double x, double y) { double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0; return ret; } private static double transformLon(double x, double y) { double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0; return ret; } private static Double[] bd09Encode(Double gcjLng, Double gcjLat) { Double z = Math.sqrt(gcjLng * gcjLng + gcjLat * gcjLat) + 0.00002 * Math.sin(gcjLat * PI); Double theta = Math.atan2(gcjLat, gcjLng) + 0.000003 * Math.cos(gcjLng * PI); Double bd_lng = z * Math.cos(theta) + 0.0065; Double bd_lat = z * Math.sin(theta) + 0.006; return new Double[]{bd_lng, bd_lat}; } } ``` 此代码片段实现了将WGS84坐标换为中国国内常用的加密坐标体系GCJ-02,并进一步将其换为百度特有的BD-09坐标[^2]。 #### 方法二:利用第三方库 Proj4j 进行换 对于更复杂的应用场景或者需要更高精度的情况下,则推荐使用专业的GIS工具包来进行操作。`Proj4j`就是一个很好的选择,它支持多种不同的椭球体模型以及投影算法,能够满足大多数情况下对地理位置信息处理的需求。 首先需引入依赖项: ```xml <dependency> <groupId>org.locationtech.proj4j</groupId> <artifactId>proj4j</artifactId> <version>1.1.0</version> </dependency> ``` 接着可以通过定义相应的参数字符串创建两个`CoordinateReferenceSystem`对象分别代表源坐标系统(WGS84)和目标坐标系统(BD-09),之后调用`MathTransformFactory.createMathTransform()`函数获得用于执行实际换工作的`MathTransform`实例即可[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值