如何编写代码批量对比住宅与餐饮场所位置并计算最近距离?
批量计算住宅与最近餐饮场所的距离方案
实现思路
用Python的pandas做批量数据处理,结合geopy计算地理球面距离,自动为每栋住宅匹配最近的餐饮场所及对应距离,完全无需手动逐一对比。
基础实现代码(适用于中小数据量)
import pandas as pd from geopy.distance import geodesic # 加载住宅和餐饮位置数据(假设为CSV格式,需包含latitude、longitude列) df_residential = pd.read_csv('residential_locations.csv') df_restaurants = pd.read_csv('restaurant_locations.csv') def find_nearest_restaurant(res_lat, res_lon): min_distance = float('inf') nearest_info = None # 遍历所有餐饮场所计算距离 for _, rest_row in df_restaurants.iterrows(): rest_coords = (rest_row['latitude'], rest_row['longitude']) res_coords = (res_lat, res_lon) # 计算球面距离,单位为公里(可指定miles改为英里) distance = geodesic(res_coords, rest_coords).km if distance < min_distance: min_distance = distance # 保存最近餐饮的信息(可根据需求添加ID、地址等字段) nearest_info = { 'nearest_restaurant': rest_row.get('name', 'Unnamed'), 'restaurant_lat': rest_row['latitude'], 'restaurant_lon': rest_row['longitude'], 'distance_km': round(min_distance, 2) } return nearest_info # 批量应用到所有住宅 nearest_results = df_residential.apply( lambda x: pd.Series(find_nearest_restaurant(x['latitude'], x['longitude'])), axis=1 ) # 合并原数据与结果并保存 final_result = pd.concat([df_residential, nearest_results], axis=1) final_result.to_csv('residential_nearest_restaurant.csv', index=False)
大数据量优化方案
如果餐饮场所数据量超过1万条,逐行遍历效率会下降,可使用空间索引(rtree库)加速最近邻查找:
import pandas as pd from geopy.distance import geodesic from rtree import index df_residential = pd.read_csv('residential_locations.csv') df_restaurants = pd.read_csv('restaurant_locations.csv') # 构建餐饮场所的空间索引(注意rtree坐标顺序为:经度,纬度) spatial_index = index.Index() for idx, row in df_restaurants.iterrows(): spatial_index.insert(idx, (row['longitude'], row['latitude'], row['longitude'], row['latitude'])) def find_nearest_with_index(res_lat, res_lon): # 查找最近的1个餐饮场所索引 nearest_rest_idx = list(spatial_index.nearest((res_lon, res_lat), 1))[0] rest_row = df_restaurants.iloc[nearest_rest_idx] distance = geodesic((res_lat, res_lon), (rest_row['latitude'], rest_row['longitude'])).km return { 'nearest_restaurant': rest_row.get('name', 'Unnamed'), 'restaurant_lat': rest_row['latitude'], 'restaurant_lon': rest_row['longitude'], 'distance_km': round(distance, 2) } # 批量计算并保存结果 optimized_results = df_residential.apply( lambda x: pd.Series(find_nearest_with_index(x['latitude'], x['longitude'])), axis=1 ) final_optimized_result = pd.concat([df_residential, optimized_results], axis=1) final_optimized_result.to_csv('residential_nearest_restaurant_optimized.csv', index=False)
关键注意事项
- 确保经纬度数据为十进制格式(例如
39.9042,而非度分秒格式) geopy.geodesic计算的是球面距离,比平面直线距离更符合实际地理场景- 若需使用更精确的道路距离,可结合地图API,但需注意调用限制与密钥问题
内容的提问来源于stack exchange,提问作者Leonard Lee
相关产品推荐
相关产品推荐

