@TOC地理逆编码(获取经纬度详细地址)
逆地理编码,又称地址解析服务,是指从已知的经纬度坐标到对应的地址描述(如行政区划、街区、楼层、房间等)的转换。常用于根据定位的坐标来获取该地点的位置详细信息,与定位功能是黄金搭档。也就是坐标转地址。
第一步,申请Web服务API类型Key;
第二步,参考接口参数文档发起HTTP/HTTPS请求,第一步申请的 Key 需作为必填参数一同发送;
第三步,接收请求返回的数据(JSON或XML格式),参考返回参数文档解析数据。
需要注意的是,调用逆地理编码需要高德的key,没有的同学可以搜索高德开放平台进行注册申请,这里就不介绍了。这是高德平台调用逆编码API的开发指南地址https://lbs.amap.com/api/webservice/guide/api/georegeo
逆地理编码采用的请求方式为GET,API服务地址为https://restapi.amap.com/v3/geocode/regeo?parameters。URL中可以输入10个参数,其中Key和Location为必填参数,其余为可选参数,若不填写,则会使用默认的缺省值。具体的参数含义和缺省值见下表。
由于我们的目标是获取到行政村一级的数据,而常规返回数据中这一项通常为空值,故选择设置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三类。结果状态值和状态说明反映的是请求结果,主要数据都在逆地理编码列表中。
我们可以读取字典的方式对该列表进行读取
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)
感谢各位大佬的观看!: