1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > GCJ-02和BD-09互转 GCJ-02和WGS-84互转

GCJ-02和BD-09互转 GCJ-02和WGS-84互转

时间:2018-09-06 19:47:45

相关推荐

GCJ-02和BD-09互转 GCJ-02和WGS-84互转

主流被使用的地理坐标系并不统一,常用的有WGS84、GCJ02(火星坐标系)、BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用C++实现几种坐标系统之间的互相转换。

一、GCJ-02和BD-09互转

1. 通用

struct Point {double lon;double lat;};double x_PI = 3.14159265358979324 * 3000.0 / 180.0;double PI = 3.1415926535897932384626;double a = 6378245.0;double ee = 0.00669342162296594323;//判断是否在国内,不在国内不做偏移bool isOutOfChina(double lng, double lat){/*if (lng < 72.004 || lng > 137.8347){return true;//国外}if (lat < 0.8293 || lat > 55.8271){return true;//国外}return false;//国内*/if ((lng >= 72.004 || lng <= 137.8347) && (lat >= 0.8293 || lat <= 55.8271)){return false;//国内}else {return true;//国外}}//转纬度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 * sqrt(abs(lng));ret += (20.0 * sin(6.0 * lng * PI) + 20.0 * sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * sin(lat * PI) + 40.0 * sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * sin(lat / 12.0 * PI) + 320 * sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}//转经度double transformlng(double lng, double lat){double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(abs(lng));ret += (20.0 * sin(6.0 * lng * PI) + 20.0 * sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * sin(lng * PI) + 40.0 * sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * sin(lng / 12.0 * PI) + 300.0 * sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}

2. GCJ-02转WGS-84

//gcj-02转wgs-84Point gcj02towgs84(double lng, double lat) {if(isOutOfChina(lng, lat)){Point point;point.lon = lng;point.lat = lat;return point;}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 = sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point;point.lon = lng * 2.0 - mglng;point.lat = lat * 2.0 - mglat;return point;}

3. WGS-84转GCJ-02

//wgs-84转gcj-02Point wgs84togcj02(double lng, double lat){if (isOutOfChina(lng, lat)){Point point;point.lon = lng;point.lat = lat;return point;}else {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 = sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = sqrt(magic);dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);double mglat = lat + dlat;double mglng = lng + dlng;Point point;point.lon = mglng;point.lat = mglat;return point;}}

二、GCJ-02和BD-09互转

1. GCJ-02转BD-09

Point gcj02tobd09(double lng,double lat){double z = sqrt(lng * lng + lat * lat) + 0.00002 * sin(lat * x_PI);double theta = atan2(lat, lng) + 0.000003 * cos(lng * x_PI);double bd_lng = z * cos(theta) + 0.0065;double bd_lat = z * sin(theta) + 0.006;Point point;point.lon = bd_lng;point.lat = bd_lat;return point;}

2. BD-09转GCj-02

Point bd09togcj02(double bd_lon, double bd_lat){double x_pi = 3.14159265358979324 * 3000.0 / 180.0;double x = bd_lon - 0.0065;double y = bd_lat - 0.006;double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);double gg_lng = z * cos(theta);double gg_lat = z * sin(theta);Point point;point.lon = gg_lng;point.lat = gg_lat;return point;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。