)
Python实战如何用爬虫GeoPy快速生成城市地理距离矩阵附完整代码当我们需要分析城市间的经济联系、物流成本或区域协同效应时地理距离矩阵是不可或缺的基础数据。传统方法往往需要依赖商业GIS软件或现成数据集但今天我将分享一个完全基于Python的开源解决方案——只需50行代码就能从零开始构建城市距离矩阵。1. 技术选型与工具准备在开始编码前我们需要明确技术路线。整个流程可分为三个关键环节数据采集获取城市经纬度坐标距离计算基于球面几何计算城市间距离矩阵构建将计算结果整理为矩阵形式推荐工具组合爬虫库requestsBeautifulSoup或selenium地理计算geopy支持多种距离算法数据处理pandasnumpy安装所需库pip install geopy pandas numpy requests beautifulsoup4提示如果目标网站反爬严格建议使用selenium并设置合理请求间隔。本文示例以静态页面为例。2. 城市坐标数据采集实战以获取全国地级市坐标为例我们选择国家地理信息公共服务平台作为数据源注实际使用时请遵守网站使用条款。这里演示基础爬虫实现import requests from bs4 import BeautifulSoup import pandas as pd def fetch_city_coordinates(): url http://example.com/city-coordinates # 替换为实际数据源 headers {User-Agent: Mozilla/5.0} try: response requests.get(url, headersheaders) soup BeautifulSoup(response.text, html.parser) cities [] for row in soup.select(table tr)[1:]: # 跳过表头 cols row.find_all(td) cities.append({ city: cols[0].text.strip(), province: cols[1].text.strip(), longitude: float(cols[2].text), latitude: float(cols[3].text) }) return pd.DataFrame(cities) except Exception as e: print(f数据获取失败: {e}) return None常见反爬应对策略添加随机请求头设置请求间隔time.sleep(random.uniform(1,3))使用代理IP池模拟浏览器行为需改用selenium3. 距离计算核心算法GeoPy提供了多种距离计算方式我们重点比较两种常用方法算法类型计算方式精度适用场景大圆距离球面最短路径高长距离计算文森特公式椭球体模型极高科研级需求基础实现代码from geopy.distance import geodesic, great_circle def calculate_distance(city1, city2, methodgeodesic): coords1 (city1[latitude], city1[longitude]) coords2 (city2[latitude], city2[longitude]) if method geodesic: return geodesic(coords1, coords2).km else: return great_circle(coords1, coords2).km注意geodesic计算更精确但稍慢对于城市级分析两者差异通常在0.1%以内4. 构建距离矩阵完整方案将上述组件整合形成完整工作流import numpy as np from tqdm import tqdm # 进度条显示 def build_distance_matrix(df_cities): cities df_cities.to_dict(records) n len(cities) matrix np.zeros((n, n)) for i in tqdm(range(n)): for j in range(i1, n): # 利用对称性减少计算量 dist calculate_distance(cities[i], cities[j]) matrix[i][j] dist matrix[j][i] dist return pd.DataFrame(matrix, indexdf_cities[city], columnsdf_cities[city])优化技巧使用对称矩阵特性减少50%计算量添加进度条提升用户体验tqdm保存中间结果避免重复计算5. 性能优化与大规模处理当处理300城市时原始方法可能较慢。以下是优化方案对比优化方法实现复杂度加速比内存消耗多线程★★3-5x低向量化计算★★★10x高Cython编译★★★★20x低向量化计算示例from geopy.vectorized import distance_matrix def fast_distance_matrix(df): coords df[[latitude, longitude]].values return distance_matrix(coords, coords)6. 常见问题与解决方案Q1 坐标数据不准确导致距离偏差解决方案交叉验证多个数据源检查项坐标系是否统一WGS84/GCJ02/BD09Q2 矩阵对角线不为零np.fill_diagonal(matrix.values, 0) # 确保对角线为0Q3 内存不足处理大矩阵分块计算将城市列表分批次处理稀疏矩阵存储对于阈值化后的矩阵如只保留500km的距离7. 进阶应用场景距离矩阵的典型应用方向空间计量经济模型莫兰指数计算空间滞后模型物流路径优化from scipy.sparse.csgraph import floyd_warshall shortest_paths floyd_warshall(distance_matrix)城市群分析基于距离阈值构建邻接矩阵社区发现算法应用实际项目中我曾用这种方法分析过长三角城市群的产业协同效应。通过将距离矩阵与产业数据结合成功识别出3个明显的协同发展子区域。