通过X和Y坐标计算给定半径内的点数

问题描述 投票:0回答:2

我有一个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 中以最简单的方式工作吗?

python scikit-learn coordinates kdtree radius
2个回答
0
投票

对于您给出的随机坐标,您应该使用欧几里得几何

tree = BallTree(coords, metric='euclidean')

Haversine 需要输入特定的弧度坐标。您用作测试的这些值在这种情况下没有意义。

查了一下:半正矢可以通过纬度(-90到90)和/或经度(-180到180)值乘以pi / 180来计算。这意味着它不能大于大约1.5和3.14


0
投票

您遇到的问题是因为 BallTree 与 haversine 度量一起使用,该度量设计用于计算 球面 上的距离,通常与经度和纬度坐标一起使用。但是,在您的情况下,您正在使用 笛卡尔坐标 (X, Y),应使用 欧几里得距离

您应该替换这一行:

tree = BallTree(coords, metric='haversine')

与:

tree = BallTree(coords, metric='euclidean')
© www.soinside.com 2019 - 2024. All rights reserved.