найти ближайшие точки GPS в poi местах в Python - PullRequest
0 голосов
/ 12 марта 2019

У меня есть набор данных, который содержит местоположения gps (lon, lat) и poi (lon, lat), и я хочу (код python) найти ближайшие точки для всех точек gps ко всем местоположениям poi в пределах области 500, 1000, 2000метра.

я попробовал следующее:

knn в python, но это отнимает много времени (преобразовать ponits в utm)

geopy.distance (но я не могу этого сделатьв пределах набора точек 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 Ответ

0 голосов
/ 13 марта 2019

, чтобы ускорить процесс, возможно, было бы неплохо подготовить некоторые данные. Обратите внимание, что есть несколько способов решения этой проблемы. Я предполагаю, что вы хотите простое решение без использования сторонних библиотек (PostGIS и геопространственные индексы могут быть здесь очень полезны).

  1. Если количество точек относительно невелико, вы можете заранее рассчитать все расстояния, сохранить их в таблице с обеими точками в качестве первичного ключа и расстояния. Быстро, но занимает много места, и это не удобно, если ваш набор данных очень динамичный.

  2. Другой подход, который вы можете использовать, - это сгруппировать ваши очки в плитки. Если вы храните эту информацию вместе с вашими очками, это позволяет вам учитывать только соседние плитки. Поэтому у вас будет гораздо меньше очков для расчета.

  3. Вы можете ускорить сами расчеты. В вашем конкретном коде я вижу, что вы постоянно переводите свои координаты в радианы. Поэтому вы можете хранить их в радианах, чтобы вам не приходилось делать одни и те же вычисления снова и снова.

...