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编写android截屏脚本双击运行即可
Jul 21 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
python使用sorted函数对列表进行排序的方法
Apr 04 Python
Python 多线程抓取图片效率对比
Feb 27 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
python命令行参数用法实例分析
Jun 25 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
Python函数调用追踪实现代码
Nov 27 Python
scrapy头部修改的方法详解
Dec 06 Python
python 远程执行命令的详细代码
Feb 15 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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 图片上传类代码
2009/07/17 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python中int()函数的用法浅析
2017/10/17 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
考试不及格的检讨书
2014/01/22 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
南京导游词
2015/02/03 职场文书
考勤制度通知
2015/04/25 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
步步惊心观后感
2015/06/12 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
MySQL 角色(role)功能介绍
2021/04/24 MySQL
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL