Расчет дистанции между объектами

Приведу пару примеров расчета расстояния между объектами по заданным координатам

SELECT * ,  ( 3959 * acos( cos( radians(47) ) * cos( radians( latitude ) ) * cos( radians( longitude ) – radians( 35 ) ) + sin( radians( 47 ) ) * sin( radians( latitude ) ) ) ) AS distance  FROM sometable ORDER BY distance

Данный запрос возвращает все строки в таблице отсортированные  в порядке удаления от точки с заданными координатами.

3959 используется для вычисление дистанции в милях,  для вычисление дистанции в километрах нужно использовать 6371
в SQL запросе 47=это широта, 35- долгота в градусах.

Для получения строк с координатами объектов, удаленных от заданной точки на определеннорм расстоянии, нужно:

SELECT * ,  ( 3959 * acos( cos( radians(47) ) * cos( radians( latitude ) ) * cos( radians( longitude ) – radians( 35 ) ) + sin( radians( 47 ) ) * sin( radians( latitude ) ) ) ) AS distance  FROM sometable HAVING distance < 25 ORDER BY distance

Данный запрос возвратит только строки с объектами которые находятся ближе 25 миль от заданной точки (в километрах нужно 3959 заменить на 6371 )

Заменив знак < на > получите объекты которые дальше искомой точки не менее чем на 25 миль.

А используя LIMIT в запросе можно ограничивать количество возвращаемых объектов

Например LIMIT 0,1 вернет самый ближний, LIMIT 0,20 вернет 20 объектов.

Данные запросы используют формулу haversine  – частный случай более общей формулы сферической тригонометрии, подробнее о формуле тут http://en.wikipedia.org/wiki/Haversine_formula

И еще несколько расчетов тут http://www.movable-type.co.uk/scripts/latlong.html

Данные примеры рекомендую только для ознакомления с расчетами координат и дистанции.

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

Share and Enjoy:
  • Digg
  • Facebook
  • Twitter
  • Google Bookmarks
  • Live
  • MySpace

Tags:

Ответить

Вы должны авторизироватся чтобы оставить комментарий.