Расчет дистанции между объектами
Приведу пару примеров расчета расстояния между объектами по заданным координатам
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
Данные примеры рекомендую только для ознакомления с расчетами координат и дистанции.
На больших таблицах запросы ведут себя медленно, так как производится вычисление с каждой строкой в таблице.
Tags: geo ip
Статья сохранена Пятница, Июль 9th, 2010 - 01:08 и находится в Php. Вы можете следить за комментариями используя RSS 2.0 ленту. Вы можете оставить ответ, или ссылку на вашем сайте.
Ответить
Вы должны авторизироватся чтобы оставить комментарий.