Я заинтересован в создании сайта, который будет хранить несколько мест и должен иметь возможность найти их по запросу пользователя. Подобно тому, как функционируют такие сайты, как Yelp, Zomato, Zillow и т. Д. Мой предпочтительный стек технологий — PHP / MySQL.
Тем не менее, у меня есть несколько связанных вопросов. Дана база данных местоположений с их связанными координатами широты / долготы …
Это поможет с вашей первой точкой.
Я использую этот запрос для поиска свойств в моей базе данных по расстоянию от начальной точки. Отправной точкой является долгота и широта, $coordX
а также $coordY
, Я получил это от поиска геокодов в API Карт Google:
SELECT properties.*,
(
( ACOS(SIN(".$coordX." * PI() / 180) *
SIN(coordX * PI() / 180) + COS(".$coordX." * PI() / 180) *
COS(coordX * PI() / 180) * COS((".$coordY." - coordY) *
PI() / 180)) * 180 / PI()) * 60 * 1.1515
)
AS distance
FROM properties
order by distance
В моей таблице я храню координаты координат отдельных свойств в coordX
а также coordY
колонны.
Вот функция MySQL, которая примет две пары широта / долгота и даст вам расстояние в градусах между двумя точками.
Он использует формулу Haversine для расчета расстояния. Поскольку Земля не является идеальной сферой, существует некоторая ошибка вблизи
полюса и экватор.
Чтобы преобразовать в футы, умножьте на (3961 * 5280) 20914080.
РАЗДЕЛИТЕЛЬ $$
СОЗДАТЬ ФУНКЦИЮ haversine
(
lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT
) ВОЗВРАЩАЕТСЯ плавать
НЕТ SQL
DETERMINISTIC
КОММЕНТАРИЙ ‘Возвращает расстояние в градусах на Земле между двумя известными точками широты и долготы. Чтобы получить мили, умножьте на 3961, а км на 6373 ‘
НАЧАТЬ
ВОЗВРАТИТЕ СТЕПЕНИ (ACOS (
COS (RADIANS (lat1)) *
COS (RADIANS (lat2)) *
COS (RADIANS (lon2) — RADIANS (lon1)) +
SIN (RADIANS (lat1)) * SIN (RADIANS (lat2))
));
КОНЕЦ;
РАЗДЕЛИТЕЛЬ;
Добавьте столбцы в свою таблицу адресов для широты и долготы с типом FLOAT (10,6).
Напишите сценарий php, чтобы выполнить поиск по лат / лонгу при сохранении записи.
Затем вы можете сделать выбор по таблице, чтобы получить список адресов с расстояниями. Вы даже можете сортировать
результаты по расстоянию, или ограничить результат в определенном радиусе от опорного местоположения.
SELECT
`street`,
`city`,
`state`,
`zip`,
(haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) as `distance`
FROM `address_table`
WHERE (haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) < 300 // Example for limiting returned records to a raduis of 300 miles.
ORDER BY haversine($ref_location_lat,$ref_location_long,`lat`,`long) DESC; // Don't need actual distance for sorting, just relative distance.