JAVA wgs84转换gcj02

1. 背景

在地理信息系统中,经纬度是描述地球上一个位置的常用方式。然而,不同的地图服务商使用的经纬度坐标系可能不同,这就导致了在不同地图服务商之间进行位置信息转换时的问题。

在中国,高德地图(AMap)使用的是国测局坐标系(GCJ-02),而谷歌地图(Google Maps)使用的是WGS-84坐标系。因此,当在这两个地图服务商之间进行位置信息转换时,就需要将WGS-84坐标系转换为GCJ-02坐标系。

本文将介绍如何使用Java将WGS-84坐标系转换为GCJ-02坐标系,并提供相应的代码示例。

2. WGS-84和GCJ-02坐标系简介

2.1 WGS-84坐标系

WGS-84是一种用于地理位置表示的坐标系,由世界大地测量系统(World Geodetic System)确定。该坐标系以地球质心为原点,用经度和纬度来表示地球上的一个位置。

WGS-84坐标系的经度范围为-180到180度,纬度范围为-90到90度。该坐标系在全球范围内被广泛使用,包括GPS定位系统。

2.2 GCJ-02坐标系

GCJ-02坐标系,全称为“国测局坐标系”,是中国国家测绘局(State Bureau of Surveying and Mapping)制定的一种地理信息坐标系统。GCJ-02坐标系在WGS-84坐标系的基础上进行了加密并进行了偏移,以满足中国国家安全需求。

GCJ-02坐标系的经纬度范围与WGS-84相同,但实际上是在WGS-84基础上进行了偏移和加密,其坐标值与WGS-84坐标系的坐标值之间存在一定的偏差。

3. WGS-84转换为GCJ-02的算法

WGS-84转换为GCJ-02的算法是一种常用的坐标转换算法,也被称为"火星坐标系"算法。该算法通过一系列数学计算来实现坐标的转换。

下面是该算法的Java实现示例代码:

/**
 * 将WGS-84坐标系的经纬度转换为GCJ-02坐标系的经纬度
 * @param wgsLat WGS-84坐标系的纬度
 * @param wgsLon WGS-84坐标系的经度
 * @return GCJ-02坐标系的经纬度
 */
public static double[] wgs84ToGcj02(double wgsLat, double wgsLon) {
    double[] gcj02 = new double[2];
    if (outOfChina(wgsLat, wgsLon)) {
        gcj02[0] = wgsLat;
        gcj02[1] = wgsLon;
        return gcj02;
    }
    double dLat = transformLat(wgsLon - 105.0, wgsLat - 35.0);
    double dLon = transformLon(wgsLon - 105.0, wgsLat - 35.0);
    double radLat = wgsLat / 180.0 * Math.PI;
    double magic = Math.sin(radLat);
    magic = 1 - 0.00669342162296594323 * magic * magic;
    double sqrtMagic = Math.sqrt(magic);
    dLat = (dLat * 180.0) / ((6378137.0 * (1 - 0.00669342162296594323)) / (magic * sqrtMagic) * Math.PI);
    dLon = (dLon * 180.0) / (6378137.0 / sqrtMagic * Math.cos(radLat) * Math.PI);
    gcj02[0] = wgsLat + dLat;
    gcj02[1] = wgsLon + dLon;
    return gcj02;
}

/**
 * 判断给定的经纬度是否在中国范围内