Pandas实现指定范围坐标点匹配代码漏点问题排查
需求说明
- 现有两份CSV格式的坐标文件:
- source csv file:存储源坐标数据
- target csv file:存储体量更大的目标坐标数据
- 要实现的逻辑:从target csv文件中,筛选出所有和source csv文件中任意一个坐标点的距离在指定范围内的坐标点
- 坐标格式为
xx.xxxxxx、yy.yyyyyy,字段对应关系:- source csv的坐标列名:
lat1、long1 - target csv的坐标列名:
lat2、long2
- source csv的坐标列名:
现有实现代码
import pandas as pd import numpy as np import time from playsound import playsound fast_df = pd.read_csv('target.csv') # 读取目标坐标文件 el_df = pd.read_csv('source.csv') # 读取源坐标文件 """ pandas操作备注: coords_file.columns - 获取所有列名 coords_file.drop_duplicates() - 删除完全重复的行 coords_flie.iloc[] - 按索引获取指定行 coords_file[['OBJEKT_ID', 'EXTERNID', 'DETALJTYP']] - 提取指定列 """ def findDistance(row, source_lat, source_long): row_lat = row['lat2'] row_long = row['long2'] lat_diff = np.abs(source_lat - row_lat)/0.00001 # 除以0.00001近似将经纬度差转换为米单位 long_diff = np.abs(source_long - row_long)/0.00001 row['Distance'] = np.sqrt(lat_diff**2+long_diff**2) return row def findDistance_(source_coordinates, target_coordinates): lat_diff = np.abs(source_coordinates[0] - target_coordinates[0])/0.00001 # 除以0.00001近似将经纬度差转换为米单位 long_diff = np.abs(source_coordinates[1] - target_coordinates[1])/0.00001 Distance = np.sqrt(lat_diff**2+long_diff**2) easyDistanceReader(Distance) return Distance def easyDistanceReader(Distance): if Distance > 1000: Distance = Distance/1000 print("Distance:", Distance, "km") else: print("Distance:", Distance, "m") def runProgram(target_df, source_df, distans_threshold): """ 遍历source.csv中每个坐标点 --> 匹配target.csv中落在距离阈值内的所有坐标 """ # 提前过滤不在target坐标范围内的源点,减少无效计算 latInterval = min(target_df['lat2']), max(target_df['lat2']) longInterval = min(target_df['long2']), max(target_df['long2']) source_df = source_df.loc[(source_df['lat1'].between(min(latInterval), max(latInterval))) & (source_df['long1'].between(min(longInterval), max(longInterval)))] dataframes = [] start = time.time() for index in range(len(source_df)): row = source_df.iloc[index] source_coordinates = row[['lat1','long1']] indices = [] target_df = target_df.apply(findDistance, args=(row['lat1'],row['long1']), axis=1) relevantTargets = target_df.loc[target_df['Distance'] < distans_threshold] if len(relevantTargets) > 0: indices.append(relevantTargets.index[0]) if len(indices) > 0: new_df = target_df.loc[indices] dataframes.append(new_df) final_df = pd.concat(dataframes) final_df = final_df.loc[:, final_df.columns != 'Distance'].drop_duplicates() print(final_df) end = time.time() print("Elapsed time per iteration:", end-start) final_df.to_csv('final.csv') playsound('audio.mp3') # 传入的300为距离阈值,单位为米 runProgram(fast_df,el_df, 300)
遇到的问题
将距离阈值设置为5000米运行代码后,匹配结果存在明显遗漏:可视化结果中黑色为source点、棕色为target点、粉色为匹配输出的结果点,大量实际满足距离要求的坐标点没有被筛选出来,暂时没定位到问题原因,需要对应的解决思路。
内容的提问来源于stack exchange,提问作者Tobias Lind
相关产品推荐
相关产品推荐

