我有一个python代码,当给定数据框中的点列表(X和Y坐标对)和指定的圆半径时,我希望代码经过每个点,将其视为圆的中心,并找出圆圈选择内还有多少个其他点。
环顾四周,我看到有人建议使用经度和纬度的类似问题可以通过 SciKit-Learn 的 BallTree 来解决,所以我已经尝试过,但没有得到我期望的答案。我的代码如下:
import numpy as np
import pandas as pd
from sklearn.neighbors import BallTree
df = pd.DataFrame({'id':list('abcde'),'X': [10, 1000, 1010, 5000, 5100],'Y': [10, 1000, 1010, 5000, 5100]})
radius = int(input('Enter the selection radius of the circle:'))
coords = df[["X","Y"]]
tree = BallTree(coords, metric='haversine')
answers = tree.query_radius(coords, r=radius, count_only=True)
print(answers)
例如,当我执行
radius = 100
时,我得到的答案为[1 1 1 1 1]
,这是不正确的。有什么想法如何让它在 python 中以最简单的方式工作吗?
对于您给出的随机坐标,您应该使用欧几里得几何
tree = BallTree(coords, metric='euclidean')
Haversine 需要输入特定的弧度坐标。您用作测试的这些值在这种情况下没有意义。
查了一下:半正矢可以通过纬度(-90到90)和/或经度(-180到180)值乘以pi / 180来计算。这意味着它不能大于大约1.5和3.14
您遇到的问题是因为 BallTree 与 haversine 度量一起使用,该度量设计用于计算 球面 上的距离,通常与经度和纬度坐标一起使用。但是,在您的情况下,您正在使用 笛卡尔坐标 (X, Y),应使用 欧几里得距离。
您应该替换这一行:
tree = BallTree(coords, metric='haversine')
与:
tree = BallTree(coords, metric='euclidean')