一、案例背景
在经济学、管理学及社会科学的实证研究中,“空间维度”正在变得越来越重要。无论是研究企业选址、产业集群、区域经济差异,还是分析环境规制、政策试点与城市发展,研究者往往都需要把原始文本地址转化为空间坐标与行政区划信息。
但现实中的数据通常并不理想。很多课题组从工商系统、政府公告、企业名录或实地调研中获得的原始样本,往往只有一列凌乱的地址文本,常见问题包括:
- • 只有机构名称,没有完整地址,例如“某某高新技术产业园”“某某村民委员会”;
传统做法通常依赖正则表达式拆分文本,或者人工在地图中逐条查询。但这些方法不仅耗时,而且面对直辖市、重名城市、模糊地址和非标准文本时,稳定性很差。
本案例正是针对这一类科研痛点设计。它利用 Python 调用高德地图地理编码与逆地理编码接口,将原始地址文本自动转换为包含“经度、纬度、省、市、区县、街道”等字段的标准空间数据,为后续空间计量、地图制图、区域统计和 ArcGIS / Stata 分析提供基础数据支撑。
二、案例价值
这个案例的价值主要体现在三个方面。
1. 适合课堂教学
该项目流程清晰、结构完整,非常适合作为空间数据处理、经济地理分析、区域经济学和实证研究方法课程中的教学案例。学生可以通过一个小型项目,完整理解“文本地址数据如何转化为空间数据”的全过程。
2. 具有现实科研应用价值
很多研究主题都会涉及地址清洗和空间落点,例如:
只要原始数据中包含地址、机构名称或地理文本,该流程就可以迁移使用。
3. 帮助建立数据工程意识
项目不仅完成了 API 调用,还包含批量处理、异常处理、重试机制、文件读取、结果导出和流程调度等内容。这些环节都是科研代码从“能跑”走向“可复现、可扩展、可交付”的关键步骤。
因此,它不仅是一个地理编码工具,更是一套面向实证研究的数据工程小范式。
三、代码思路
整个项目可以分为三个核心部分:主流程调度、正向地理编码、逆向地理编码。
1. 主流程调度
主程序 main.py 负责串联整个流程。它先执行地理编码脚本,将地址转换为经纬度;再执行逆地理编码脚本,将经纬度进一步解析为行政区划字段。
整体流程如下:
原始 Excel 地址数据 ↓正向地理编码:地址 → 经纬度 ↓生成:地址_带经纬度.csv ↓逆向地理编码:经纬度 → 省、市、区县、街道 ↓生成:逆地理编码结果.csv
主程序相当于一个总控入口,避免用户分别手动运行多个脚本,提高了代码使用的便利性。
2. 正向地理编码:地址转经纬度
正向地理编码的核心任务是调用高德地图地理编码接口,将文本地址解析为经度和纬度。
例如,程序会读取 Excel 中的地址字段,然后逐条请求接口:
def get_geocode(address, key, batch=False, city=None, output="json"): url = "https://restapi.amap.com/v3/geocode/geo" params = { "address": address, "key": key, "batch": "true" if batch else "false", "city": city, "output": output } response = requests.get(url, params=params, timeout=10) data = response.json() return data
这一步的输出结果是 地址_带经纬度.csv,其中原始地址被补充了经度和纬度字段,为后续空间分析打下基础。
3. 重试机制:提高批量处理稳定性
在批量地理编码过程中,网络波动、接口限流或地址识别失败都可能导致请求异常。项目中加入了重试机制,提升整体处理成功率。
def get_geocode_with_retry(address, key, max_retries=5): for attempt in range(max_retries + 1): result = get_geocode(address, key) if result and result.get("status") == "1": return result time.sleep(1) return result
这段代码的作用是:如果某一次请求失败,程序不会立刻中断,而是等待一段时间后继续尝试。对于科研项目中的批量数据处理来说,这一点非常重要。
4. 逆向地理编码:经纬度转行政区划
获得经纬度之后,程序继续调用逆地理编码接口,将坐标转换为更完整的行政区划信息,包括省、市、区县和街道。
def get_regeo_data(self, max_retries=5): params = { "key": self.key, "location": self.location, "output": self.output, "extensions": "base" } for attempt in range(max_retries): response = requests.get(API_URL, params=params, timeout=10) data = response.json() if data.get("status") == "1": return data time.sleep(1) return None
这一步的最终输出为 逆地理编码结果.csv。相比单纯的经纬度结果,这份文件更适合直接用于区域统计、空间匹配和面板数据构建。
5. 直辖市特殊处理
在行政区划处理中,北京、上海、天津、重庆这类直辖市需要单独处理。因为它们在省级和市级字段上具有特殊性,如果不加处理,可能导致省市字段重复或错位。
MUNICIPALITIES = ['北京市', '上海市', '天津市', '重庆市']def handle_municipality(province, city): if province in MUNICIPALITIES: return province return city
这一步保证了最终输出结果在行政层级上更加规范,便于后续合并统计年鉴、城市面板数据或区域政策变量。
四、重要过程与结果展示
1. 输入数据
项目输入端是一份包含地址字段的 Excel 数据。该字段可以是完整地址,也可以是机构名称、园区名称、地标建筑或较为模糊的地理文本。
2. 中间结果:地址转经纬度
第一步运行完成后,项目会生成:
result/地址_带经纬度.csv
该文件的核心作用是把原始地址文本转化为经纬度坐标。
通过这一步,原本无法直接用于空间分析的文本数据,被转化成了可以进入地图软件和计量模型的空间坐标数据。
3. 最终结果:经纬度转行政区划
第二步运行完成后,项目会生成:
result/逆地理编码结果.csv
该文件进一步补充了省、市、区县、街道等字段。
从结果可以看出,项目不仅能够得到经纬度,还能进一步识别出较完整的行政区层级信息。这些字段可以直接用于后续的城市匹配、区县统计、空间可视化和空间计量建模。
4. 后续研究应用
最终得到的空间数据可以继续用于多种实证研究场景:
总体来看,这套工具链完成了从“非结构化地址文本”到“标准空间面板数据”的关键转换。对于需要处理企业地址、机构位置、区域样本和地理文本的研究者来说,它可以显著降低空间数据构建门槛,提高数据处理效率。
案例代码获取:
https://ppmandata.net/codeBase/2065001860015591425