Поиск близости с MySQL Future-Proof

Мой вопрос довольно прост. В настоящее время я изучаю и изучаю, как использовать PHP и MySQL вместе с Google API, чтобы пользователи на моем сайте могли выполнять поиск по конкретным городам, а также получать результаты поблизости. Я буду продолжать изучать это самостоятельно, но я хотел бы проверить свою базу данных на будущее, чтобы она могла быть реализована позже.

Поэтому, если у меня есть пользователи, отправляющие свой почтовый индекс при регистрации, я знаю, что могу использовать API или функцию, чтобы получить широту и долготу, и затем я могу сохранить эту информацию в своем собственном столбце, например ‘lat_lng’ (также zip код будет иметь свой собственный столбец).

БОЛЬШОЙ ВОПРОС: Как я могу отформатировать столбец lat / long, чтобы позже я смог реализовать возможность поиска по близости. Пример: столбец lat_lng одного пользователя может читаться как «41.854301, -71.193893» с запятой, разделяющей широту и долготу. У других пользователей будут другие номера, но достаточно ли этого для более поздней настройки поиска близости?

0

Решение

Вы ищете топологическую или дистанционную сортировку по точкам. Вы хотите иметь возможность рассчитать расстояние между двумя точками или местами. Формулы ниже дают расстояние с разной точностью. Выберите тот, который дает желаемую точность. Каждому из них понадобится отдельный лат и долг, поэтому держите их в отдельных столбцах, чтобы упростить операторы SQL-запросов.

Для нахождения «близлежащих» точек по заданному геолокации (широта, долгота) используется одна из двух известных формул: формула haversine (популярная, поскольку она дает точные результаты с меньшим количеством значащих цифр) и формула закона косинусов (см. moveable-type.org объяснение fpr).

Формула haversine,

a = sin² (Δφ / 2) + cos φ1 ⋅ cos φ2 ⋅ sin² (Δλ / 2)

c = 2 ⋅ atan2 (√a, √ (1 − a))

d = R ⋅ c

где φ — широта, λ — долгота, E — радиус Земли (6371,010 км); обратите внимание, что для тригонометрических функций необходимо преобразовать углы в радианы.

Закон косинусов:

d = acos (sin φ1 ⋅ sin φ2 + cos φ1 ⋅ cos φ2 ⋅ cos Δλ) ⋅ E

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

х = Δλ ⋅ cos φm

у = Δ

d = E ⋅ √x² + y²

Тем не менее, более грубое приближение использует расстояние Манхэттен (расстояние N-S улицы),

d = E * (abs (x) + abs (y)) / √2

0

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

Других решений пока нет …

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