代码分析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从ftp下载数据保存实例
Nov 20 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
Python类属性的延迟计算
Oct 22 Python
PyQt5每天必学之切换按钮
Aug 20 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
对pandas replace函数的使用方法小结
May 18 Python
学习python可以干什么
Feb 26 Python
Python打印特殊符号及对应编码解析
May 07 Python
PyQt5实现画布小程序
May 30 Python
python FTP编程基础入门
Feb 27 Python
Python实现DBSCAN聚类算法并样例测试
Jun 22 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中的Streams详细介绍
2014/11/12 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
jQuery封装animate.css的实例
2018/01/04 jQuery
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
python画折线图的程序
2018/07/26 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
基于python实现对文件进行切分行
2020/04/26 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
哪些是python中web开发框架
2020/06/17 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
中专毕业生个人职业生涯规划
2014/02/19 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
员工工作及收入证明
2014/10/28 职场文书
爱国电影观后感
2015/06/19 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
MySQL创建管理LIST分区
2022/04/13 MySQL
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript