首页 新闻 赞助 找找看

批量经纬度距离计算问题

0
悬赏园豆:100 [已解决问题] 解决于 2022-10-28 08:07

需求:两张含经纬度的表A,B,需要找到距离A表内各点2km范围的B表的经纬度清单,如A表中point1,找到B表中距离point1 2km范围内的点
遇到的问题:处理时间太长,现在A表有10万、B表有25万。我处理一遍得17分钟,希望能缩短处理时间
编程能力:只会简单的python

如下是我丑陋的代码:

import pandas as pd
import numpy as np
from datetime import datetime
from math import radians, cos, sin, asin, sqrt

df5 = pd.read_csv('cell.csv',encoding='gbk')
df4 = pd.read_csv('cell_all.csv',encoding='gbk')

def fun3(df5,df4,group=20,interval=0.15,dis=2000):
    result1 = pd.DataFrame()
    
    df4 = df4.sort_values('Longitude')
    df5 = df5.sort_values('Longitude')
    df4['t'] = 1
    df5['t'] = 1
    
    n = 0
    nmax = df5.shape[0]
    for i in range(nmax//group+1):
        start = n
        end = n+group
        if end > nmax:
            end = nmax
        df51 = df5.iloc[start:end]

        df4_lon_max = df51.Longitude.max()+0.15
        df4_lon_min = df51.Longitude.min()-0.15
        df4_lat_max = df51.Latitude.max()+0.15
        df4_lat_min = df51.Latitude.min()-0.15 

        df41 = df4[(df4['Longitude']>df4_lon_min) & (df4['Longitude']<df4_lon_max) & (df4['Latitude']<df4_lat_max) & (df4['Latitude']>df4_lat_min)]
        df45 = pd.merge(df51,df41,how='left',on='t')
        df_array = df45.values
        df_np = np.insert(df_array, -1, values=list(map(lambda x: haversine(x[1], x[2], x[5], x[6]), df_array)), axis=1)
        df = pd.DataFrame(df_np)
        df.columns = ['point_x', 'Longitude_x', 'Latitude_x', 't', 'point_y', 'Longitude_y','dis', 'Latitude_y']

        df = df[(df['dis'] < dis)]
        
        if n==0:
            result1 = df
        else:
            result1 = pd.concat([result1,df])
    return result1

fun3(df5,df4,20,0.15,2000)

Wall time: 16min 45s
1775184 rows × 8 columns

尝试过将group设为10/20/30/40/50,但貌似越大越慢,所以目前就定在20.麻烦大神帮忙指点指点

猪头33的主页 猪头33 | 初学一级 | 园豆:14
提问于:2022-10-27 08:33
< >
分享
最佳答案
0

我自己造的测试数据试了下,不是特别好写(提问里看不出你的耗时代码行区间是哪些);

        df41 = df4[(df4['Longitude']>df4_lon_min) & (df4['Longitude']<df4_lon_max) & (df4['Latitude']<df4_lat_max) & (df4['Latitude']>df4_lat_min)]

如果这是你目前的瓶颈,我用的是矩阵求解,但是没有测太大数据量的效果

"""
假设 df1、df2 数据包含以下经纬
74,    33.2
71.46, 27.7
69.32, 35.42
75.06, 24,
74.11, 16.64
73.37, 18.73
56.63, 26.9
"""
from scipy.spatial import distance_matrix

...

min_distance = 15
tmp = distance_matrix(df1, df2)  # 求出 df1、df2 的所有距离
idx = np.where(tmp<min_distance)  # 比对距离边界,获取原始数据索引

你自己试下

收获园豆:100
〆灬丶 | 老鸟四级 |园豆:2287 | 2022-10-27 15:18

我看了下,您这个计算貌似不是距离?比如haversine(118.829712,28.954829,119.91846,28.88096)距离是106285米,而distance_matrix(df1, df2)计算结果为1.09125104km?

瓶颈在haversine距离计算上,我需要拿到符合条件的表A的name/lon/lat,对应的表B的name/lon/lat,还有距离,表的格式如下:
name lon lat
p1 118.829712 28.954829
p2 118.829712 28.954829
p3 118.830528 28.963094
p4 118.830528 28.963094
p5 118.830924 28.966679

猪头33 | 园豆:14 (初学一级) | 2022-10-27 17:46

@猪头33:
我这个是 欧氏距离,和你的 haversine 球体计算有点偏差;你看看链接里的优化能不能用
https://www.javaroad.cn/questions/151139

〆灬丶 | 园豆:2287 (老鸟四级) | 2022-10-31 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册