Запрос БД для местоположений в области

Я заинтересован в создании сайта, который будет хранить несколько мест и должен иметь возможность найти их по запросу пользователя. Подобно тому, как функционируют такие сайты, как Yelp, Zomato, Zillow и т. Д. Мой предпочтительный стек технологий — PHP / MySQL.

Тем не менее, у меня есть несколько связанных вопросов. Дана база данных местоположений с их связанными координатами широты / долготы …

  1. Как они могут запрашивать свою базу данных местоположений и возвращать те, которые находятся на расстоянии X от определенного города или почтового индекса?
  2. Кроме того, как они могут запрашивать в своей базе данных местоположения, которые вместо того, чтобы находиться в непосредственной близости, находятся в очень определенных пределах города или штата? Откуда они получают свои данные границ и как вы определяете, находится ли координата в пределах этой границы эффективным способом?
  3. Наконец, я замечаю, что на некоторых сайтах есть ссылки на свой город. Я ожидал, что городские данные будут извлекаться из API удаленного отображения, но они часто связывают изображения и другой контент с этими городами. Хранят ли эти сайты названия всех городов в собственной базе данных? Где они получают свой список?

0

Решение

Это поможет с вашей первой точкой.

Я использую этот запрос для поиска свойств в моей базе данных по расстоянию от начальной точки. Отправной точкой является долгота и широта, $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 колонны.

0

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

Вот функция MySQL, которая примет две пары широта / долгота и даст вам расстояние в градусах между двумя точками.
Он использует формулу Haversine для расчета расстояния. Поскольку Земля не является идеальной сферой, существует некоторая ошибка вблизи
полюса и экватор.

  • Чтобы преобразовать в мили, умножьте на 3961.
  • Чтобы перевести в километры, умножьте на 6373.
  • Чтобы преобразовать в метры, умножьте на 6373000.
  • Чтобы преобразовать в футы, умножьте на (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.
0

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