代码分析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 相关文章推荐
新手常见6种的python报错及解决方法
Mar 09 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
20行python代码实现人脸识别
May 05 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
python中的global关键字的使用方法
Aug 20 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
python异常处理之try finally不报错的原因
May 18 Python
Python 必须了解的5种高级特征
Sep 10 Python
python从ftp获取文件并下载到本地
Dec 05 Python
Python图片检索之以图搜图
May 31 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
Codeigniter注册登录代码示例
2014/06/12 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python字典基本操作实例分析
2015/07/11 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
python实现汉诺塔方法汇总
2016/07/25 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
python实现大学人员管理系统
2019/10/25 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
职工代表大会主持词
2014/04/01 职场文书
毕业生面试求职信
2014/06/23 职场文书
2014年化验员工作总结
2014/11/18 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
java项目构建Gradle的使用教程
2022/03/24 Java/Android