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 27 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
python实现画一颗树和一片森林
Jun 25 Python
python绘制地震散点图
Jun 18 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
Python正则表达式如何匹配中文
May 27 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
Python机器学习之逻辑回归
May 11 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 Ubb代码编辑器函数代码
2012/07/05 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
accesskey 提交
2006/06/26 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
详解Python 函数如何重载?
2019/04/23 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
python支持多继承吗
2020/06/19 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
品质主管的岗位职责
2013/12/04 职场文书
个人承诺书格式
2014/06/03 职场文书
企业党建工作总结2015
2015/05/26 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python