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;
}
/**
* 判断给定的经纬度是否在中国范围内