上一篇刚学会了如何获取地址所在经纬度以及经纬度对应地址,于是信心满满的准备在老板面前露一手,准备花点心思做个漂亮的可视化地图放在报告亮眼的位置。

当地图跑出来的那一刻顿时傻眼了,卧槽这些点定位的位置明显不对呀,酒店直定位到湖里了,这让老板看到你说后果严重不。

其实是因为百度地图的经纬度和高德地图经纬度所使用的坐标系编码不同,所以如果你制图的软件或平台是基于高德地图服务的话,那么就需要使用对应的高德标准的经纬度来进行绘图,同理如果你用的服务是基于百度地图的,必须使用百度标准的经纬度坐标,如果拿到的是高德坐标则必须经过算法转为百度标准。

今天这篇内容就给大家分享如何使用R和Python对百度坐标系和高德坐标系的经纬度进行互转,解决地图绘制最后一道坎儿。

内容同样是两个模块四小节,使用R语言和Python分别进行百度经纬度转高德经纬度以及高德标准转百度,这样我们在经纬度获取和转化处理上的技能掌握就比较系统了,不会再受制于工具和平台服务的标准差异而苦恼。

一、R语言方案

1)百度经纬度转腾讯&高德

library("leaflet")
library('baidumap')
library('ggplot2')
library('ggmap')dt1 <- read.table(pipe("pbpaste"), sep="t", header=T,stringsAsFactors =FALSE)
#百度转腾讯&高德
bMapTransQQMap <- function (lng,lat) {x_pi = 3.14159265358979324 * 3000.0 /180.0x = lng - 0.0065y = lat - 0.006z = sqrt(x^2 + y^2) - 0.00002 * sin(y * x_pi)theta = atan2(y,x) - 0.000003 * cos(x * x_pi)lngs = z * cos(theta)lats = z * sin(theta)return(data.frame(lng,lat,lngs,lats))
}result <- bMapTransQQMap(dt1$lon,dt1$lat)

使用高德地图服务来呈现百度坐标系下的经纬度,可以看到偏移量非常明显。

leaflet(result) %>% setView(116.2938,40.00939, zoom = 13) %>%addTiles('http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',tileOptions(tileSize=256, minZoom=9, maxZoom=17),group="高德地图") %>%addCircleMarkers(lng = ~  lng,lat = ~lat,stroke = FALSE,fillOpacity = 1,radius =8)

使用高德地图服务来呈现经百度坐标系转换高德坐标系后的经纬度,可以看到位置基本已经还原了。

leaflet(result) %>% setView(116.2938,40.00939, zoom = 13) %>%addTiles('http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',tileOptions(tileSize=256, minZoom=9, maxZoom=17),group="高德地图") %>%addCircleMarkers(lng = ~  lngs,lat = ~lats,stroke = FALSE,fillOpacity = 1,radius =8)

2)高德坐标系转百度坐标系

# 腾讯&高德地图转百度
qqMapTransBMap <- function(lngs,lats){x_pi = 3.14159265358979324 * 3000.0 / 180.0x = lngs y = lats z = sqrt(x^2 + y^2) + 0.00002 * sin(y * x_pi)theta = atan2(y,x) + 0.000003 * cos(x * x_pi)lng_b = z * cos(theta) + 0.0065lat_b = z * sin(theta) + 0.006  return(data.frame(lngs,lats,lng_b,lat_b))
}
result_b <- qqMapTransBMap(result$lngs,result$lats)

使用百度地图服务呈现高德坐标系下的经纬度,偏移情况仍然很严重。

options(baidumap.key = '***************')
# 这里启用的baidumap服务,后台调用百度地图api,
# 需要使用百度api开发秘钥,需自己申请
bjMap <- getBaiduMap(location = c(116.284028,40.001732), width = 800, height =800, zoom = 16, scale = 2 , messaging = TRUE)
ggmap(bjMap) + geom_point(data = result_b, aes(x =  lngs, y = lats),shape = 21 , col = 'white',fill = 'red',size = 5) +theme_nothing()

使用百度地图服务呈现经高德坐标系转百度坐标系后的经纬度,可以看到为止基本已经还原到真实位置,误差相对较小。

ggmap(bjMap) + geom_point(data = result_b, aes(x =  lng_b, y =  lat_b),shape = 21 , col = 'white',fill = 'red',size = 5) +theme_nothing()

二、Python实现方案

3)百度坐标系转高德坐标系

import pandas as pd
import numpy as np
import folium
from folium import plugins
df=pd.read_clipboard()
def bMapTransQQMap(lng,lat):x_pi = 3.14159265358979324 * 3000.0 /180.0x = np.array(lng) - 0.0065y = np.array(lat) - 0.006z = np.sqrt(np.power(x,2) + np.power(y,2)) - 0.00002 * np.sin(y * x_pi)theta = np.arctan2(y,x) - 0.000003 * np.cos(x * x_pi)lngs = z * np.cos(theta)lats = z * np.sin(theta)return(pd.DataFrame({'lng':lng,'lat':lat,'lngs':lngs,'lats':lats}))
result = bMapTransQQMap(df['lon'],df['lat'])

使用folium库(底层调用leaflet服务)结合高德地图服务来呈现百度标准的的经纬度,误差依然很大。

lng = np.array(result["lng"],dtype=float)
lat = np.array(result["lat"],dtype=float)
data1 = [(lat[i],lng[i]) for i in range(len(result))]map_osm = folium.Map(location=[39.996710,116.281012],zoom_start=115,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',attr="&copy; <a href="http://ditu.amap.com/">高德地图</a>")
marker_cluster = plugins.MarkerCluster().add_to(map_osm)
for i in data1:folium.Marker(i).add_to(marker_cluster)
display(map_osm)

百度坐标系经转化为高德坐标系之后,位置的精确度基本还原,明显改善。

lng = np.array(result["lngs"],dtype=float)
lat = np.array(result["lats"],dtype=float)
data2 = [(lat[i],lng[i]) for i in range(len(result))]map_osm = folium.Map(location=[39.996710,116.281012],zoom_start=115,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',attr="&copy; <a href='http://ditu.amap.com/'>高德地图</a>")
marker_cluster = plugins.MarkerCluster().add_to(map_osm)
for i in data2:folium.Marker(i).add_to(marker_cluster)
display(map_osm)

4)高德坐标系转百度坐标系

#腾讯&高德地图转百度
def qqMapTransBMap(lngs,lats):x_pi = 3.14159265358979324 * 3000.0 / 180.0x = np.array(lngs)y = np.array(lats )z = np.sqrt(np.power(x,2) + np.power(y,2)) + 0.00002 * np.sin(y * x_pi)theta = np.arctan2(y,x) + 0.000003 * np.cos(x * x_pi)lng_b = z * np.cos(theta) + 0.0065lat_b = z * np.sin(theta) + 0.006  return(pd.DataFrame({'lngs':lngs,'lats':lats,'lng_b':lng_b,'lat_b':lat_b}))result2 = qqMapTransBMap(result['lngs'],result['lats'])

至此,两种技术方案下的所有类型转换均以搞定,虽然至今还没明白算法里面的具体参数到底是啥意思,只是照葫芦画瓢把一篇博客上的java代码翻译了过来(再次感谢原作者提供的java代码),不过原理不懂没有关系,语法能看懂就OK了。

参考资料:

https://www.cnblogs.com/wrld/p/10845870.html

经纬度绘图_用编程赋能工作系列——百度VS高德经纬度互转相关推荐

  1. 百度地图根据经纬度计算距离php,详解js根据百度地图提供经纬度计算两点距离...

    正常在使用百度地图时,我们可以通过BMap的实例对象提供的方法计算距离: var map = new BMap.Map('map_canvas'); map.getDistance(point1 ,p ...

  2. 经纬度绘图_【知识科普】地形图图例汇总,测绘人识图绘图必备(含dwg版下载)...

    地形图(topographic map)指的是地表起伏形态和地理位置.形状在水平面上的投影图.具体来讲,将地面上的地物和地貌按水平投影的方法(沿铅垂线方向投影到水平面上),并按一定的比例尺缩绘到图纸上 ...

  3. python语言编程基础视频_网络编程-5_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...

    通过学习,对Python有一定的了解,学习Python语法,可以使用Python原生语言开发项目.对于Python的应用于开发有一个系统的认知,对于未来的发展方向有清晰的认识.主要知识点包括基本语法. ...

  4. 蓝牙配对不弹配对框_配对编程在工作场所的好处和陷阱

    蓝牙配对不弹配对框 Pair programming is two programmers working together at one workstation. 结对编程是指两个程序员在一个工作站 ...

  5. python怎么编辑程序_少儿编程:Python系列24——字符串的替换和检索

    #少儿编程# 因为会汉语拼音了,小po最近迷上打字,他经常会为我们家制作一张购物清单(其实就是他想吃的东西),如图1,然后把这张购物清单作为字符串赋值到一个变量里. 图1 这次他刚做完,就发觉奶豆和奶 ...

  6. php 百度转高德经纬度,PHP腾讯地图经纬度转百度地图经纬度

    /** * 中国正常GCJ02坐标---->百度地图BD09坐标 * 腾讯地图用的也是GCJ02坐标 * @param double $lat 纬度 * @param double $lng 经 ...

  7. java gps转高德坐标_GPS 经纬度转换 百度、高德经纬度

    package com.ldygo.gw.gpsobd.utils; public class ECGeoCoordinateTransformUtil { static double x_pi = ...

  8. 【PHP】百度转高德经纬度

    if (!function_exists('gdEncrypt')) {//BD-09(百度)坐标转换成GCJ-02(火星,高德)坐标//@param $longitude 百度经度//@param ...

  9. 百度android api坐标转地址,百度API从经纬度坐标到地址的转换服务

    /// /// 百度API从经纬度坐标到地址的转换服务 /// /// /// /// public string GetAddress(string lng, string lat) { strin ...

最新文章

  1. 数据结构与算法:22 精选练习50
  2. 解决kubernetes中ingress-nginx配置问题
  3. [一] 详细讲解: 线性表链式存储结构 中的 单链表; (数据结构和算法)
  4. xp 硬盘安装linux双系统,WinXP硬盘安装Ubuntu 11.10双系统全程图解
  5. 东部985硕士毕业,北方二线省会军工所,还是上海互联网大厂?
  6. 李彦宏:Apollo Moon共享无人车必须要比打车便宜;消息称iPhone 12 mini已停产;抖音网页版上线|极客头条...
  7. Win10设置热点IP
  8. 整理:周鸿祎谈如何写商业计划书
  9. Xshell v6 Build 0193 绿色特别版及全套产品
  10. PHP 二元线性拟合函数
  11. 高位压迫——萨基给世界足坛带来的技术革命
  12. Varargs(可变个数形参)
  13. raid卡缓存对硬盘性能_服务器RAID配置方法大全
  14. 罗克韦尔AB PLC RSLogix数字量IO模块基本介绍
  15. [每日一题]C语言:将输入的一句话的单词倒置,但标点符号不倒置
  16. python笔记(五)
  17. 图像处理之_傅立叶变换
  18. 微博社交圈子挖掘所面临的困难
  19. 【第31篇】探索普通视觉Transformer Backbones用于物体检测
  20. 固态量子计算中退相干研究获进展

热门文章

  1. java解析xml实例——获取天气信息
  2. PHP调用WebService接口
  3. 【转】TLB(Translation Lookaside Buffers,TLB)的作用
  4. mongodb sharding 试用(四)
  5. JavaEE实战班第十四天
  6. 吐血推荐 | 那些提升开发人员工作效率的在线工具
  7. S5PV210裸机之SDRAM
  8. linux系统如何用root用户登陆,Linux用root账号创建一个新的登录账号的方法
  9. oracle中文字段名怎么查询_sql注入联合查询总结
  10. windows虚拟机_iOS 版虚拟机:在 iPhone 上运行 Windows 系统