[Python]利用高德地图api实现经纬度与地址的批量转换

我们都知道,可以使用高德地图api实现经纬度与地址的转换。那么,当我们有很多个地址与经纬度,需要批量转换的时候,应该怎么办呢?

在这里,选用高德Web服务的API,其中的地址/逆地址编码,可以实现经纬度与地址的转换。

高德API地址:

地理/逆地理编码:http://lbs.amap.com/api/webservice/guide/api/georegeo

坐标转换:http://lbs.amap.com/api/webservice/guide/api/convert

 

1.申请key

2.坐标转换

坐标转换是一类简单的HTTP接口,能够将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。

 

def transform(location):
	parameters = {'coordsys':'gps','locations': location, 'key': 'XXXXXX'}
        base = 'http://restapi.amap.com/v3/assistant/coordinate/convert'
        response = requests.get(base, parameters)
        answer = response.json()
        return answer['locations']


2.地理/逆地理编码

 

我这里是将经纬度转换为地址,所以选用的是逆地理编码的接口。

 

def geocode(location):
        parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
        base = 'http://restapi.amap.com/v3/geocode/regeo'
        response = requests.get(base, parameters)
        answer = response.json()
        return answer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')


3.从文件中读取

 

需要批量获取的话,一般是从文件中读取数据,读取代码如下:

 

def parse():
	datas = []
	totalListData = pd.read_csv('locs.csv')
	totalListDict = totalListData.to_dict('index')
	for i in range(0, len(totalListDict)):
		datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy']))
	return datas

 

 

 

 

 

4.完整代码

对于批量获取,我一开始也走了很多弯路。一开始选用javascript接口,但是js接口的函数是异步返回,所以可能第10行的结果跑到第15行去了,一直没有很好的解决,后来才选用web接口。最后,将完整代码贴于此,仅供参考。

 

#!/usr/bin/env
#-*- coding:utf-8 -*-
'''
利用高德地图api实现经纬度与地址的批量转换
'''
import requests
import pandas as pd
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def parse():
	datas = []
	totalListData = pd.read_csv('locs.csv')
	totalListDict = totalListData.to_dict('index')
	for i in range(0, len(totalListDict)):
		datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy']))
	return datas
		
def transform(location):
	parameters = {'coordsys':'gps','locations': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
        base = 'http://restapi.amap.com/v3/assistant/coordinate/convert'
        response = requests.get(base, parameters)
        answer = response.json()
        return answer['locations']

def geocode(location):
        parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
        base = 'http://restapi.amap.com/v3/geocode/regeo'
        response = requests.get(base, parameters)
        answer = response.json()
        return answer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')
		
if __name__=='__main__':
	i = 0
	count = 0
	df = pd.DataFrame(columns=['location','detail'])
	#locations = parse(item)
	locations = parse()
	for location in locations:
		dist, detail = geocode(transform(location))
		df.loc[i] = [dist, detail]
		i = i + 1
	df.to_csv('locdetail.csv', index =False)
	

 

 

 

注意事项:

在测试的时候,一个key差不多可以下载2000-3000条数据,一个账号可以申请4个key。这是我自己的使用情况。所以,测试的时候,不用测试过多,直接开始正式爬数据才是正道。

高德地图API可以用来获取地址经纬度。首先,你需要创建一个个人账户,并在应用管理界面创建一个新的应用。选择"Web服务"服务平台,这样创建出来的密钥才能使用"地理/逆地理编码"模块。\[2\]然后,你可以使用Python来获取单个或多个位置经纬度。对于单个位置,你可以使用以下代码: ```python import requests import json def coords(city): url = 'https://restapi.amap.com/v3/geocode/geo' params = { 'key': '你的高德密钥', 'address': city } res = requests.get(url, params) jd = json.loads(res.text) return jd\['geocodes'\]\[0\]\['location'\] city = '北京市' location = coords(city) print(location) ``` 对于多个位置,你可以将它们放在一个列表中,并使用循环来获取它们的经纬度: ```python import requests import json def coords(city): url = 'https://restapi.amap.com/v3/geocode/geo' params = { 'key': '你的高德密钥', 'address': city } res = requests.get(url, params) jd = json.loads(res.text) return jd\['geocodes'\]\[0\]\['location'\] areas = \['xxx', 'yyy', 'zzz'\] for area in areas: location = coords(area) print(location) ``` 在以上代码中,你需要将`'你的高德密钥'`替换为你在高德地图API上获取的密钥。这样,你就可以使用高德地图API来获取地址经纬度了。 #### 引用[.reference_title] - *1* *2* *3* [Python调用高德地图API获取中文地址对应的经纬度](https://blog.csdn.net/weixin_44447680/article/details/105943233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值