Mysql Geo Spatial Search возвращает странные результаты

В настоящее время я пытаюсь настроить пространственный поиск в Mysql и PHP. Для этого я использую формулу haversin, которую я нашел по следующей ссылке:

http://www.notaires.fr/sites/default/files/geo_searchjkkjkj_0.pdf

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

Из одной из записей в моей базе данных я копирую информацию о широте и долготе и использую их для целей тестирования, но я все равно получаю пустой результат. Таким образом, я удалил имеющее утверждение, чтобы посмотреть, какое расстояние фактически получается в результате для моих изображений, и это 4098.9334608610825 для записи в базе данных, откуда я взял координаты.

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

Любая идея или предложения, как я могу решить это? Или, может быть, есть даже намного лучшие способы сделать пространственный поиск, если так, пожалуйста, дайте мне знать (пока не sphinx, потому что я не могу сейчас установить что-либо подобное на своих серверах, так как я не владелец)

введите описание изображения здесь

Здесь вы можете увидеть картинку с моими результатами. Первый результат — запись в базе данных, откуда я взял свои координаты.

Заранее спасибо.

0

Решение

Пытаться

select (acos(sin(radians(@orig_lat)) * sin(radians(latitude)) + cos(radians(@orig_lat)) * cos(radians(latitude)) * cos(radians(longitude) - radians(@orig_lon))) * 6378) as dist

Думаю, я написал это правильно

0

Другие решения

Попробуйте использовать другую версию формулы закона сферического косинуса. Вот это для MySQL:

  DEGREES(ACOS(COS(RADIANS(lat1))
* COS(RADIANS(lat2))
* COS(RADIANS(long1 - long2))
+ SIN(RADIANS(lat1))
* SIN(RADIANS(lat2)))) AS distance_in_degrees

Затем вы можете преобразовать эти градусы в км. Умножьте на 111.045, чтобы сделать это.

Если вам нужна более числовая стабильная версия вычисления большого круга (вы, вероятно, не), попробуйте формулу Винсенти:

DEGREES(
ATAN2(
SQRT(
POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +
POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -
(SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *
COS(RADIANS(lon2-lon1))) ,2)),
SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +
COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))

Это также возвращает расстояние в градусах.

Этот материал написан здесь. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

0

По вопросам рекламы [email protected]