技术文档|利用Python将地址转换成经纬度坐标

技术文档|利用Python将地址转换成经纬度坐标

1 年前 · 来自专栏 Python大数据分析

点击下面链接获取 地址转坐标工具V.1.02 (零代码)

目录

本文主要讲述利用Python将 文本格式的地址 转换为 数字格式的经纬度坐标数据 ,主要步骤有:

  1. 注册高德地图API账号,申请Web服务的Key
  2. 了解并测试地理编码API服务
  3. 利用Python实现地址转坐标

一、注册高德地图API账号,申请Web服务的Key

本文利用高德地图API中Web服务提供的 地理编码 接口实现地址转坐标。想要使用地理编码接口,首先要注册成为高德地图API的开发者,下图为注册界面

高德地图API账号注册界面

注册成功后,进入应用管理平台,并在“我的应用”中点击“创建新应用”按钮(右上角),根据需要填写“应用名称”以及“应用类型”

创建新应用

应用创建成功后,在该应用栏中点击“添加Key”按钮(右上角)

点击添加Key

根据需要输入“Key名称”,服务平台需要选择“Web服务”

添加“Web服务”的Key

成功创建一个"Web服务"的Key,如果有大批量转换的需要可以申请多个Key。

成功申请一个Key

二、了解并测试地理编码接口

高德地图地理编码接口的网址是:

地理编码API的使用步骤是:

  1. 参考接口参数文档发起HTTP/HTTPS请求,将 Key 需作为必填参数一同发送
  2. 接收请求返回的数据(JSON或XML格式)
  3. 参考返回参数文档解析数据

下图为地理编码API服务的地址。其中,parameters代表的参数包括必填参数和可选参数,所有参数均使用和号字符(&)进行分隔。基于该网址并结合请求参数和Key一同发送就可以得到相应的返回结果。

地理编码API服务地址

下图为地理编码API的请求参数说明。该API中必填内容是Key和Address,Key就是第一步中申请得到的密钥,address代表结构化的地址信息。如果想要一次请求返回多条地址的坐标,可以将batch参数设置为true,并用'|'来分隔多条地址,值得注意的是一次请求最多能够支持10条地址。output代表返回数据格式类型,一般默认返回Json格式。

地理编码API的请求参数说明

下图为地理编码API的返回参数说明。如果status字段返回1且info字段返回'OK',则该次返回成功。其中,地址的经纬度数据在geocodes下的location中。

地理编码API的返回参数说明

接下来,对上述地理编码API进行一次简单的测试。

当前请求参数为:

  • key:27a90950bd4233a3589503ba03d58f25
  • address:上海市嘉定区墨玉南路888号|上海市嘉定区嘉定区墨玉南路1号
  • batch:true
  • output:json

组合后的Url为: https://restapi.amap.com/v3/geocode/geo?key=27a90950bd4233a3589503ba03d58f25&address=上海市嘉定区墨玉南路888号|上海市嘉定区嘉定区墨玉南路1号&batch=true&output=json

下图为返回结果,可以看到两处红线标住的地方为经纬度坐标

地理编码API测试返回结果

三、利用Python实现地址转坐标

下面的代码为执行一次高德地图地理编码查询的函数

# 执行一次高德地图地理编码的查询
# 输入值:locationList -> 地址的序列,currentKey -> 当前使用的Key
# 返回值:resultList -> 查询成功,返回结果坐标的序列
#        -1 -> 执行当前查询时Key的配额用完了
#        -2 -> 执行当前查询出错
def ExcuteSingleQuery(locationList,currentkey):
    # 1-将locationList中的地址连接成高德地图API能够识别的样子
    locationString = ""     # 当前locationList组成的string
    for location in locationList:
        locationString += location + '|'
    # 2-地理编码查询需要的Url
    output = 'json'    # 查询返回的形式
    batch = 'true'     # 是否支持多个查询
    base = 'https://restapi.amap.com/v3/geocode/geo?'    # 地理编码查询Url的头
    currentUrl = base + "output=" + output + "&batch=" + batch + "&address=" + locationString + "&key=" + currentkey
    # 3-提交请求
    response = requests.get(currentUrl)    # 提交请求
    answer = response.json()   # 接收返回
    # 4-解析Json的内容
    resultList = []    # 用来存放地理编码结果的空序列
    if answer['status'] == '1' and answer['info'] == 'OK':
        # 4.1-请求和返回都成功,则进行解析
        tmpList = answer['geocodes']    # 获取所有结果坐标点
        for i in range(0,len(tmpList)):
                # 解析','分隔的经纬度
                coordString = tmpList[i]['location']
                coordList = coordString.split(',')
                # 放入结果序列
                resultList.append((float(coordList[0]),float(coordList[1])))
            except:
                # 如果发生错误则存入None
                resultList.append(None)
        return resultList
    elif answer['info'] == 'DAILY_QUERY_OVER_LIMIT':
        # 4.2-当前账号的余额用完了,返回-1
        return -1
    else:
        # 4.3-如果发生其他错误则返回-2
        return -2

接下来,用真实的数据对上面的函数进行测试,并输出返回结果

if __name__ == '__main__':
    # 创建测试地址数据集
    locationList = [
        "四川省成都市崇州市崇阳街道晋康北路313号",
        "四川省成都市成都高新区盛华北路107号1楼",
        "四川省成都市四川省成都市金堂县赵镇迎宾大道一段8号",
        "四川省成都市崇州市三江镇崇新村5组",
        "四川省成都市大邑县鹤鸣乡联和村二十组",
        "四川省成都市成都市蒲江县复兴乡庙峰村3组52号",
        "四川省成都市成都高新区新乐路125号1楼",
        "四川省成都市成都市青羊区锦里西路127号1层3号",
        "四川省成都市成都高新区天府一街616号8栋附203号",
        "四川省成都市四川省成都市成华区东三环路二段宝耳路2号1号办公楼3楼1号",
    # 进行地理编码
    print(ExcuteSingleQuery(locationList=locationList, currentkey="365ac412d6e22f49ce3d345270ecc643"))

下面为函数测试的结果,可以看到返回结果为10个地址的经纬度坐标,测试成功!

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe C:/Users/Administrator/PycharmProjects/Geocoding/Geocoding.py
(103.68455, 30.64138)
(104.051735, 30.558456)
(104.409448, 30.858932)
(103.797445, 30.529827)
(103.391601, 30.598182)
(103.42105, 30.313147)
(104.04065, 30.605325)
(104.047531, 30.653964)