代码分析Python地图坐标转换


Posted in Python onFebruary 08, 2018

最近做项目正好需要坐标的转换

  • 各地图API坐标系统比较与转换;
  • WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
  • 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
  • GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
  • 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
  • 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的.

然后在csv中将其转化。

最后再在百度地图API上进行检验成功

#http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=10923
#代码原地址
import csv
import string
import time
import math

#系数常量
a = 6378245.0
ee = 0.00669342162296594323
x_pi = 3.14159265358979324 * 3000.0 / 180.0;

#转换经度
def transformLat(lat,lon):
 ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon +0.2 * math.sqrt(abs(lat))
 ret += (20.0 * math.sin(6.0 * lat * math.pi) + 20.0 * math.sin(2.0 * lat * math.pi)) * 2.0 / 3.0
 ret += (20.0 * math.sin(lon * math.pi) + 40.0 * math.sin(lon / 3.0 * math.pi)) * 2.0 / 3.0
 ret += (160.0 * math.sin(lon / 12.0 * math.pi) + 320 * math.sin(lon * math.pi / 30.0)) * 2.0 / 3.0
 return ret

#转换纬度
def transformLon(lat,lon):
 ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * math.sqrt(abs(lat))
 ret += (20.0 * math.sin(6.0 * lat * math.pi) + 20.0 * math.sin(2.0 * lat * math.pi)) * 2.0 / 3.0
 ret += (20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0
 ret += (150.0 * math.sin(lat / 12.0 * math.pi) + 300.0 * math.sin(lat / 30.0 * math.pi)) * 2.0 / 3.0
 return ret

#Wgs transform to gcj
def wgs2gcj(lat,lon):
 dLat = transformLat(lon - 105.0, lat - 35.0)
 dLon = transformLon(lon - 105.0, lat - 35.0)
 radLat = lat / 180.0 * math.pi
 magic = math.sin(radLat)
 magic = 1 - ee * magic * magic
 sqrtMagic = math.sqrt(magic)
 dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * math.pi)
 dLon = (dLon * 180.0) / (a / sqrtMagic * math.cos(radLat) * math.pi)
 mgLat = lat + dLat
 mgLon = lon + dLon
 loc=[mgLat,mgLon]
 return loc

#gcj transform to bd2
def gcj2bd(lat,lon):
 x=lon
 y=lat
 z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * x_pi)
 theta = math.atan2(y, x) + 0.000003 * math.cos(x * x_pi)
 bd_lon = z * math.cos(theta) + 0.0065
 bd_lat = z * math.sin(theta) + 0.006
 bdpoint = [bd_lon,bd_lat]
 return bdpoint

#wgs transform to bd
def wgs2bd(lat,lon):
 wgs_to_gcj = wgs2gcj(lat,lon)
 gcj_to_bd = gcj2bd(wgs_to_gcj[0], wgs_to_gcj[1])
 return gcj_to_bd;

for i in range (3,4):
 n = str('2017.040'+ str(i)+'.csv')
 m = str('2017040' + str(i)+'.csv')
 csvfile = open(m,'w',encoding='UTF-8',newline='')
 nodes = csv.writer(csvfile)
 nodes.writerow(['md5','content','phone','conntime','recitime','lng','lat'])
 l=[]
 with open(n,newline='',encoding='UTF-8') as f:
  reader = csv.DictReader(f)
  for row in reader:
   if row['md5'] == 'md5':
    continue
   else:
    y=float(row['lng'])
    x=float(row['lat'])
    loc=wgs2bd(x,y)
    l.append([row['md5'],row['content'],row['phone'],row['conntime'],row['recitime'],loc[0],loc[1]])
 nodes.writerows(l)
 csvfile.close()

 print("转换成功")
Python 相关文章推荐
python回调函数的使用方法
Jan 23 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
我就是这样学习Python中的列表
Jun 02 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
Python移位密码、仿射变换解密实例代码
Jun 27 Python
python基础之模块的导入
Oct 24 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 #Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 #Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 #Python
Python列表推导式与生成器表达式用法示例
Feb 08 #Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 #Python
python OpenCV学习笔记实现二维直方图
Feb 08 #Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 #Python
You might like
PHP无限分类(树形类)
2013/09/28 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现人人网登录示例分享
2014/01/19 Python
Python常见数据结构详解
2014/07/24 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Django 静态文件配置过程详解
2019/07/23 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
PyTorch中的C++扩展实现
2020/04/02 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
健康教育主题班会
2015/08/14 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
教你用python控制安卓手机
2021/05/13 Python
聊聊Python String型列表求最值的问题
2022/01/18 Python