2014-11-06 4 views
0

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

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

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

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

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

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

enter image description here

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

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

ответ

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 

Think I writed правильно

+0

Благодарим вас за быстрый ответ. На самом деле этот возвращает от 6608.442268294232: -/Я понятия не имею, что пойдет не так :-( – Velixir

+0

Эта формула работает для меня, можно проверить пример в следующем URL-адресе: http://www.suhogar.info/residencias/ 4-303/Almeria/Almeria Может быть неправильное значение orig_lat или orig_lan, что может вызвать ошибку? – sergio0983

+0

orig_lat: 135.674151 orig_long: 34.833236 Это то, что я использую для orig_lat и orig_long, которые являются координатами в формате, который Приложение iOS поддерживает его для моего Rest api для его хранения – Velixir

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.

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

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

Большое спасибо :-) Я пробовал, но результат в километрах еще 6592.286252411423 даже для записи, где я использовал широту и долготу: -/сохраняемые координаты сохраняются в формате, который дает iOS назад, если вы используете CLLocationManager, поэтому для моей записи, которую я пытаюсь сделать, это будет: широта: 135.674151 долгота: 34.833236 Если это поможет – Velixir

Смежные вопросы