python 地图经纬度转换、纠偏的实例代码


Posted in Python onAugust 06, 2018

python 地图经纬度转换、纠偏的代码如下所示:

# -*- coding: utf-8 -*-
import json
import urllib
import math
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 偏心率平方
class Geocoding:
  def __init__(self, api_key):
    self.api_key = api_key
  def geocode(self, address):
    """
    利用高德geocoding服务解析地址获取位置坐标
    :param address:需要解析的地址
    :return:
    """
    geocoding = {'s': 'rsv3',
           'key': self.api_key,
           'city': '全国',
           'address': address}
    geocoding = urllib.urlencode(geocoding)
    ret = urllib.urlopen("%s?%s" % ("http://restapi.amap.com/v3/geocode/geo", geocoding))
    if ret.getcode() == 200:
      res = ret.read()
      json_obj = json.loads(res)
      if json_obj['status'] == '1' and int(json_obj['count']) >= 1:
        geocodes = json_obj['geocodes'][0]
        lng = float(geocodes.get('location').split(',')[0])
        lat = float(geocodes.get('location').split(',')[1])
        return [lng, lat]
      else:
        return None
    else:
      return None
def gcj02_to_bd09(lng, lat):
  """
  火星坐标系(GCJ-02)转百度坐标系(BD-09)
  谷歌、高德——>百度
  :param lng:火星坐标经度
  :param lat:火星坐标纬度
  :return:
  """
  z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
  theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
  bd_lng = z * math.cos(theta) + 0.0065
  bd_lat = z * math.sin(theta) + 0.006
  return [bd_lng, bd_lat]
def bd09_to_gcj02(bd_lon, bd_lat):
  """
  百度坐标系(BD-09)转火星坐标系(GCJ-02)
  百度——>谷歌、高德
  :param bd_lat:百度坐标纬度
  :param bd_lon:百度坐标经度
  :return:转换后的坐标列表形式
  """
  x = bd_lon - 0.0065
  y = bd_lat - 0.006
  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)
  gg_lng = z * math.cos(theta)
  gg_lat = z * math.sin(theta)
  return [gg_lng, gg_lat]
def wgs84_to_gcj02(lng, lat):
  """
  WGS84转GCJ02(火星坐标系)
  :param lng:WGS84坐标系的经度
  :param lat:WGS84坐标系的纬度
  :return:
  """
  if out_of_china(lng, lat): # 判断是否在国内
    return lng, lat
  dlat = _transformlat(lng - 105.0, lat - 35.0)
  dlng = _transformlng(lng - 105.0, lat - 35.0)
  radlat = lat / 180.0 * pi
  magic = math.sin(radlat)
  magic = 1 - ee * magic * magic
  sqrtmagic = math.sqrt(magic)
  dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
  dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
  mglat = lat + dlat
  mglng = lng + dlng
  return [mglng, mglat]
def gcj02_to_wgs84(lng, lat):
  """
  GCJ02(火星坐标系)转GPS84
  :param lng:火星坐标系的经度
  :param lat:火星坐标系纬度
  :return:
  """
  if out_of_china(lng, lat):
    return lng, lat
  dlat = _transformlat(lng - 105.0, lat - 35.0)
  dlng = _transformlng(lng - 105.0, lat - 35.0)
  radlat = lat / 180.0 * pi
  magic = math.sin(radlat)
  magic = 1 - ee * magic * magic
  sqrtmagic = math.sqrt(magic)
  dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
  dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
  mglat = lat + dlat
  mglng = lng + dlng
  return [lng * 2 - mglng, lat * 2 - mglat]

def bd09_to_wgs84(bd_lon, bd_lat):
  lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
  return gcj02_to_wgs84(lon, lat)

def wgs84_to_bd09(lon, lat):
  lon, lat = wgs84_to_gcj02(lon, lat)
  return gcj02_to_bd09(lon, lat)

def _transformlat(lng, lat):
  ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
     0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
  ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
      math.sin(2.0 * lng * pi)) * 2.0 / 3.0
  ret += (20.0 * math.sin(lat * pi) + 40.0 *
      math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
  ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
      math.sin(lat * pi / 30.0)) * 2.0 / 3.0
  return ret

def _transformlng(lng, lat):
  ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
     0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
  ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
      math.sin(2.0 * lng * pi)) * 2.0 / 3.0
  ret += (20.0 * math.sin(lng * pi) + 40.0 *
      math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
  ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
      math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
  return ret

def out_of_china(lng, lat):
  """
  判断是否在国内,不在国内不做偏移
  :param lng:
  :param lat:
  :return:
  """
  return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)

if __name__ == '__main__':
  lng = 118.7294833
  lat = 31.9341833
  result1 = gcj02_to_bd09(lng, lat)
  result2 = bd09_to_gcj02(lng, lat)
  result3 = wgs84_to_gcj02(lng, lat)
  result4 = gcj02_to_wgs84(lng, lat)
  result5 = bd09_to_wgs84(lng, lat)
  result6 = wgs84_to_bd09(lng, lat)
  s,v=wgs84_to_bd09(118.7294833,31.9341833)
  #lng1,lat1= wgs84_to_gcj02(lng,lat)
  #s,v =gcj02_to_bd09(lng1,lat1)
  print s,v
  #print result1, result2, result3, result4, result5, result6

总结

以上所述是小编给大家介绍的python 地图经纬度转换、纠偏的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python类定义和类继承详解
May 08 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
python 删除非空文件夹的实例
Apr 26 Python
python3.x实现发送邮件功能
May 22 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
django 解决扩展自带User表遇到的问题
May 14 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
浅析python函数式编程
Sep 26 Python
Python图像识别+KNN求解数独的实现
Nov 13 Python
Anaconda下配置python+opencv+contribx的实例讲解
Aug 06 #Python
Django添加sitemap的方法示例
Aug 06 #Python
python中scikit-learn机器代码实例
Aug 05 #Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 #Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 #Python
python与caffe改变通道顺序的方法
Aug 04 #Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 #Python
You might like
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php图片添加水印例子
2016/07/20 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
jQuery ready函数滥用分析
2011/02/16 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
Python利用IPython提高开发效率
2016/08/10 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python 互换字典的键值对实例
2019/02/12 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
2014年领导班子专项整治整改方案
2014/09/28 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015年工商所工作总结
2015/05/21 职场文书
中学教代会开幕词
2016/03/04 职场文书
个人向公司借款协议书
2016/03/19 职场文书
基于python实现银行管理系统
2021/04/20 Python