У меня есть код Python, где при наличии списка точек (пар координат X и Y) в фрейме данных и заданного радиуса круга я бы хотел, чтобы код проходил через каждую точку, рассматривая ее как центр круга и найдите, сколько еще точек находится внутри выделенного круга.
Оглядываясь вокруг, я видел, как люди предлагают подобную проблему с использованием долготы и широты, которую можно решить с помощью BallTree от SciKit-Learn, поэтому я попробовал это, но не получаю ожидаемых ответов. Мой код ниже:
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 позволяет создавать сценарии для автоматизации задач и обработки данных.
Для случайных координат, которые вы указали, вы должны использовать евклидову геометрию.
tree = BallTree(coords, metric='euclidean')
Хаверсинусу необходимо ввести определенные радианные координаты. Эти значения, которые вы использовали в качестве проверки, не имеют смысла в данном контексте.
После поиска: хаверсинус можно вычислить путем деления значения широты (от -90 до 90) и/или долготы (от -180 до 180), умноженного на число пи / 180. Это означает, что оно не может быть больше, чем примерно 1,5 и 3,14.
Проблема, с которой вы столкнулись, заключается в том, что BallTree используется с метрикой хаверсинуса, которая предназначена для вычисления расстояний на сферической поверхности и обычно используется с координатами долготы и широты. Однако в вашем случае вы работаете с декартовыми координатами (X, Y), где вместо этого следует использовать евклидово расстояние.
Вам следует заменить эту строку:
tree = BallTree(coords, metric='haversine')
С:
tree = BallTree(coords, metric='euclidean')