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 相关文章推荐
浅谈django model postgres的json字段编码问题
Jan 05 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
pandas带有重复索引操作方法
Jun 08 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
python retrying模块的使用方法详解
Sep 25 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
pandas-resample按时间聚合实例
Dec 27 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
Python return语句如何实现结果返回调用
Oct 15 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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比较两个绝对时间的大小
2014/01/31 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
js CSS操作方法集合
2008/10/31 Javascript
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
python处理RSTP视频流过程解析
2020/01/11 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
信息部岗位职责
2013/11/12 职场文书
会计专业应届生求职信
2013/11/24 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
《白鹅》教学反思
2014/04/13 职场文书
物业消防安全责任书
2014/07/23 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android