Мой вопрос довольно прост. В настоящее время я изучаю и изучаю, как использовать PHP и MySQL вместе с Google API, чтобы пользователи на моем сайте могли выполнять поиск по конкретным городам, а также получать результаты поблизости. Я буду продолжать изучать это самостоятельно, но я хотел бы проверить свою базу данных на будущее, чтобы она могла быть реализована позже.
Поэтому, если у меня есть пользователи, отправляющие свой почтовый индекс при регистрации, я знаю, что могу использовать API или функцию, чтобы получить широту и долготу, и затем я могу сохранить эту информацию в своем собственном столбце, например ‘lat_lng’ (также zip код будет иметь свой собственный столбец).
БОЛЬШОЙ ВОПРОС: Как я могу отформатировать столбец lat / long, чтобы позже я смог реализовать возможность поиска по близости. Пример: столбец lat_lng одного пользователя может читаться как «41.854301, -71.193893» с запятой, разделяющей широту и долготу. У других пользователей будут другие номера, но достаточно ли этого для более поздней настройки поиска близости?
Вы ищете топологическую или дистанционную сортировку по точкам. Вы хотите иметь возможность рассчитать расстояние между двумя точками или местами. Формулы ниже дают расстояние с разной точностью. Выберите тот, который дает желаемую точность. Каждому из них понадобится отдельный лат и долг, поэтому держите их в отдельных столбцах, чтобы упростить операторы 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
Других решений пока нет …