首页 > 编程语言 >用Python历时十多天完成的全国所有区县经纬度采集

用Python历时十多天完成的全国所有区县经纬度采集

时间:2024-03-13 15:33:13浏览次数:29  
标签:十多天 None return 经纬度 city Python csv data loc

在高德坐标拾取器(坐标拾取器 | 高德地图API)中,如果输入北京,坐标获取结果为:116.407387,39.904179,这是经纬度坐标,在高德公开的全国所有区县编码表(https://a.amap.com/lbs/static/code_resource/AMap_adcode_citycode.zip)中,有3241行数据,字段分别为中文名,adcode,citycode,其中citycode就相当于电话区号,而adcode比较精确,每个区县是不同的,如果adcode最末位为0,表示前三位和它相同的adcode都是它的下辖区县。

中文名adcodecitycode
中华人民共和国100000
北京市110000010
东城区110101010

不过这张表没有给出经纬度。

可以使用高德开放平台(高德开放平台 | 高德地图API)的API采集经纬度,需要用到的是搜索POI。

搜索POI产品介绍

搜索服务API是一类简单的HTTP接口,提供多种查询POI信息的能力,其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。

使用API前您需先申请Key,若无高德地图API账号需要先申请账号。

注意:在此接口之中,您可以通过city&citylimit参数指定希望搜索的城市或区县。而city参数能够接收citycode和adcode,citycode仅能精确到城市,而adcode却能够精确到区县。

具体参数详见(搜索POI-高级 API 文档-开发指南-Web服务 API | 高德地图API

本次请求的url= 'https://restapi.amap.com/v3/place/text?city={}&keywords={}&citylimit=true&offset=20&page=1&key=YOURKEY&extensions=all'.format(city,keywords)

其中city=adcode,keywords=中文名

为了统一请求,提供一个通用的请求函数

def openUrl(_url):
    # 设置请求头 request header
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
    }
    response = requests.get(_url, headers=headers)
    if response.status_code == 200:  # 如果状态码为200,寿命服务器已成功处理了请求,则继续处理数据
        return response.content
    else:
        return None

对每个地点都调用获取经纬度,返回POI的第一个

def get_location(city,keywords):
    # return str(Lon,Lat)
    _url = 'https://restapi.amap.com/v3/place/text?city={}&keywords={}&citylimit=true&offset=20&page=1&key=YOURKEY&extensions=all'.format(city,keywords)
    content = openUrl(_url,False)
    if content:
        res = json.loads(content)
        pois = res.get('pois')
        if len(pois) > 0:
            return pois[0].get('location')
        else:
            return None
    print('request not return 200')
    return None

为了能方便存取,先把从高德下载的excel表转存为csv,分别由两个函数存取

def write_csv(filepath, data, head=None):
    if head:
        data = [head] + data
    with open(filepath, mode='w', encoding='UTF-8', newline='') as f:
        writer = csv.writer(f)
        for i in data:
            writer.writerow(i)

def read_csv(filepath):
    data = []
    if os.path.exists(filepath):
        with open(filepath, mode='r', encoding='utf-8') as f:
            lines = csv.reader(f)  # #此处读取到的数据是将每行数据当做列表返回的
            for line in lines:
                data.append(line)
        return data
    else:
        print('filepath is wrong:{}'.format(filepath))
        return []

最后,构建一个循环来一行一行地采集

# 处理一个地点经纬度后更新csv
def process_lon_lat():
    data = read_csv(CSV_PATH)
    header = data[0]
    data = data[1:]
    data_new = []
    done = False
    for city in data:
        if not done and not city[3]:
            loc = get_location(city[1],city[0])
            if loc:
                loc_split = loc.split(',')
                print(city,loc_split)
                data_new.append([city[0],city[1],city[2],loc_split[0],loc_split[1]])
                done = True
            else:
                data_new.append([city[0],city[1],city[2],'None','None'])
                print(city,'None')
        else:
            data_new.append(city)
    write_csv(CSV_PATH, data_new, header)

# 更新csv经纬度主控
def LonLat_update():
    data = read_csv(CSV_PATH)
    data = data[1:]
    for city in data:
        process_lon_lat()
        time.sleep(6)

由于API的使用配额是每天100次请求这个接口,我不得不使用了两个key来采集,总共历时十多天才完成,每天半小时,采集好的数据样例如下(完整的已传到我的资源中,https://download.csdn.net/download/cnnews/88938675):

中文名adcodecitycodeLonLat
北京市110000010116.40738739.904179
东城区110101010116.41633439.928359
西城区110102010116.3658539.9126

完整代码:

# coding: utf-8
import os
import requests
import csv
import json
import time

CSV_PATH = 'AMap_adcode_citycode.csv'

def openUrl(_url):
    # 设置请求头 request header
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
    }
    response = requests.get(_url, headers=headers)
    if response.status_code == 200:  # 如果状态码为200,寿命服务器已成功处理了请求,则继续处理数据
        return response.content
    else:
        return None

def write_csv(filepath, data, head=None):
    if head:
        data = [head] + data
    with open(filepath, mode='w', encoding='UTF-8', newline='') as f:
        writer = csv.writer(f)
        for i in data:
            writer.writerow(i)

def read_csv(filepath):
    data = []
    if os.path.exists(filepath):
        with open(filepath, mode='r', encoding='utf-8') as f:
            lines = csv.reader(f)  # #此处读取到的数据是将每行数据当做列表返回的
            for line in lines:
                data.append(line)
        return data
    else:
        print('filepath is wrong:{}'.format(filepath))
        return []

##################################################################################
# 获取地点经纬度
# {'status': '0', 'info': 'USER_DAILY_QUERY_OVER_LIMIT', 'infocode': '10044'}
def get_location(city,keywords):
    # return str(Lon,Lat)
    _url = 'https://restapi.amap.com/v3/place/text?city={}&keywords={}&citylimit=true&offset=20&page=1&key=YOURKEY&extensions=all'.format(city,keywords)
    content = openUrl(_url,False)
    if content:
        res = json.loads(content)
        pois = res.get('pois')
        if len(pois) > 0:
            return pois[0].get('location')
        else:
            return None
    print('request not return 200')
    return None

# 处理一个地点经纬度后更新csv
def process_lon_lat():
    data = read_csv(CSV_PATH)
    header = data[0]
    data = data[1:]
    data_new = []
    done = False
    for city in data:
        if not done and not city[3]:
            loc = get_location(city[1],city[0])
            if loc:
                loc_split = loc.split(',')
                print(city,loc_split)
                data_new.append([city[0],city[1],city[2],loc_split[0],loc_split[1]])
                done = True
            else:
                data_new.append([city[0],city[1],city[2],'None','None'])
                print(city,'None')
        else:
            data_new.append(city)
    write_csv(CSV_PATH, data_new, header)

# 更新csv经纬度主控
def LonLat_update():
    data = read_csv(CSV_PATH)
    data = data[1:]
    for city in data:
        process_lon_lat()
        time.sleep(6)

if __name__ == '__main__':
    LonLat_update()

标签:十多天,None,return,经纬度,city,Python,csv,data,loc
From: https://blog.csdn.net/cnnews/article/details/136634259

相关文章

  • python实现发送邮件
    python实现自动化邮件发送测试环境:os:windows10编译软件:pycharm,python发送端:[email protected]接收端:[email protected],[email protected] 1.发送端需开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。我这里使用的是QQ,需要去mail.qq.com开启此服务:【登录】-【设置】-【账号】-【OP3/IMA......
  • 如何系统的学习Python——文件操作
    在Python中,文件操作是一项常见的任务,用于读取和写入文件。下面简要介绍Python中的文件处理(FileHandling)操作:打开文件(OpenaFile):要打开一个文件,可以使用内建的open()函数。open()函数接受文件路径和打开模式作为参数。#打开一个文件以供读取file_path="example.......
  • springboot/java/php/node/python小区物业管理小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,住宅小区作为城市生活的基本单元,其管理效率和服务质量直接影响着居民的生活体验。传统的物业管理方式往往依赖于人工操作,不仅耗时......
  • python Ai 应用开发基础训练,字符串,字典,文件,函数,装饰品,生成器(下)
    生成器的另一个示例,这个生成器功能是从大小生,生成斐波那契数列deffib(max):#定义一个函数fib,参数为maxa,b=0,1#初始化两个变量a和b,分别赋值为0和1n=0#初始化计数变量n为0whileb<max:#当b小于max时继续循环print(b)#打印当前的斐波......
  • 如何系统的学习Python——图书管理系统
    一个典型的应用面向对象编程(OOP)概念的实际项目——图书管理系统。在这个项目中,我们可以设计多个类来表示不同的实体,如书籍、作者、图书馆、借阅者等,并通过这些类之间的关系来模拟现实生活中的图书管理流程。以下是一个简单的图书管理系统的面向对象设计概念示例:1.类的设......
  • 如何系统的学习Python——异常处理
    异常处理是在程序执行期间检测到的错误或异常情况的处理过程。在Python中,异常由try,except,else和finally语句来处理。以下是一个简单的介绍:1.try和except块:try:#可能会引发异常的代码块result=10/0#除零异常exceptZeroDivisionError:......
  • springboot/java/php/node/python企业微培训小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着科技的迅猛发展,移动互联网已成为企业培训的新阵地。传统的面对面培训模式因其时间、地点的限制性逐渐显得不够灵活,而小程序作为一种轻量级的应用,能够......
  • 4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕
    4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》)——跟老吕学Python编程一、下载MAC版Python1.Python官网2.MAC版Python下载网址二、在MAC安装Python1.在MAC安装Python2.阅读Python重要信息3.同意Python许可4.确认同意......
  • 重新编译python(亲证有效)
    以下内容解决了我在python使用中出现的问题:Nomodulenamed_twinter源码编译源码编译是指将已经存在的源代码转换为可执行的机器代码的过程。对于Python这种解释型编程语言,重新编译源码意味着重新构建可执行的Python解释器。下面我将介绍一下源码编译和重新编译Python的具......
  • Python之Web开发中级教程----搭建Web框架二
    Python之Web开发中级教程----搭建Web框架二搭建虚拟环境虚拟环境的作用虚拟环境可以搭建独立的python运行环境,使得单个项目的运行环境与其它项目互不影响.搭建虚拟环境 (1)安装sudopipinstallvirtualenvsudopipinstallvirtualenvwrapper(2)配置环境变量1)创建......