KDTree正在返回半径之外的点

2024-05-17 19:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个lat-long坐标数组,我试图使用KDTree和scipy的query_ball_point返回指定经纬度半径1英里范围内的所有数据点。在

问题是query_ball_point返回的点超出了指定的1英里半径。我的代码是:

import pandas as pd
import scipy as sp
import geocoder
import pysal as psl


search_list = df['coordinates'].tolist()
tree = psl.cg.KDTree(search_list, distance_metric='Arc', radius=psl.cg.RADIUS_EARTH_MILES)
latlong = (39.698840000000004, -104.975916)
index = tree.query_ball_point(latlong,r=1)

结果是一个坐标数组,如下所示:

^{pr2}$

当我试图用哈弗辛公式来验证这些结果时,我看到第一个坐标是1.6英里

from haversine import haversine
haversine((39.676973877551, -104.966231826172),
         (39.698840000000004, -104.975916),miles=True)

1.5961362762187963

Tags: importtreesearchas半径scipy数组query
1条回答
网友
1楼 · 发布于 2024-05-17 19:19:20

Pysal没有使用haversine函数来计算query_ball_point方法的距离。它使用pysal.cg.球体.arcdist函数,这是不同的。在

import pysal
from pysal.cg.kdtree import KDTree    

locations = [(40.702566, -73.816859),
         (40.70546, -73.810708),
         (40.709179, -73.820574),
         (40.700486, -73.807969),
         (40.694624, -73.820593),
         (40.695132, -73.820841),
         (40.694095, -73.821334),
         (40.694165, -73.822368),
         (40.695077, -73.822817),
         (40.6747769261, -73.8092618174)] 
tree = KDTree(locations, distance_metric='Arc', radius=pysal.cg.RADIUS_EARTH_MILES)
current_point = (40.709523, -73.802472)
# get all points within X miles of 'current_point'
indices = tree.query_ball_point(current_point, 1)
for i in indices:
    print(locations[i])

1英里内有3个点

^{pr2}$

根据哈弗辛公式,并非所有这些点都在1英里之内:

from haversine import haversine
for i in indices:
    print(haversine(current_points, locations[i], miles = True))

0.5146716729994124
0.6875825817591269
2.4269297885659022

但根据pysal的arcdist公式,它们在1英里以内,半径为3958.756英里:

^{4}$

相关问题 更多 >