Список типичных задач:
- Расчет расстояния между 2х точек по координатам
- Гео-поиск по базе данных (выборка точек в определенном радиусе)
- Определение текущих координат пользователя
Расчет расстояния между 2х точек
Существует несколько формул для определения расстояний по координатам, более точный результат получается по такой:
dist = 6372797*acos(sin(PI*Lt1/180)*sin(PI*Lt2/180)+ cos(PI*Lt1/180)* cos(PI*Lt2/180)* cos(abs(PI*Lg2/180- PI*Lg1/180)))
где:
Lt1, Lg1 – широта/долгота первой точки
Lt2, Lg2 – широта/долгота второй точки
PI – PI
Гео-поиск по базе данных
У себя в проектах использую MongoDB, соответственно, рецепт поиска для этой базы данных. Прежде всего, нужно произвести несколько подготовительных действий:
- Координаты точек должны находиться в поле типа массив [широта, долгота] в виде чисел с плавающей точкой (строки не годятся)
- Это поле нужно проиндексировать, тип индекса «2d»
Команда создания 2d-индекса выглядит так:
db.<collection>.ensureIndex( { <location field> : "2d" })
Теперь можно поискать ближайшие точки к заданной:
db.<collection>.find( { <location field> : {$near: [lt, lg], $maxDistance: 5} })
Сам по-себе запрос не сложный, нуждается в разъяснении только параметр про максимальную дистанцию. К сожалению, она измеряется не в метрах/километрах/милях, а радианах. Дело осложняется шарообразностью нашей планеты. Строго говоря, количество метров в одном радиане разное на разных широтах. Чем выше широта, тем метров в радиане меньше. К счастью, в большинстве задач поиска близлежащих объектов особой точности не требуется и можно пользоваться примерными коэффициентами. Для наших широт, если ищем в километрах, исходное значение радиуса поиска нужно делить на 111.
Например, ищем все точки в радиусе 5км:
db.<collection>.find( { <location field> : {$near: [lt, lg], $maxDistance: (5/111)} })
Определение текущих координат
С этим все стало просто благодаря HTML5. Если отбросить всякое броузерное старье и упрямых животных, для определения текущего положения пользователя достаточно нескольких строк кода:
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(pos) {
var Coords = [pos.coords.latitude, pos.coords.longitude]
},null,{timeout:60000})
}
… и согласия пользователя, что бы его посчитали.
Надеюсь, эта заметка поможет кому-нибудь создать свой гео-шедевр, а упомянутый в начале статьи микросайт, проезжать без пробок через переезды.
Полезные ссылки:
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий