利用python与百度地图批量获取城市之间的行驶距离

本文记录了一位编程初学者如何利用Python、百度地图API和Excel,解决批量获取全国城市间行驶距离的问题。过程中遇到导入数据、建立OD关系及安装Python库等挑战,最终通过itertools的combinations实现城市配对,并注意到百度API的数据量限制,计划实现分批计算和更新结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于我本人没有任何编程基础,而且设定的目标是爬取全国三百多个城市之间的行驶距离,且目前手头也仅有这些城市的txt,所以今天遇到许多难点。

首先是怎么获取城市之间的行驶距离,其次是怎么将excel导入python,还有就是怎么建立城市之间的od关系(虽然说起来很糗,但真的小白总是流血流泪...),这是主要的三个问题。

当然其他还有很多小问题,比如打开pycharm想要import pandas、itertools啥的,很多都是灰色,最后室友提醒是很多运行包我都没安装。回顾整个历程,从早上九点多到此刻下午四点,总体是非常磕磕绊绊。

Gavin_Sunny的《Python利用百度地图获取两地距离 最详细过程和源代码》这篇文章中的代码为基础,借助了python的itertools中的combinations也就是排列组合最后形成了两个城市之间的od对应关系,最终得到了答案,唯一问题就是运算过程挺慢的,亲测四十个城市计算大概八百条结果,用时八分钟左右。

一开始的准备工作比如申请百度开放平台的ak密钥这一步按下不表,主要运用其中的地点检索服务以及批量算路服务两个web api。

主代码如下:

# 本次整体的源代码
AK = 'NAwGuQe2WmQ7RSdvQIafcZ0Kjnv8Aldc'

# 需要用到的模块:pandas、requests
### OSM路网街景采样点数据获取方法 #### 预处理OSM路网数据 为了准备用于生成街景采样点的OSM路网数据,需要先进行一系列预处理工作。具体来说,城市道路网络和兴趣点(POIs)的数据是从OpenStreetMap(OSM)中获取的[^1]。这些数据包含了研究区域内各类可行驶的道路信息,包括但不限于主干道、次干道以及居住区内部的小巷子。 对于原始下载下来的OSM数据集而言,其中可能含有冗余或不准确的信息,因此有必要对其进行清理优化。这一步骤涉及移除那些带有明显错误标签的道路记录,并通过计算双向车道间的几何平均位置来代替实际存在的两条平行线段表示法,从而减少后续算法复杂度并提高效率。 经过上述调整之后,最终得到一个精简版的城市交通图谱——它由2,004条连接节点构成边界的路径组成;此同时还额外搜集到了3,459处具有代表性的地标建筑作为补充说明材料,用以更好地理解该地区的功能布局特征。 ```python import osmnx as ox G = ox.graph_from_place('Chengdu, China', network_type='drive') ox.plot_graph(G) ``` #### 投影转换至UTM坐标系 当准备好干净整洁的地图框架后,则可以着手考虑如何将之映射到适合进一步操作的空间参照体系内去了。通常情况下会选择采用统一横轴墨卡托投影(Universal Transverse Mercator Projection),也就是常说的UTM坐标系统来进行这项任务。这是因为相比于地理经纬度表达方式而言,前者能够提供更加直观且易于量化的平面直角坐标描述形式[^4]。 利用GIS软件包如ArcGIS中的`Projection`工具即可轻松完成这一过程:只需指定好源文件路径及其对应的输出格式参数选项即可实现自动化批量化作业流程。值得注意的是,在选择具体的带号时要依据目标地点所在的地理位置做出适当的选择,比如成都市就位于北半球第48个分区内。 ```python from pyproj import Transformer transformer = Transformer.from_crs("EPSG:4326", "EPSG:32648") # WGS84 to UTM Zone 48N lon, lat = transformer.transform(latitudes, longitudes) ``` #### 对路网数据进行增密采样 一旦完成了从WGS84椭球面模型向局部笛卡尔坐标的转变以后,就可以针对新产生的矢量图形执行下一步动作了——即按照预定间距沿每一段连线上均匀分布若干个离散化样本点位。这样的做法不仅有助于增加空间分辨率而且还能确保所选取的位置具备足够的代表性以便于后期分析使用[^3]。 借助ESRI ArcToolbox里的`Densify`命令行接口便能快速达成目的:用户只需要设置好待处理的对象层名还有期望达到的最大步长阈值就可以了。这样一来就能自动生成满足条件的一系列中间结点集合供后续调用了。 ```python def densify_road_network(shp_file_path, distance_interval=50): """ Densifies road segments by adding points at specified intervals. :param shp_file_path: Path of the shapefile containing roads data. :param distance_interval: Distance between consecutive sample points (meters). :return: List of sampled point coordinates [(lat1, lon1), ...]. """ from geopandas import read_file gdf = read_file(shp_file_path) samples = [] for line in gdf.geometry: length = int(line.length / distance_interval) + 1 for i in range(length): pt = line.interpolate(i * distance_interval).coords[0] samples.append(pt[::-1]) # Reverse tuple order to match latitude/longitude convention return samples ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值