package com.jdry.common;
import java.awt.Point;
/**
* 百度坐标、WGS84坐标转换
*
* @author Mnyc
*
*/
public class CoordTransform {
static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
static double PI = 3.1415926535897932384626;
static double a = 6378245.0;
static double ee = 0.00669342162296594323;
/**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
*
* @param lng 经度
* @param lat 纬度
*/
public static Point bd09togcj02(double bd_lon, double bd_lat) {
double x = bd_lon - 0.0065;
double y = bd_lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
double gg_lng = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
Point point = new Point();
point.setLocation(gg_lng, gg_lat);
return point;
}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
*
* @param lng 经度
* @param lat 纬度
*/
public static Point gcj02tobd09(double lng, double lat) {
double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
double bd_lng = z * Math.cos(theta) + 0.0065;
double bd_lat = z * Math.sin(theta) + 0.006;
Point point = new Point();
point.setLocation(bd_lng, bd_lat);
return point;
}
/**
* WGS84转GCj02
*
* @param lng 经度
* @param lat 纬度
* @return
*/
public static Point wgs84togcj02(double lng, double lat) {
Point point = new Point();
double nLng = lng;
double nLat = lat;
if (!out_of_china(lng, lat)) {
double dlat = transformlat(lng - 105.0, lat - 35.0);
double dlng = transformlng(lng - 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);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
nLng = lat + dlat;
nLat = lng + dlng;
}
point.setLocation(nLng, nLat);
return point;
}
public static double transformlat(double lng, double lat) {
double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat
+ 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret;
}
/**
* GCJ02 转换为 WGS84
*
* @param lng 经度
* @param lat 纬度
* @return
*/
public static Point gcj02towgs84(double lng, double lat) {
Point point = new Point();
double nLng = lng;
double nLat = lat;
if (!out_of_china(lng, lat)) {
double dlat = transformlat(lng - 105.0, lat - 35.0);
double dlng = transformlng(lng - 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);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
double mglat = lat + dlat;
double mglng = lng + dlng;
nLng = lng * 2 - mglng;
nLat = lat * 2 - mglat;
}
point.setLocation(nLng, nLat);
return point;
};
public static double transformlng(double lng, double lat) {
double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
return ret;
}
/**
* 判断是否在国内,不在国内则不做偏移
*
* @param lng 经度
* @param lat 纬度
*/
static boolean out_of_china(double lng, double lat) {
// 纬度3.86~53.55,经度73.66~135.05
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
};
}
百度坐标、高得坐标、WGS84坐标转换 js java C#
需积分: 0 137 浏览量
更新于2018-09-17
收藏 4KB RAR 举报
在地理信息系统中,坐标转换是一项基础且重要的任务。在标题提到的"百度坐标、高得坐标、WGS84坐标转换 js java C#"中,涉及到了三种常用的坐标系统:百度坐标(BD-09)、高德坐标(GCJ-02)以及全球广泛使用的WGS84坐标系统。这些坐标系统之间的转换对于地图应用、定位服务和导航系统至关重要。
1. **百度坐标(BD-09)**:是百度地图采用的一种加密坐标系统,为了保护商业机密,它对WGS84坐标进行了两次偏移处理。在百度地图API中,用户获取到的坐标默认为BD-09坐标。
2. **高德坐标(GCJ-02)**:也称为火星坐标,是中国国家测绘局采用的一种加密坐标系统,同样对WGS84坐标进行了一次非线性变换,目的是保护国家安全。高德地图、腾讯地图等国内主流地图服务均采用此坐标系。
3. **WGS84坐标**:全称为“世界大地坐标系统1984”,是一种全球统一的坐标系统,广泛应用于GPS定位和国际间的地理信息交流。它是国际民航组织、国际海事组织等标准采用的坐标系统。
**坐标转换方法**:
1. **BD-09 to GCJ-02 (百度到高德)**:由于百度坐标是在高德坐标基础上进行的二次加密,所以先需要将BD-09坐标解密为WGS84坐标,再转换为GCJ-02坐标。
2. **GCJ-02 to BD-09 (高德到百度)**:相反,先将GCJ-02坐标转换为WGS84,然后加密为BD-09坐标。
3. **WGS84 to GCJ-02 (国际到国内)**:WGS84坐标通常用于GPS设备,当需要在中国大陆使用时,需要转换为GCJ-02坐标。
4. **WGS84 to BD-09 (国际到百度)**:同理,WGS84坐标转换为BD-09适用于接入百度地图服务。
在压缩包中的`CoordTransform.cs`、`CoordTransform.java`和`coordtransform.js`文件,分别提供了C#、Java和JavaScript语言实现的坐标转换函数。它们通常包含以下几个关键步骤:
- **偏移解密函数**:解密百度坐标为WGS84坐标。
- **加密函数**:将WGS84坐标加密为GCJ-02或BD-09坐标。
- **转换函数**:实现从一种坐标系统到另一种坐标系统的转换。
使用这些函数,开发者可以轻松地在不同坐标系统之间进行转换,适应不同的地图服务平台。在实际开发中,需根据具体需求选择合适的编程语言实现,确保坐标转换的准确性和兼容性。
了解并掌握不同坐标系统的转换对于进行地图相关的开发工作是必不可少的。通过提供的源代码,开发者可以快速集成到自己的项目中,实现不同坐标系统间的无缝对接。