public class JZLocationConverter {
private static final double LAT_OFFSET_0(double x, double y) {
return -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
}
private static final double LAT_OFFSET_1(double x, double y) {
return (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
}
private static final double LAT_OFFSET_2(double x, double y) {
return (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
}
private static final double LAT_OFFSET_3(double x, double y) {
return (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
}
private static final double LON_OFFSET_0(double x, double y) {
return 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
}
private static final double LON_OFFSET_1(double x, double y) {
return (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
}
private static final double LON_OFFSET_2(double x, double y) {
return (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
}
private static final double LON_OFFSET_3(double x, double y) {
return (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
}
private static double RANGE_LON_MAX = 137.8347;
private static double RANGE_LON_MIN = 72.004;
private static double RANGE_LAT_MAX = 55.8271;
private static double RANGE_LAT_MIN = 0.8293;
private static double jzA = 6378245.0;
private static double jzEE = 0.00669342162296594323;
public static double transformLat(double x, double y) {
double ret = LAT_OFFSET_0(x, y);
ret += LAT_OFFSET_1(x, y);
ret += LAT_OFFSET_2(x, y);
ret += LAT_OFFSET_3(x, y);
return ret;
}
public static double transformLon(double x, double y) {
double ret = LON_OFFSET_0(x, y);
ret += LON_OFFSET_1(x, y);
ret += LON_OFFSET_2(x, y);
ret += LON_OFFSET_3(x, y);
return ret;
}
public static boolean outOfChina(double lat, double lon) {
if (lon < RANGE_LON_MIN || lon > RANGE_LON_MAX)
return true;
if (lat < RANGE_LAT_MIN || lat > RANGE_LAT_MAX)
return true;
return false;
}
public static LatLng gcj02Encrypt(double ggLat, double ggLon) {
LatLng resPoint = new LatLng();
double mgLat;
double mgLon;
if (outOfChina(ggLat, ggLon)) {
resPoint.latitude = ggLat;
resPoint.longitude = ggLon;
return resPoint;
}
double dLat = transformLat(ggLon - 105.0, ggLat - 35.0);
double dLon = transformLon(ggLon - 105.0, ggLat - 35.0);
double radLat = ggLat / 180.0 * Math.PI;
double magic = Math.sin(radLat);
magic = 1 - jzEE * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((jzA * (1 - jzEE)) / (magic * sqrtMagic) * Math.PI);
dLon = (dLon * 180.0) / (jzA / sqrtMagic * Math.cos(radLat) * Math.PI);
mgLat = ggLat + dLat;
mgLon = ggLon + dLon;
resPoint.latitude = mgLat;
resPoint.longitude = mgLon;
return resPoint;
}
public static LatLng gcj02Decrypt(double gjLat, double gjLon) {
LatLng gPt = gcj02Encrypt(gjLat, gjLon);
double dLon = gPt.longitude - gjLon;
double dLat = gPt.latitude - gjLat;
LatLng pt = new LatLng();
pt.latitude = gjLat - dLat;
pt.longitude = gjLon - dLon;
return pt;
}
public static LatLng bd09Decrypt(double bdLat, double bdLon) {
LatLng gcjPt = new LatLng();
double x = bdLon - 0.0065, y = bdLat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
gcjPt.longitude = z * Math.cos(theta);
gcjPt.latitude = z * Math.sin(theta);
return gcjPt;
}
public static LatLng bd09Encrypt(double ggLat, double ggLon) {
LatLng bdPt = new LatLng();
double x = ggLon, y = ggLat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
bdPt.longitude = z * Math.cos(theta) + 0.0065;
bdPt.latitude = z * Math.sin(theta) + 0.006;
return bdPt;
}
/**
* @param location 世界標準地理坐標(WGS-84)
* @return 中國國測局地理坐標(GCJ-02)<火星坐標>
* @brief 世界標準地理坐標(WGS-84) 轉(zhuǎn)換成 中國國測局地理坐標(GCJ-02)<火星坐標>
*
* ####只在中國大陸的范圍的坐標有效暗甥,以外直接返回世界標準坐標
*/
public static LatLng wgs84ToGcj02(LatLng location) {
return gcj02Encrypt(location.latitude, location.longitude);
}
/**
* @param location 中國國測局地理坐標(GCJ-02)
* @return 世界標準地理坐標(WGS-84)
* @brief 中國國測局地理坐標(GCJ-02) 轉(zhuǎn)換成 世界標準地理坐標(WGS-84)
*
* ####此接口有1-2米左右的誤差框往,需要精確定位情景慎用
*/
public static LatLng gcj02ToWgs84(LatLng location) {
return gcj02Decrypt(location.latitude, location.longitude);
}
/**
* @param location 世界標準地理坐標(WGS-84)
* @return 百度地理坐標(BD-09)
* @brief 世界標準地理坐標(WGS-84) 轉(zhuǎn)換成 百度地理坐標(BD-09)
*/
public static LatLng wgs84ToBd09(LatLng location) {
LatLng gcj02Pt = gcj02Encrypt(location.latitude, location.longitude);
return bd09Encrypt(gcj02Pt.latitude, gcj02Pt.longitude);
}
/**
* @param location 中國國測局地理坐標(GCJ-02)<火星坐標>
* @return 百度地理坐標(BD-09)
* @brief 中國國測局地理坐標(GCJ-02)<火星坐標> 轉(zhuǎn)換成 百度地理坐標(BD-09)
*/
public static LatLng gcj02ToBd09(LatLng location) {
return bd09Encrypt(location.latitude, location.longitude);
}
/**
* @param location 百度地理坐標(BD-09)
* @return 中國國測局地理坐標(GCJ-02)<火星坐標>
* @brief 百度地理坐標(BD-09) 轉(zhuǎn)換成 中國國測局地理坐標(GCJ-02)<火星坐標>
*/
public static LatLng bd09ToGcj02(LatLng location) {
return bd09Decrypt(location.latitude, location.longitude);
}
/**
* @param location 百度地理坐標(BD-09)
* @return 世界標準地理坐標(WGS-84)
* @brief 百度地理坐標(BD-09) 轉(zhuǎn)換成 世界標準地理坐標(WGS-84)
*
* ####此接口有1-2米左右的誤差,需要精確定位情景慎用
*/
public static LatLng bd09ToWgs84(LatLng location) {
LatLng gcj02 = bd09ToGcj02(location);
return gcj02Decrypt(gcj02.latitude, gcj02.longitude);
}
public static class LatLng {
public double latitude;
public double longitude;
public LatLng(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public LatLng() {
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
}
}
WGS-84世界標準坐標、GCJ-02中國國測局(火星坐標)、BD-09百度坐標系轉(zhuǎn)換
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來切蟋,“玉大人统捶,你說我怎么就攤上這事”猓” “怎么了喘鸟?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長驻右。 經(jīng)常有香客問我迷守,道長,這世上最難降的妖魔是什么旺入? 我笑而不...
- 正文 為了忘掉前任兑凿,我火速辦了婚禮,結(jié)果婚禮上茵瘾,老公的妹妹穿的比我還像新娘礼华。我一直安慰自己,他們只是感情好拗秘,可當我...
- 文/花漫 我一把揭開白布圣絮。 她就那樣靜靜地躺著,像睡著了一般雕旨。 火紅的嫁衣襯著肌膚如雪扮匠。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼克蚂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筋讨?” 一聲冷哼從身側(cè)響起埃叭,我...
- 正文 年R本政府宣布,位于F島的核電站屏富,受9級特大地震影響晴竞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狠半,卻給世界環(huán)境...
- 文/蒙蒙 一噩死、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧神年,春花似錦已维、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至飘千,卻和暖如春堂鲜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背护奈。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- YJLocationConverter 中國國測局地理坐標(GCJ-02)<火星坐標>岛马、世界標準地理坐標(WGS-...
- 先貼原文鏈接 百度坐標(BD09)乃坤、國測局坐標(火星坐標,GCJ02)沟蔑、和WGS84坐標系互轉(zhuǎn) coordtran...
- public static double[] gcj02_To_Bd09(double lat,double lo...
- // // coordinatesChangeHelper.h //// Created by 冰淚 on 201...