Клуб API Карт

Выборка геообьектов в области (прямоугольник) на стыках положительных и отрицательных координат.

anti_KILLER
30 ноября 2013, 16:26

Приветствую. У меня есть задача - вывести все геообьекты в видимой области карты. Сами нужные геообьекта уже хранятся в БД. На сервер я отправляю текущий zoom  (нужен для фильтрации обьектов) и координаты видимой области (метод getBounds() карты).
На сервере я делаю выборку примерно таким sql запросом:

 

SELECT * FROM table WHERE pos1 between ? and ? AND

                                                pos2 between ? and ?
Всё работает хорошо до тех пор, пока не встречается область содержация отрицательные геоординаты. Например есть обьект Япония  - координаты 36.084019, 139.198506. Если у нас область с bounds:
bounds [0][0] 18.482050970110727
bounds [0][1] 118.0743365962805
bounds [1][0] 47.18077880536414
bounds [1][1] 175.73058659628046,
то всё нормально.

Однако, сместив карту чуть восточнее мы получим такую область:
bounds [0][0] 13.295487860148489
bounds [0][1] 125.28136784628049
bounds [1][0] 43.398477486772904
bounds [1][1] -177.0623821537195
и в эту область, уже Япония не выбирается sql запросом, хотя на карте эту точку видно.
Если брать значения по модулю, то начнутся аналогичные проблемы с западной европой (обьекты будут не видны) при переходе области за нулевой меридиан. Если же не брать значения по модулю, то в западной европе всё нормально, но проблема на востоке.

Подскажите пожалуйста как корректно сделать выборку из БД, чтобы не было подобных "глюков". Мне на ум приходят только костыльные решения разной степени бредовости, типа определенения с какие именно стороны земного шара попадают в область и в зависимости от этого брать значения по модулю или не по модулю. Но мне кажется что умные люди до меня уже решили эту проблему нормальным способом, просто мне наяндексить это решение не удалось.
Спасибо.

2 комментария
Подписаться на комментарии к посту

Мне думается что Spatial extensions как раз для этого и написаны

Да уж, самое очевидное и не заметил - не знал о таком типе полей и таких возможностях в mysql. Спасибо.