python利用百度/高德地图获取地理位置并转换

2023-11-17

提示:作者原创,转载请注明


一、地理编码与逆编码

地理编码与逆编码表示的是地名地址与地理坐标(经纬度)互相转换的过程。其中,将地址信息映射为地理坐标的过程称之为地理编码;将地理坐标转换为地址信息的过程称之为逆地理编码。(ps:猜猜我在哪)
在这里插入图片描述
地理编码能对一些只有名称或地址的数据进行空间化,从而可以开展空间分析和制图,对于数据分析人员十分重要。
大量地图厂商都提供了相关的API,可以直接利用这些API进行转化。国外的如谷歌、esri、osm等,国内的有百度、高德、腾讯等公司,python提供了专业的geopy包集成了这些API调用。
地理处理包将单独研究,本文直接使用高德和百度的开放API进行地理编码。使用开放API前需要注册应用获取KEY

提示:以下是本篇文章正文内容,下面案例可供参考

二、高德地图地理编码

详细信息可参考官方开发文档,可以看到,请求参数必填的有key和address,其他的根据需要设置
在这里插入图片描述
具体代码如下:

def getGDCor(key,addr):
    baseUrl = 'http://restapi.amap.com/v3/geocode/geo?'
    params = {'key': key, ##应用key
              'address': addr,
              'city': u'武汉' ##指定城市,限制范围
             }
    url = baseUrl + urllib.parse.urlencode(params)
    req = urllib.request.Request(url)
    content = urllib.request.urlopen(req).read()
    jsonData = json.loads(content)
    lon, lat = '', ''
    if jsonData['status'] == '1':
        try:
            corr = jsonData['geocodes'][0]['location']
            lon,lat = corr.split(',')[0],corr.split(',')[1]
        except:
            lon,lat = '0','0'
    else:
        print('error')
    return (lon,lat)

三、百度地图地理编码

百度地图与高德类似,同样需要注册应用获取key,详细内容参考官网文档
在这里插入图片描述

def getBDCor(ak,addr):
    #sleep(random.random())
    baseUrl = 'http://api.map.baidu.com/geocoding/v3/?'
    params = {'address': addr,
              'city':u'武汉市',
              'output':'json',
              'ak': ak, ##应用key
              'callback': 'showLocation'
             }
    url = baseUrl + urllib.parse.urlencode(params)
    req = urllib.request.urlopen(url).read().decode() #'utf-8' 针对中文需要设施编码
    cont1 = req.replace("showLocation&&showLocation(",'')
    cont = cont1.replace(")",'')
    jsonData = json.loads(cont)
    lon, lat = 0, 0
    if jsonData['status'] == 0:
        try:
            lon = jsonData['result']['location']['lng']
            lat = jsonData['result']['location']['lat']
        except:
            print(addr)
    return (lon,lat)

四、坐标转换和空间化

高德或百度获取的地理位置都是经过加密的,高德地图位置使用的是火星坐标,百度地图是bd-09坐标,与WGS84坐标系间有偏差,通常需要进行转换。

  • 火星坐标(GCJ-02):国测局坐标,由WGS-84加密而成,国内必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;
  • 百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系。

各坐标间可以通过坐标转换互转,通常有三参数或七参数法,网上可找到相关的转换参数,贴一下转换函数(不知道哪位大神写的)

import math

x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率


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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python利用百度/高德地图获取地理位置并转换 的相关文章

随机推荐

  • 快速排序(C语言简单实现)

    快速排序 C语言简单实现 快速排序 Quick Sort 是冒泡排序的升级版 基本思想 通过一趟排序将待排记录分割成独立的两部分 其中一部分记录的关键字均比另一部分记录的关键字小 则可分别对这两部分记录继续进行排序 以达到整个序列有序的目的
  • [ Shell ] 通过 Shell 脚本导出 CDL 网表

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 https b
  • 服务器要如何提高性能

    服务器要如何提高性能 一 将服务器虚拟化 如果同期拥有多个项目 增加额外服务器会显得浪费 成本费用也会大幅度上升 这时不妨通过技术将其划分成多个虚拟空间 而每个空间又可以使用不同操作系统 运行不同应用程序 使得符合项目要求 这种方式通常能增
  • 数字猜谜游戏

    数字猜谜游戏 1 数字猜谜之需求分析 2 在写程序时需要学习的知识 3 数字猜谜之编程思路 4 数字猜谜之程序代码 5 数字猜谜之用户演示 6 数字求和 1 100数字之间的偶数之和 包含1和100 1 100数字之间的奇数之和 包含1和1
  • nginx配置监听443端口,开启ssl协议,走 https 访问

    本文目录 前言 一 检查 linux 服务器上的 nginx 是否安装 ssl 模块 二 为 nginx 安装 ssl 模块 三 nginx 开启 443 端口监听 https配置 成功配好后的效果如下 遇到的问题一 证书无效 遇到的问题二
  • Unity UGUI的RawImage(原始图片)组件的介绍及使用

    Unity UGUI的RawImage 原始图片 组件的介绍及使用 1 什么是RawImage组件 RawImage是Unity UGUI中的一个组件 用于显示原始图片 与Image组件不同 RawImage可以直接显示原始图片的像素数据
  • 全面的数仓建设规范指南(纯干货建议收藏)

    本文将全面讲解数仓建设规范 从数据模型规范 到数仓公共规范 数仓各层规范 最后到数仓命名规范 包括表命名 指标字段命名规范等 目录 一 数据模型架构原则 数仓分层原则 主题域划分原则 数据模型设计原则 二 数仓公共开发规范 层次调用规范 数
  • 菜鸟求职记2

    9月14号 记得那天下午早早的就到了西电 等待alibaba的宣讲开始 然后就是占了个前排 听了一下午的宣讲 接下来要笔试了 可是人家只给收到笔试通知的菜鸟有座位 我们这等野鸟连笔试的机会也不给 后来听说最后还是给机会了 可是本菜鸟没有参加
  • 分布式注册中心-etcd

    etcd是什么 etcd 设计为提供高可用 强一致性的小型 kv 数据存储服务 etcd v2 和 v3 比较 v3使用 gRPC protobuf 取代 v2的http json 通信 提高通信效率 gRPC 只需要一条连接 http是每
  • C# 字符串(String)

    在 C 中 您可以使用字符数组来表示字符串 但是 更常见的做法是使用 string 关键字来声明一个字符串变量 string 关键字是 System String 类的别名 创建 String 对象 您可以使用以下方法之一来创建 strin
  • 学习总结HTML CSS JAVASCRIPT,对三剑客的一些理解

    网页设计一般用到三大技术 html css javascript HTML 相当于一个文档 里面是要给用户的信息 使用他提供的一些标签 来把你想传递给用户的信息进行合理编排 使信息更好的传递给用户 CSS 相当于把这个文档进行修饰 美化实现
  • 8.16 IO作业

    拷贝 int main int argc const char argv if argc 3 printf input file error n printf wsage a out srcfile dstfile n FILE fp if
  • Windows 64编程中寄存器的使用

    下面是摘自 MSDN 的文章 在 Win64 下的 registers 用途 Register Status Use RAX Volatile Return value register RCX Volatile First integer
  • tf.app.run出现错误AttributeError: module '__main__' has no attribute 'main'

    我在运行tf app run的时候出现AttributeError module main has no attribute main 的错误 网上没有查到有用的资料 但是看到默认传递的是main 函数 可能是这个出现了错误 因此我把mai
  • vba帮助手册chm_Excel 2010 VBA 离线帮助 简体中文版 本地帮助分享

    众所周知 Excel VBA帮助是我们写代码的好帮手 无论是初学者 还是VBA老鸟 很多问题都可以直接在VBA帮助里找到答案 但是坑爹的微软 在office2013以后 不再提供本地帮助 更重要的是 离线帮助非常不好用啊 但是高版本又有很多
  • 关于GTC

    目录 一 会议内容 二 AI技术 三 AI应用 四 AI前景 GTC GPU Technology Conference 是由英伟达 NVIDIA 主办的一场全球性的技术大会 旨在探讨人工智能 深度学习 自动驾驶等领域的最新技术 为参会者提
  • Shell自动补全传参简单demo

    准备两个文件 File1 env bash buildsh prompt COMPREPLY local cur COMP WORDS COMP CWORD local cmd COMP WORDS COMP CWORD 1 local o
  • 机器学习模型评价指标(准确率、精度、召回率)

    模型评价指标 准确率 精度 召回率 机器学习中我们常常使用准确率 精度 召回率三大指标评价一个模型训练的好坏 那么这三大参数分别代表什么意义 在介绍评价指标前 需要先明确几个计算指标 真正例 True Positive TP 模型将测试样本
  • Python报错:ImportError: cannot import name XXX

    Python报错 ImportError cannot import name XXX 起因 在使用sklearn部分包库时出现该问题 尝试多种方法无果 解释及解决方法 语句中涉及的包库和已安装的包库出现了版本不一致的问题 比如你导入的包库
  • python利用百度/高德地图获取地理位置并转换

    提示 作者原创 转载请注明 文章目录 一 地理编码与逆编码 二 高德地图地理编码 三 百度地图地理编码 四 坐标转换和空间化 一 地理编码与逆编码 地理编码与逆编码表示的是地名地址与地理坐标 经纬度 互相转换的过程 其中 将地址信息映射为地