不同坐标系转换

// 定义一些常量
const x_PI = 3.14159265358979324 * 3000.0 / 180.0
const PI = 3.1415926535897932384626 // 圆周率
const a = 6378245.0 // 地球半径(米)
const ee = 0.00669342162296594323

(一)地图的偏移

1、百度地图的偏移差别是(0.01185,-0.00328)

即如果百度地图的经纬度是(lon,lat),实际的应该是(lon-0.01185,lat-0.00328)

2、google Map的偏移差别是(0.0143,-0.014)

即如果用getscreen截图,如果要截的范围为(lon,lat),输入getscreen的为(lon-0.0143,lat+0.014)

(二)度分秒坐标转换为经纬度

比如,采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39+ 31/60 + 20.51/3600 度。

(三)GCJ-02与BD-09之间互转

即国家测绘局GCJ-02坐标系(谷歌地图、高德地图、腾讯地图)与BD-09坐标系(百度坐标,只适用于百度地图的相关产品)的转换。

百度坐标系转火星坐标系
function bd_encrypt(gg_lon, gg_lat){var pi_value=Math.PI;var X_PI = pi_value * 3000.0 / 180.0;var x = gg_lon, y = gg_lat;var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * X_PI);var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * X_PI);var bd_lon = z * Math.cos(theta) + 0.0065;var bd_lat = z * Math.sin(theta) + 0.006;return {bd_lat: bd_lat,bd_lon: bd_lon};
}火星坐标系转百度坐标系
function bd_decrypt(bd_lon,bd_lat) {var pi_value=Math.PI;var X_PI = pi_value * 3000.0 / 180.0;var x = bd_lon - 0.0065;var y = bd_lat - 0.006;var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);var gg_lon = z * Math.cos(theta);var gg_lat = z * Math.sin(theta);return {gg_lon: gg_lon,gg_lat: gg_lat}
}

当然还有简化版,如下

to_b是转到百度,to_g是转到GCJ-02。

var to_blng = function(lng) {return lng+0.0065;
};var to_blat = function(lat) {return lat+0.0060;
};var to_glng = function(lng) {return lng-0.0065;
};var to_glat = function(lat) {return lat-0.0060;
};

(四)经纬度与墨卡托之间互转

//经纬度转墨卡托
function lonlatTomercator(lonlat) {var mercator={x:0,y:0};var x = lonlat.x *20037508.34/180;var y = Math.log(Math.tan((90+lonlat.y)*Math.PI/360))/(Math.PI/180);y = y *20037508.34/180;mercator.x = x;mercator.y = y;return mercator ;
}
//墨卡托转经纬度
function mercatorTolonlat(mercator){var lonlat={x:0,y:0};var x = mercator.x/20037508.34*180;var y = mercator.y/20037508.34*180;y= 180/Math.PI*(2*Math.atan(Math.exp(y*Math.PI/180))-Math.PI/2);lonlat.x = x;lonlat.y = y;return lonlat;
}

(五)GCJ-02与WGS84之间互转

// WGS84坐标系转火星坐标系
export function wgs84togcj02 (lng, lat) {if (outOfChina(lng, lat)) {return [lng, lat]}else {var dlat = transformlat(lng - 105.0, lat - 35.0)var dlng = transformlng(lng - 105.0, lat - 35.0)var radlat = lat / 180.0 * PIvar magic = Math.sin(radlat)magic = 1 - ee * magic * magicvar sqrtmagic = Math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)const mglat = lat + dlatconst mglng = lng + dlngreturn [mglng, mglat]}
}// 火星坐标系 转 WGS84
export function gcj02towgs84 (lng, lat) {if (outOfChina(lng, lat)) {return [lng, lat]}else {var dlat = transformlat(lng - 105.0, lat - 35.0)var dlng = transformlng(lng - 105.0, lat - 35.0)var radlat = lat / 180.0 * PIvar magic = Math.sin(radlat)magic = 1 - ee * magic * magicvar sqrtmagic = Math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)const mglat = lat + dlatconst mglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]}
}

(六)BD-09与WGS84之间互转

// 百度坐标系转wgs84
export function bd09towgs84 (lng, lat) {// 百度坐标系先转为火星坐标系const gcj02 = bd09togcj02(lng, lat)// 火星坐标系转wgs84坐标系const result = gcj02towgs84(gcj02[0], gcj02[1])return result
}// wgs84转百度坐标系
export function wgs84tobd09 (lng, lat) {// wgs84先转为火星坐标系const gcj02 = wgs84togcj02(lng, lat)// 火星坐标系转百度坐标系const result = gcj02tobd09(gcj02[0], gcj02[1])return result
}

坐标转换之后还有偏移

随之而来的问题是坐标转换之后还有偏移,那么需要考虑以下几个方面:

1.原始坐标系弄错

比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。

解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。

2.原始坐标准确度不够

解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。

如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。

3.度分秒的概念混淆

比如,在googleearth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39+ 31/60 + 20.51/3600 度。

4.经纬度顺序写反了

比如高德,百度,腾讯是先经度,再纬度,即Point(lng,lat)。但谷歌坐标的顺序恰好相反,是(lat, lng)。

地图定位偏移以及坐标系转换(二)-不同坐标系的转换相关推荐

  1. 高德,百度,Google地图定位偏移以及坐标系转换

    本文引用地址 一.地图坐标系解释 在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Go ...

  2. 地图定位偏移以及坐标系转换(一)-国内部分常见的地理坐标系

    首先明白,所有坐标体系的原点,都是非洲. 在各种web端平台,或高德地图API.腾讯地图API.百度地图API上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系. 比如,在谷歌 ...

  3. iOS之高德地图定位偏移以及经纬度之间的转换

    高德地图.百度地图以及CLLocationManager等地图的定位功能,从而得到的经纬度坐标会有些偏差,比如系统的CLLocationManager定位得到的是世界标准地理坐标(WGS-84).高德 ...

  4. Google地图定位偏移矫正

    Google地图定位标记矫正 技术交流QQ:1148824289 问题概述 google地图在中国使用,都存在偏移问题,车辆明明在公路上的,点一打到地图上,可能跑到人家房顶上了,或者跑到河里去了,关于 ...

  5. 地图坐标转换问题--百度地图定位偏

    在地图定位开发中,许多定位模块输出坐标系是国际标准 WGS-84 坐标系,所以开发者在国内常见地图定位时,会发现与实际情况有几十米的误差.这并非模块问题, 而是国内地图采用了非标坐标系所致. 国内常见 ...

  6. IOS中GPS定位偏移纠正(适用于Google地图)

    在这个神奇的国度里,我们总得学习一些有中国特色的东东,例如"火星坐标".也许有人还不知道这是什么玩意,我就简要介绍一下吧.      如果你有带GPS模块的智能手机,打开定位功能, ...

  7. WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换案例教程(附转换工具下载)

    在做基于百度地图.高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划.地名.河流.道路等GIS地理空间数据)添加到地图上面,然而,在线地图大多使用的是火星 ...

  8. 高德地图手机端定位偏移问题

    手机端定位偏移问题 1.坐标系 WGS-84原始坐标系:也就是GPS定位拿到的经纬度,谷歌和高德在国外可以正常使用GPS定位,国内不允许各个平台使用GPS坐标. GCJ-02坐标系,又名火星坐标系,由 ...

  9. vue/js如何精准获取用户当前地理位置,精准获取经纬度、精准地图选点,Android定位偏移问题解决

    前言: 当时h5页面使用腾讯地图.百度地图.高德地图等获取用户当前地理位置坐标,均有偏移,偏移好几公里,无法获取精准经纬度.最后调用了微信jssdk的方法,才获取了精准的经纬度. 二.具体步骤 1.调 ...

最新文章

  1. Android中 AsyncTask
  2. 查看SecureCRT保存的密码
  3. ubuntu+php环境下的Memcached 安装方法
  4. linux unzip命令不存在_15个常用基础命令Linux(很多人不知道!)
  5. 从数据到模型:实现自动驾驶高效感知
  6. Codeforces Round #147 (Div. 2) E. Build String 最小费用最大流
  7. 《windows 鼠标指针文件 学习笔记》
  8. 基于JSP+Servlet校园二手交易平台
  9. serialVersionUID 生成
  10. redis的lpush、rpush、rpop、lpop位置的简单理解
  11. vios配置的自动采集_VIOS共享存储池和精简配置
  12. 一张纸厚度是多少毫米_一张A4纸的厚度是多少mm?
  13. 统一社会信用代码=营业执照注册号 + 营业执照注册号+营业执照注册号
  14. js“弹出对话框”和“弹出窗口”详解
  15. DoNet开源项目-基于jQuery EasyUI的后台管理系统
  16. html怎么给图片加密,实现图片加密
  17. C语言连续自动自加怎么表示,为什么不建议在C语言中连续使用自增自减运算符...
  18. 数据挖掘BUC算法计算冰山立方体的python实现
  19. 网上常用免费webservice_查询
  20. 叶黄素是什么?叶黄素有哪些功效和作用?

热门文章

  1. TCP建立连接和断开连接流程
  2. 男人送女人多少钱的礼物,才算得上…
  3. 苹果xsmax是什么接口_质量绝对媲美苹果官方同款,液态硅胶手机壳,拿手里太舒服了~...
  4. 小程序抽奖效果demo滚筒抽奖3d动画抽奖(附代码以及随机中奖处理)
  5. 数据库连接步骤php,PHP开发基础教程之数据库连接步骤
  6. C/C++工程函数重命名
  7. 怎么每天都有人去自杀
  8. 微信为啥别的人能登上自己登不上
  9. 使用Python进行图像缩放处理
  10. Linux关ntp服务,linux下NTP服务