You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas实现指定范围坐标点匹配代码漏点问题排查

需求说明
  • 现有两份CSV格式的坐标文件:
    • source csv file:存储源坐标数据
    • target csv file:存储体量更大的目标坐标数据
  • 要实现的逻辑:从target csv文件中,筛选出所有和source csv文件中任意一个坐标点的距离在指定范围内的坐标点
  • 坐标格式为xx.xxxxxx、yy.yyyyyy,字段对应关系:
    • source csv的坐标列名:lat1、long1
    • target csv的坐标列名:lat2、long2
现有实现代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:09:16