本文内容为作者原创,转载务必标明出处!

关于使用百度地图、谷歌地图以及高德地图的坐标系转换问题,网络上各类非专业及专业的解释都有,其中有的讲法不经验证乱讲,这里特别就此问题做说明并实践验证。

首先是几点说明:

1.

高德地图采用的坐标系是gcj02火星坐标系,bd09和bd09ll是百度坐标系,谷歌地图安装版坐标系是国际通用的wgs84坐标系(网页版未找到坐标拾取器未知)。其中谷歌地图的坐标与实际gps接收设备数据基本接近,误差在几米之内。因此,谷歌坐标系并非网上所讲的gcj02.

2.

Gcj02是国家测绘局的简拼,是国家强制要求所有电子地图不允许使用真实坐标标注的结果,是原始gps采集坐标经过一个算法加密后的坐标系。然而,此算法已经在网上公开并且验证为正确。Bd09和bd09ll是百度公司的加密算法坐标系,网上文章讲是从gcj02加密而来,其实未必,也许也是直接从wgs84直接转换而来,因为网上公开的算法有误,故具体如何不得而知。

3.

由谷歌地图采集的wgs84坐标系坐标,经过网上公开的转换算法,gcj02的计算结果与高德地图十分吻合,误差在5m范围,剔除采点的手动误差,可以确定高德地图就是gcj02坐标系。故网上提供的此算法即可用,用于导航也可以。而百度地图拾取器拾取的坐标则与谷歌采集点经过算法算出的点距离甚远,误差从十几米到几十米不等,因此证明网上这段算法为假。但不排除百度曾经使用过该算法,后来被公开后做了修改。

以下是以上结论的数据来源,采用的是网络公开的代码编程计算值:

地点

天安门广场国旗西侧花圃东北角

上海陆家嘴快网网球俱乐部网球场西角

广州天河体育中心西体育馆西角

西安西北大学田径场西南角

重庆大学足

球场南角

谷歌坐标

116.39.134,

39.905461

121.491747,

31.240332

113.317158,

23.138083

108.925974,

34.250364

106.464588,

29.566417

谷歌坐标转

出gcj02坐标

116.396374,

39.906862

31.238342,

121.496209

113.322567,

23.135480

34.248749,

108.930590

29.563807,

106.468537

谷歌坐标

转出bd09坐标

116.402831,

39.912971

31.244335,

121.502697

113.329095,

23.141299

108.937204,

34.254435

29.569833,

106.4750096

高德采

集坐标

116.39637,

39.906827

121.496183,

31.23833

113.322601,

23.135432

108.930661,

34.248712

106.468549,

29.563776

百度采集坐标

116.40276,

39.913123

121.502768,

31.243926

113.329099,

23.141161

108.937202,

34.254804

无目标

高德

与gcj02误差

3.73m

2.68m

6m

7.92m

3.93m

百度

与bd09误差

17.68m

46.07m

15.39m

40.67m

无目标

由上表可见,高德地图完全可以由网上的算法直接从实际观测gps值转换过来,或者从谷歌地图采集转换而来,而百度地图数据因为bd09算法无公开的代码,用网上的公开代码是错误的,至少误差是不能接受的。

此算法的代码从网上随便即可搜索得到,更改为C#语言版本,调试无误,如下:

#region wgs84与gcj02等坐标系转换函数

public class Gps

{

private double wgLat;

private double wgLon;

public Gps(double wgLat, double wgLon)

{

setWgLat(wgLat);

setWgLon(wgLon);

}

public double getWgLat()

{

return wgLat;

}

public void setWgLat(double wgLat)

{

this.wgLat = wgLat;

}

public double getWgLon()

{

return wgLon;

}

public void setWgLon(double wgLon)

{

this.wgLon = wgLon;

}

public override string ToString()

{

return wgLat + "," + wgLon;

}

}

public class PositionUtil

{

public static String BAIDU_LBS_TYPE = "bd09ll";

public static double

pi = 3.1415926535897932384626;

public static double a

= 6378245.0;

public static double

ee = 0.00669342162296594323;

public static Gps

gps84_To_Gcj02(double lat,

double lon)

{

if (outOfChina(lat,

lon))

{

return null;

}

double dLat = transformLat(lon -

105.0, lat - 35.0);

double dLon = transformLon(lon -

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);

dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);

double mgLat = lat +

dLat;

double mgLon = lon +

dLon;

return new

Gps(mgLat, mgLon);

}

public static Gps

gcj02_To_Gps84(double lat,

double lon)

{

Gps gps = transform(lat,

lon);

double lontitude = lon * 2 -

gps.getWgLon();

double latitude = lat * 2 -

gps.getWgLat();

return new Gps(latitude, lontitude);

}

public static Gps

gcj02_To_Bd09(double gg_lat,

double gg_lon)

{

double x = gg_lon, y =

gg_lat;

double z = Math.Sqrt(x * x + y * y) + 0.00002 *

Math.Sin(y * pi);

double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * pi);

double bd_lon = z * Math.Cos(theta) + 0.0065;

double bd_lat = z * Math.Sin(theta) + 0.006;

return new Gps(bd_lat, bd_lon);

}

public static Gps

bd09_To_Gcj02(double bd_lat,

double bd_lon)

{

double x = bd_lon - 0.0065, y =

bd_lat - 0.006;

double z = Math.Sqrt(x * x + y * y) - 0.00002 *

Math.Sin(y * pi);

double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * pi);

double gg_lon = z * Math.Cos(theta);

double gg_lat = z * Math.Sin(theta);

return new Gps(gg_lat, gg_lon);

}

public static Gps

bd09_To_Gps84(double bd_lat,

double bd_lon)

{

Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat,

bd_lon);

Gps map84 = PositionUtil.gcj02_To_Gps84(gcj02.getWgLat(),

gcj02.getWgLon());

return map84;

}

public static bool

outOfChina(double lat, double lon)

{

if (lon < 72.004 || lon >

137.8347)

return true;

if (lat < 0.8293 || lat >

55.8271)

return true;

return false;

}

public static Gps

transform(double lat, double lon)

{

if (outOfChina(lat,

lon))

{

return new Gps(lat,

lon);

}

double dLat = transformLat(lon -

105.0, lat - 35.0);

double dLon = transformLon(lon -

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);

dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);

double

mgLat = lat + dLat;

double mgLon = lon +

dLon;

return new Gps(mgLat, mgLon);

}

public static double

transformLat(double x, double y)

{

double ret = -100.0 + 2.0 * x + 3.0

* y + 0.2 * y * y + 0.1 * x * y

+ 0.2 * Math.Sqrt(Math.Abs(x));

ret += (20.0 * Math.Sin(6.0 * x

* pi) + 20.0 * Math.Sin(2.0 * x

* pi)) * 2.0 / 3.0;

ret += (20.0 * Math.Sin(y * pi)

+ 40.0 * Math.Sin(y / 3.0 * pi))

* 2.0 / 3.0;

ret += (160.0 * Math.Sin(y /

12.0 * pi) + 320 * Math.Sin(y *

pi / 30.0)) * 2.0 / 3.0;

return ret;

}

public static double

transformLon(double x, double y)

{

double ret = 300.0 + x + 2.0 * y +

0.1 * x * x + 0.1 * x * y + 0.1

* Math.Sqrt(Math.Abs(x));

ret += (20.0 * Math.Sin(6.0 * x

* pi) + 20.0 * Math.Sin(2.0 * x

* pi)) * 2.0 / 3.0;

ret += (20.0 * Math.Sin(x * pi)

+ 40.0 * Math.Sin(x / 3.0 * pi))

* 2.0 / 3.0;

ret += (150.0 * Math.Sin(x /

12.0 * pi) + 300.0 * Math.Sin(x

/ 30.0

* pi)) * 2.0 / 3.0;

return ret;

}

}

#endregion

wgs84坐标系拾取工具_Wgs84坐标系转换为gcj02坐标系及bd09坐标系的验证相关推荐

  1. 微信地图wgs84坐标,gcj02坐标,bd09坐标转换

    微信小程序三种常见经纬度坐标系的转化 遇见问题:在其它端点位显示正常,在小程序上点位发生偏移,微信小程序是gcj02坐标,就是xxToGcj02,具体情况具体分析 我们常用的地图api坐标系有wgs8 ...

  2. 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)

    1. 坐标系说明 开发地图应用服务时,一定会接触到各种坐标系,而保证坐标系的正确与合理是一切数据分析的前提,总的来说,坐标系可以分为两大类:地理坐标系GCS(Geographic Coordinate ...

  3. WGS84、GCJ02、BD09坐标系互转

    各坐标系简介与转换,包括WGS84(地球坐标系).GCJ02(火星坐标系)和BD09(百度坐标系) 一.各坐标系简介与转换 背景:从GPS和北斗卫星定位得到的定位数据采用的都是WGS84坐标系,即地球 ...

  4. wgs84坐标系转换工具_ArcGIS中不同坐标系之间的转换

    用户经常会遇到这样的情况,现有的数据坐标不符合要求,为应对需求,不得不为数据转换坐标系.很多人认为转换坐标系只是单纯的使用工具箱中的[投影]工具,那就大错特错了.有很多情况下,只使用[投影]工具并不能 ...

  5. ArcGIS笔记2_如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系

    本文目录 前言 Step 1 经纬度WGS84地理坐标系 → 经纬度ITRF2000地理坐标系 Step 2 经纬度ITRF2000地理坐标系 → 经纬度CGCS2000地理坐标系 Step 3 经纬 ...

  6. 【GIS坐标系介绍】WGS84坐标系、Web墨卡托、GCJ02坐标系、BD09坐标系

    目录 地球坐标系与投影坐标系的区别 WGS84坐标系.Web墨卡托.GCJ02坐标系.BD09坐标系区别以及使用的地图 1.WGS84 无偏移 2.CGCS2000 无偏移 3.GCJ02坐标 偏移 ...

  7. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

  8. html二维坐标系转换,旋转坐标系 转换工具

    旋转坐标系转换工具 假设3D 点的坐标 P, 在已知 x-y-z坐标参考框架: (x,y,z). 1)我们现在想知道在 P 的坐标 x'-y'-z'坐标参考框架, 这是旋转θ 周围的弧度z/z' '轴 ...

  9. jar 坐标系转换工具_MODIS数据处理工具HEG安装教程

    MODIS数据在遥感领域广泛使用,对于新手而言,其特有的坐标系让人摸不着头脑.当新手好不容易理解了坐标系,并使用简单的仿射变换矩阵做了投影转换,却发现投影转换后的tif影像不够精确,进一步使用数据时就 ...

  10. Unity开发3 坐标系及工具、快捷键操作

    一.坐标系 1.左手坐标系和右手坐标系 左手坐标系:X→ Y↑ Z朝向屏幕内部 右手坐标系:X→ Y↑ Z朝向屏幕外部 Unity使用的是左手坐标系 2.世界坐标系 世界坐标系就像经纬度一样,游戏对象 ...

最新文章

  1. 模仿人脑视觉处理,助力神经网络应对对抗性样本
  2. 14-jQuery补充
  3. ios markdown 解析_Shortcuts 教程:正则表达式修改 Markdown 链接
  4. 设置nginx开机启动
  5. 使用闭包的方式实现一个累加函数 addNum
  6. 聊一聊大火的对比学习
  7. Spring-aop-TargetSource/ProxyFactory/DefaultAopProxyFactory
  8. Linux操作系统中awk语言常见用法
  9. 图像分割方法及性能评价综述
  10. 在 for 循环里写加号拼接字符串的那个同事,不见了~
  11. 使用Fiddler监控雷电/夜神模拟器浏览网页:安全警告:该网站的安全证书有问题.解决方案!
  12. 【贪玩巴斯】一文通过操作实例——学会 知网专业检索 2022年3月21日
  13. 在Js中使程序睡眠的sleep方法
  14. 字符串生成条码(CODE128),并实现在水晶报表上的条码打印!
  15. h264编码算法流程
  16. lc用U盘更新固件_U盘故障修复实践
  17. Java的System.currentTimeMillis()的性能问题
  18. Ajax上传文件的cache、processdata、contentType属性以及FormData对象的总结
  19. 触宝输入法 v6.9.8.7
  20. linetv_line tv 苹果版-line tv ios版 v2.0.2 iPhone版-IT猫扑网

热门文章

  1. 如何制作纯净的U盘启动盘
  2. python微信聊天机器人_Python快速搭建会学习的微信聊天机器人
  3. 第073封“情书”:小目标20181022Using UV Layout ForGeometryPacking<Entagma>Houdini 2018
  4. 打印機lpt接口轉com接口
  5. 太牛了!阿里p8全面透彻剖析《Netty权威指南》,程序员必看!
  6. 栈的输出_TAOCP|基本算法|栈、队列与双端队列
  7. Android进阶知识(五):IPC基本概念之Binder、Binder工作机制及其原理
  8. 送书 | 图解机器学习—算法原理与Python语言实现
  9. js 把含有转义符的字符串转成json格式
  10. 希尔密码(加密、解密、破解)