(PYTHION)地理逆编码(根据经纬度获取详细地址)

@TOC地理逆编码(获取经纬度详细地址)

逆地理编码

逆地理编码,又称地址解析服务,是指从已知的经纬度坐标到对应的地址描述(如行政区划、街区、楼层、房间等)的转换。常用于根据定位的坐标来获取该地点的位置详细信息,与定位功能是黄金搭档。也就是坐标转地址。

作业流程

第一步,申请Web服务API类型Key;

第二步,参考接口参数文档发起HTTP/HTTPS请求,第一步申请的 Key 需作为必填参数一同发送;

第三步,接收请求返回的数据(JSON或XML格式),参考返回参数文档解析数据。

定义URL

需要注意的是,调用逆地理编码需要高德的key,没有的同学可以搜索高德开放平台进行注册申请,这里就不介绍了。这是高德平台调用逆编码API的开发指南地址https://lbs.amap.com/api/webservice/guide/api/georegeo

URL构成

逆地理编码采用的请求方式为GET,API服务地址为https://restapi.amap.com/v3/geocode/regeo?parameters。URL中可以输入10个参数,其中Key和Location为必填参数,其余为可选参数,若不填写,则会使用默认的缺省值。具体的参数含义和缺省值见下表。
(PYTHION)地理逆编码(根据经纬度获取详细地址)_第1张图片
由于我们的目标是获取到行政村一级的数据,而常规返回数据中这一项通常为空值,故选择设置extensions=all,可以得到更多的返回信息,下面是一段完整的url。
“https://restapi.amap.com/v3/geocode/regeo?output=json&location={111.102608},{38.119400}&key=&extensions=all”

发起请求和返回数据处理

发起请求

import requests
res = requests.get(url)

逆地理编码API使用的请求方式为get

返回参数处理

逆地理编码的响应结果的格式由请求参数output指定。这里没有设置该参数,故返回默认的json格式。

val = res.json()

返回参数主要分为结果状态值status、状态说明info、逆地理编码列表regeocodes三类。结果状态值和状态说明反映的是请求结果,主要数据都在逆地理编码列表中。
(PYTHION)地理逆编码(根据经纬度获取详细地址)_第2张图片
我们可以读取字典的方式对该列表进行读取

val['addressComponent']['province']   # 获取省份
val['addressComponent']['city']           # 获取市
val['addressComponent']['district']      # 获取县区

下面是根据上述流程对代码进行封装得到的完整代码,这里我们通过遍历PIO列表里面的地名获取距离最近的庄村点作为所属行政村名称。另外值得注意的是常规GPS获取到数据的坐标系统与高德所用坐标系统不一致,存在偏差。可以通过调用坐标转换API实现GPS坐标到高德坐标的转换。这部分代码已经采用函数封装写在下面了,有需要的可以参考一下。

import requests

AK='2xxxxxxxxxxx'  # 填写自己的KEY

def Coord2Pos(lon,lat,town='true'):
   url = "https://restapi.amap.com/v3/geocode/regeo?output=json&location={0},{1}&key={2}&extensions=all".format(str(lon), str(lat),AK)
   res = requests.get(url)
   val = res.json()
   val = val['regeocode']
   retVal = {'province': val['addressComponent']['province'], 'city': val['addressComponent']['city'],
                 'district': val['addressComponent']['district'], 'town': val['addressComponent']['township'],
                  'adcode': val['addressComponent']['adcode'],'town_code': val['addressComponent']['towncode'],
                  'street': val['addressComponent']['streetNumber']['street']}
    distance = float(3000)
       for i in range(len(val['pois'])):
           if val['pois'][i]['type'] =='地名地址信息;普通地名;村庄级地名':
               valdis = float(val['pois'][i]['distance'])
               # print(type(valdis))
               # print(type(distance))
               if valdis < distance:
                   distance = valdis

def transform(lon, lat):
   url = "https://restapi.amap.com/v3/assistant/coordinate/convert?locations={0},{1}&coordsys=gps&key={2}".format(str(lon), str(lat),AK)
   res = requests.get(url)
   if res.status_code == 200:
       val = res.json()
       if val['status'] == '1':
           lon, lat = val['locations'].split(',')
           return lon, lat


lonList = [(111.102608,	38.119400), (110.97428426600,	38.05850000000), (110.81234982800,	37.96280000000),(110.81182089900,	37.95870000000),
               (110.76823716700,	38.05610000000), (110.75807027100,	38.04450000000)]
for i in range(len(lonList)):
   lon, lat = transform(lonList[i][0],lonList[i][1])
   val1 = Coord2Pos(lon, lat)
   print(val1)

感谢各位大佬的观看!: Alt

你可能感兴趣的:(GIS,python,其他)