#python-3.x #gps #latitude-longitude #knn
#python-3.x #gps #широта-долгота #knn
Вопрос:
у меня есть набор данных, который содержит местоположения gps (lon, lat) и poi (lon, lat), и я хочу (код python) найти ближайшие точки для всех точек gps ко всем местоположениям poi в пределах региона 500,1000,2000 метров.
я попробовал следующее:
knn в python, но это отнимает много времени (преобразуйте ponits в utm)
геометрия.расстояние (но я не могу сделать это в пределах набора точек GPS и местоположений poi)
я нашел это решение в sql: но я хочу решение на python моя проблема в том, как получить ближайшее расстояние между набором точек gps и коллекцией Poi
SELECT z.zip,
z.primary_city,
z.latitude, z.longitude,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.latitude))
* COS(RADIANS(p.longpoint) - RADIANS(z.longitude))
SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.latitude)))) AS distance_in_km
FROM zip AS z
JOIN ( /* these are the query parameters */
SELECT 42.81 AS latpoint, -70.81 AS longpoint,
50.0 AS radius, 111.045 AS distance_unit
) AS p ON 1=1
WHERE z.latitude
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint (p.radius / p.distance_unit)
AND z.longitude
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY distance_in_km
LIMIT 15
Ответ №1:
чтобы ускорить процесс, было бы неплохо выполнить некоторые подготовительные работы с вашими данными. Обратите внимание, что есть несколько способов решить эту проблему. Я предполагаю, что вам нужно простое решение без использования сторонних библиотек (PostGIS и геопространственные индексы могут здесь очень помочь).
-
Если количество точек относительно невелико, вы могли бы рассмотреть возможность предварительного вычисления всех расстояний, сохраните его в таблице с обеими точками в качестве первичного ключа и расстояния. Быстро, но занимает много места, и это неудобно, если ваш набор данных очень динамичен.
-
Другой подход, который вы могли бы использовать, — это сгруппировать ваши точки в плитки. Если вы сохраните эту информацию вместе со своими точками, это позволит вам рассматривать только близлежащие фрагменты. Таким образом, у вас будет гораздо меньше точек для вычисления.
-
Вы можете ускорить сами вычисления. В вашем конкретном коде я вижу, что вы постоянно преобразуете свои координаты в радианы. Таким образом, вы могли бы рассмотреть возможность сохранения их в радианах, чтобы вам не нужно было выполнять одно и то же вычисление снова и снова.
Комментарии:
1. как я могу это сделать в post gis