代码分析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实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python实现八大排序算法(2)
Sep 14 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
python实现无边框进度条的实例代码
Dec 30 Python
python控制台打印log输出重复的解决方法
May 14 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php购物车实现方法
2015/01/03 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
python生成器generator用法实例分析
2015/06/04 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
快速入手Python字符编码
2016/08/03 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
物业招聘计划书
2014/01/10 职场文书
班级活动策划书
2014/02/06 职场文书
《草原》教学反思
2014/02/15 职场文书
环保倡议书500字
2014/05/15 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
入党培养人考察意见
2015/06/08 职场文书
行政处罚事先告知书
2015/07/01 职场文书
2016国培学习心得体会
2016/01/08 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android