代码分析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 Web框架Flask中使用百度云存储BCS实例
Feb 08 Python
Python实现CET查分的方法
Mar 10 Python
Python 基础之字符串string详解及实例
Apr 01 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python多线程socket编程之多客户端接入
Sep 12 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Django分页功能的实现代码详解
Jul 29 Python
django中的图片验证码功能
Sep 18 Python
使用IDLE的Python shell窗口实例详解
Nov 19 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 gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
Vue $attrs & inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
Python爬豆瓣电影实例
2018/02/23 Python
Python List cmp()知识点总结
2019/02/18 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
python绘制玫瑰的实现代码
2020/03/02 Python
python用什么编辑器进行项目开发
2020/06/17 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
九年级化学教学反思
2014/01/28 职场文书
老师对学生的寄语
2014/04/09 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
工作失职检讨书
2015/01/26 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
Python基础学习之奇异的GUI对话框
2021/05/27 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
Java版 简易五子棋小游戏
2022/05/04 Java/Android