PYTHON通过高德API实现城市地址与经纬度批量转换(每十个一组查询)

引言

最近爬虫了一堆新冠病的数据,想要通过FineBI在地图上展示出来,但是需要自行提供经纬度,网上倒是有部分现成的,比如《Python版中国省市经纬度》,需要可自取。当然还是建议自己爬取,一通百通。
效果如下:
在这里插入图片描述
代码功能:

  • json文本转换与关键字段提取
  • csv文件创建和数值写入
  • list值批量读取和切割转换

1.申请KEY

高德上已有相应的开发手册介绍,直接参考其进行相应操作即可。
地理编码/逆地理编码 API:
https://lbs.amap.com/api/webservice/guide/api/georegeo

在这里插入图片描述

2.文档读取

之前爬的地址数据我放在a1.csv中,字段名称是’省份’和’城市’,文档编码是’gb2312
在这里插入图片描述

def parse():
    datas = []
    m = 0
    lists=[]
    totalListData = pd.read_csv('locs.csv', encoding='gb2312')
    totalListDict = totalListData.to_dict('index')
    for j in range(0, len(totalListDict)):
        datas.append(
        #加'|'是为了后面方便批量查询
            str(totalListDict[j]['省份']+'省'+str(totalListDict[j]['城市'])+'|'))
    #将数组切割为每十个一组
    lists = [datas[i:i + 10] for i in range(0, len(datas), 10)]
    return lists

3.接口提交

将获取到的地址名称通过高德api实现转换;
需设置batch值为true,方便批量查询
在这里插入图片描述

def transform(cityName):
    ak = 'your_key_value'     #此处填写自己申请的key值
   base = "http://restapi.amap.com/v3/geocode/geo?key=%s&address=%s&batch=true" % (
        ak, cityName)

4.提取结果

仅仅获取结果还不够,要将我们需要的经纬度信息提取出来。
在这里插入图片描述
根据接口文档可知,经纬度信息在geocodes字段中的location中;

def transform(k,cityName):
   ak = 'yourkey'  #被人直接复制粘贴了,搞得我自己没了次数
   base = "http://restapi.amap.com/v3/geocode/geo?key=%s&address=%s&batch=true" % (
       ak, cityName)
   response = requests.get(base)
   answer = response. json()
   j=0
   list=[]
   while  (j< int(answer['count'])):
   # 不过爬取过程中出现有的城市无法确认经纬度的问题,加入判定语句,直接剔除掉
       if ((answer['geocodes'] != []) and (answer['geocodes'][j]['district'] != [])):
          #省
           province=answer['geocodes'][j]['province']
           #市
           city=answer['geocodes'][j]['city']
           location=answer['geocodes'][j]['location']
           location=''.join(location).split(',',1)
           #经度
           jingdu=location[0]
           #纬度
           weidu=location[1]
           #地区
           district=answer['geocodes'][j]['district']
           df.loc[k] = [province,city,district,jingdu,weidu]
           #换行
           k=k+1
       j=j+1

5.写入文档

如下,写入localdetail.csv

if __name__ == '__main__':
    df = pd.DataFrame(columns=['province','city', 'district','jingdu','weidu'])
    cityNames = parse()
    k=0
    for cityName in cityNames:
        transform(k,cityName)
        k=k+10
    df.to_csv('locdetail7.csv', index=False)

最后贴图尚未完成FineBI的展示效果:
在这里插入图片描述
在这里插入图片描述

参考地址:

《Python 利用高德地图api实现经纬度与地址的批量转换》
《利用高德地图api将实际地址转换为经纬度(高德坐标系)python》

完整代码:

# -*- coding:utf-8 -*-
'''
利用高德地图api实现经纬度与地址的批量转换
'''
import requests
import pandas as pd
import time
import importlib
import sys
import json

importlib.reload(sys)

def parse():
    datas = []
    m = 0
    lists=[]
    totalListData = pd.read_csv('Updates_NC.csv', encoding='gb2312')
    totalListDict = totalListData.to_dict('index')
    for j in range(0, len(totalListDict)):
        datas.append(
            str(totalListDict[j]['省份']+'省'+str(totalListDict[j]['城市'])+'|'))
    lists = [datas[i:i + 10] for i in range(0, len(datas), 10)]
    return lists

def transform(k,cityName):
    ak = 'your_key_value'
    base = "http://restapi.amap.com/v3/geocode/geo?key=%s&address=%s&batch=true" % (
        ak, cityName)
    response = requests.get(base)
    answer = response. json()
    j=0
    list=[]
    while  (j< int(answer['count'])):
        if ((answer['geocodes'] != []) and (answer['geocodes'][j]['district'] != [])):
            province=answer['geocodes'][j]['province']
            city=answer['geocodes'][j]['city']
            location=answer['geocodes'][j]['location']
            location=''.join(location).split(',',1)
            jingdu=location[0]
            weidu=location[1]
            district=answer['geocodes'][j]['district']
            df.loc[k] = [province,city,district,jingdu,weidu]
            k=k+1
        j=j+1

if __name__ == '__main__':
    df = pd.DataFrame(columns=['province','city', 'district','jingdu','weidu'])
    cityNames = parse()
    k=0
    for cityName in cityNames:
        transform(k,cityName)
        k=k+10
    df.to_csv('locdetail7.csv', index=False)

github地址:
https://github.com/wangjie182/wh_ncov_city

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
利用Python高德地图API实现经纬度地址批量转换是可行的。首先,我们需要准备高德地图API密钥,该密钥可以通过高德地图开发者平台申请获得。 接下来,我们可以使用Python中的requests库发送HTTP请求,通过调用高德地图的逆地理编码接口,将经纬度转换地址。我们需要将API密钥和待转换经纬度构建为合适的URL,并发送GET请求。高德地图API将返回JSON格式的数据,其中包含有关地址信息的详细内容。 在代码中,我们可以使用for循环来遍历经纬度的列表,对每个经纬度调用逆地理编码接口并解析返回的JSON数据。我们可以从返回的数据中提取出地址信息,并将其保存到一个新的CSV文件中。 以下是一个简单的示例代码: ```python import requests import csv api_key = "your_api_key" def get_address(lat, lng): url = f"https://restapi.amap.com/v3/geocode/regeo?key={api_key}&location={lng},{lat}&radius=1000&extensions=all&batch=true&roadlevel=1" response = requests.get(url) data = response.json() address = data['regeocodes'][0]['formatted_address'] return address def main(): with open('input.csv', 'r') as input_file, open('output.csv', 'w', newline='') as output_file: reader = csv.reader(input_file) writer = csv.writer(output_file) writer.writerow(['经度', '纬度', '地址']) for row in reader: lat, lng = row[0], row[1] address = get_address(lat, lng) writer.writerow([lat, lng, address]) print("地址转换完成!") if __name__ == '__main__': main() ``` 在这个示例中,我们假设输入文件是一个CSV文件,其中包含经纬度数据。我们将转换后的地址保存到新的CSV文件中,其中包含经度、纬度和地址信息。 通过运行这个Python脚本,我们可以批量转换经纬度地址,并将结果保存到输出文件中。这样,我们就可以在后续的工作中方便地使用地址信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值