Странный результат от запроса в пределах расстояния от Широты / Долготы

0

Мне нужна помощь здесь с запросом на поиск записей с определенным радиусом точки (lat/lng). Запрос отлично подходит для поиска записей, которые не слишком близки к фактическому центру. Таким образом, он может найти вещи в радиусе 400 миль, но не 20.

Я использую MySQL. Вот запрос:

select id , lat , lng , ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122.517349) ) + sin( radians(37.780182) ) * sin( radians( lat ) ) ) ) AS distance FROM my_table HAVING distance < 1000 ORDER BY distance LIMIT 0 , 50

И вот небольшой набор данных:

    lat           lng
|  0.000000 |    0.000000 |
| 37.223465 | -122.090363 |
| 39.320980 | -111.093735 |
| 38.031715 |  -84.495132 |
| 37.787144 | -122.493263 |
| 52.975361 |   -1.458620 |
| 40.848557 | -111.906883 |
| 40.572498 | -111.859718 |

И отправной точкой моего центра является Сан-Франциско, который является лат /lng 37.787144, -122.493263

И поэтому ни один из близлежащих lat/lng не может быть найден.

Спасибо, Alex

Теги:
geolocation

3 ответа

1
Лучший ответ

В вашем операторе select (37, -122.517349, 37.780182) есть жестко закодированные значения, которые не соответствуют вашей центральной точке.

  • 0
    Да, в конце концов это был мой недосмотр .. упс :)
0

после работы с этим я сделал учебник и инструмент, который преобразует адрес в lat/lng. Может быть, это будет полезно: http://www.comehike.com/utils/address_to_geolocation.php

0

Это, вероятно, поможет быть последовательным в том, является ли широта 37 или 37.780182.

Что теоретическая основа для acos (cos (LAT0) * cos (LAT1) * cos (LNG1 - LNG0) + sin (LAT0) * sin (LAT1)))? Если вы моделируете глобус как сферу, то вам нужен acos (точечный продукт 3D-вложения), который является acos (cos (LAT0) * cos (LAT1) + sin (LAT0) * sin (LAT1) * (cos (LNG0 ) * cos (LNG1) + sin (LNG0) * sin (LNG1))).

  • 0
    Формула Genadinik исходит из сферического закона косинусов и требует меньше оценок триггера, чем формула, которую вы даете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню