Python自动化爬取全国行政区划GeoJSON数据实战指南

1. 为什么你需要一份最新的行政区划GeoJSON数据?

做数据可视化的朋友,尤其是和地图打交道的,肯定对GeoJSON这个格式不陌生。简单来说,GeoJSON就是一种用JSON格式来描述地理空间数据的标准。它能把一个省、一个市、甚至一条街道的边界轮廓,用一串坐标点精确地“画”出来。当你用ECharts、Mapbox、Leaflet这些酷炫的可视化库做中国地图时,背后支撑的“骨架”往往就是一份份GeoJSON数据。

那么问题来了,数据从哪来?你可能听说过阿里云的DataV地图选择器,它确实提供了一个非常方便的在线工具,可以手动下载单个省市的GeoJSON。但如果你和我一样,是个“懒人”程序员,或者项目需要全国所有省、市、区县三级完整的数据集,手动一个个点下载,不仅耗时费力,还容易出错漏。更关键的是,行政区划并非一成不变,每年都可能会有调整,比如某个县变成了区,或者新设立了一个市级行政区。手动维护这套数据,简直是场噩梦。

这就是为什么我们需要自动化。用Python写个脚本,一键爬取、整理、存储全国最新的行政区划GeoJSON数据,把我们从重复劳动中解放出来。今天,我就把自己在实际项目中多次使用的这套自动化方案分享给你,从环境搭建、代码逐行解析,到数据存储设计、错误处理,再到如何无缝对接ECharts,手把手带你走完全流程。你会发现,原来获取一份权威、完整、结构清晰的地图底图数据,可以如此简单高效。

2. 动手之前:环境与工具准备

工欲善其事,必先利其器。在开始写爬虫代码之前,我们需要把“厨房”收拾好。别担心,这个过程非常简单,几乎就是“开箱即用”。

2.1 Python环境与核心库

首先,确保你安装了Python,我推荐使用Python 3.7或以上版本,兼容性更好。我们这次用到的库都是Python标准库或非常轻量的第三方库,不需要复杂的科学计算环境。

  • urllib: 这是Python内置的HTTP请求库,我们用它来从网站获取数据。虽然现在requests库更流行,但为了减少外部依赖,让脚本在任何纯净的Python环境都能运行,我们选择标准库。你不需要额外安装。
  • json: 同样是Python内置库,用于解析服务器返回的JSON格式数据,以及将我们处理好的数据保存为JSON文件。
  • ssl: 用于处理HTTPS请求的SSL证书验证。有时候目标网站的证书可能不被本地环境完全信任,我们会用到它来创建一个“不验证”的上下文,但这仅用于示例和学习,在生产环境中请务必谨慎评估安全风险。
  • os: 用于文件和目录操作,比如创建文件夹来分类存放我们爬取到的各省市数据。

你只需要一个能写代码的文本编辑器(比如VS Code、PyCharm)或者Jupyter Notebook,就可以开始了。我习惯在项目根目录下新建一个geo_json_crawler.py的Python文件,所有代码都写在这里。

2.2 理解数据源结构

我们的数据来自阿里云DataV提供的一个公共服务接口。在写代码之前,我们先花两分钟搞清楚我们要“爬”什么,以及对方是怎么组织这些数据的。这能让你后面的代码理解起来毫不费力。

核心的入口地址是这个:https://geo.datav.aliyun.com/areas_v2/bound/infos.json。你用浏览器打开这个链接,会看到一大串JSON数据。它就像一个“总目录”或“元数据索引”。里面以行政区划代码(比如110000代表北京市)为键,存储了每个区域的信息,主要包括:

  • name: 行政区划名称,如“北京市”。
  • level: 层级,如province(省)、city(市)、district(区县)。
  • parent: 父级区域的行政区划代码。通过这个字段,我们可以构建出省-市-区县的树形关系。
  • centroid: 一个包含lat(纬度)和lng(经度)的数组,代表该区域的中心点坐标。这个在ECharts中做标记点(如标注城市位置)时极其有用。

有了这个索引文件,我们就知道了全国所有行政区划的代码和层级。真正的GeoJSON几何数据,则通过另一个URL模式获取:

  • 不包含子区域的边界(外轮廓):https://geo.datav.aliyun.com/areas_v2/bound/{行政区划代码}.json
  • 包含子区域的边界(比如广东省的GeoJSON里包含了所有市级的边界):https://geo.datav.aliyun.com/areas_v2/bound/{行政区划代码}_full.json

注意,区县级(district)通常没有_full版本,因为它已经是最细的层级了。理解了这个结构,我们的爬虫逻辑就清晰了:先抓“目录”(infos.json),再根据目录里的列表,去批量下载每一个具体的“地图文件”(.json和_full.json)。

3. 核心爬虫代码逐行详解

接下来,我们进入最核心的部分——代码。我会把完整的脚本拆解开,一段一段解释其作用和背后的思考,你完全可以跟着我的注释和说明,自己敲一遍,印象会更深刻。

3.1 目录创建与数据写入函数

任何好的程序都应该结构清晰。我们首先定义两个工具函数,专门负责把爬取到的GeoJSON数据漂亮地保存到本地。

import json
import urllib.request
import urllib.parse
import ssl
import os

# 工具函数:将不包含子区域的geojson写入文件
def write_json_to_file(area_code, geojson_data, level):
    """
    保存单个区域的轮廓数据。
    :param area_code: 行政区划代码,如 '110000'
    :param geojson_data: 爬取到的GeoJSON字典数据
    :pa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值