У меня есть широта и долгота, и я хочу извлечь запись из базы данных, которая имеет ближайшую широту и долготу по расстоянию, если это расстояние больше указанного, то не извлекайте его.
Структура таблицы:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
источник
источник
Ответы:
где [starlat] и [startlng] - это позиция, с которой начинается измерение расстояния.
источник
Решение Google:
Создание таблицы
Когда вы создаете таблицу MySQL, вы хотите обратить особое внимание на атрибуты lat и lng. С текущими возможностями масштабирования Google Maps, вам нужно только 6 цифр точности после десятичной дроби. Чтобы сохранить минимальное пространство для хранения вашей таблицы, вы можете указать, что атрибуты lat и lng являются числами с плавающей запятой (10,6). Это позволит полям хранить 6 цифр после десятичной запятой, плюс до 4 цифр перед десятичной запятой, например, -123,456789 градусов. Ваша таблица также должна иметь атрибут id, который будет служить первичным ключом.
Заполнение таблицы
После создания таблицы самое время заполнить ее данными. Приведенные ниже примеры данных приведены для примерно 180 пиццерий, разбросанных по Соединенным Штатам. В phpMyAdmin вы можете использовать вкладку ИМПОРТ для импорта файлов различных форматов, включая CSV (значения, разделенные запятыми). Microsoft Excel и Google Spreadsheets оба экспортируют в формат CSV, так что вы можете легко переносить данные из электронных таблиц в таблицы MySQL через экспорт / импорт файлов CSV.
Поиск локаций с MySQL
Чтобы найти местоположения в таблице маркеров, которые находятся в пределах определенного радиуса от заданной широты / долготы, вы можете использовать инструкцию SELECT на основе формулы Хаверсайна. Формула Хаверсайна обычно используется для вычисления расстояний большого круга между двумя парами координат на сфере. Википедия дает подробное математическое объяснение, а хорошее обсуждение формулы в части, касающейся программирования, находится на сайте Movable Type.
Вот оператор SQL, который найдет ближайшие 20 мест, которые находятся в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы, а затем запрашивает только те строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию и ограничивает его 20 результатами. Для поиска по километрам вместо миль замените 3959 на 6371.
Это найти широты и долготы на расстоянии менее 28 миль.
Другой - найти их на расстоянии от 28 до 29 миль:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
источник
HAVING distance < 25
когда мы запрашиваем местоположения в радиусе 25 миль?Вот мое полное решение, реализованное на PHP.
В этом решении используется формула Хаверсайна, представленная в http://www.scribed.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Следует отметить, что формула Хаверсина испытывает слабости вокруг полюсов. Этот ответ показывает, как реализовать формулу Винсенти Великого расстояния круга, чтобы обойти это, однако я решил просто использовать Haversine, потому что это достаточно хорошо для моих целей.
Я храню широту как десятичное (10,8) и долготу как десятичное (11,8). Надеюсь, это поможет!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Может быть возможно повысить производительность, используя хранимую процедуру MySQL, как предложено в статье «Geo-Distance-Search-with-MySQL», опубликованной выше.
У меня есть база данных ~ 17 000 мест и время выполнения запроса составляет 0,054 секунды.
источник
abs
должно быть удалено. Нет необходимости принимать значение abs при пересчете из градусов в радианы, и, даже если вы это сделали, вы делаете это только на одной из широт. Пожалуйста, отредактируйте его, чтобы исправить ошибку.69
на111,044736
(забыл, что в приведенном выше комментарии)На всякий случай, если вы ленивы, как я, вот решение, объединенное из этого и других ответов на SO.
источник
bounding_distance
представляет? ограничивает ли это значение результаты милей? так что в этом случае он вернет результаты в течение 1 мили?Легко;)
Просто замените координаты на нужные. Значения должны быть сохранены как двойные. Это рабочий пример MySQL 5.x.
ура
источник
dx+dy
Попробуйте это, он покажет ближайшие точки к указанным координатам (в пределах 50 км). Работает отлично:
Просто поменяй
<table_name>
.<userLat>
и<userLon>
Вы можете прочитать больше об этом решении здесь: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
источник
Оригинальные ответы на этот вопрос хороши, но более новые версии mysql (MySQL 5.7.6) поддерживают гео-запросы, поэтому теперь вы можете использовать встроенную функциональность, а не выполнять сложные запросы.
Теперь вы можете сделать что-то вроде:
Результаты возвращаются в
meters
. Так что если вы хотитеKM
просто использовать.001
вместо.000621371192
(что для миль).MySql документы здесь
источник
ST_Distance_Sphere
не существует в установке моего хоста (mysql Ver 15.1 Distrib 10.2.23-MariaDB
). Я читаю где-то, чтобы заменить,ST_Distance
но расстояния далеко.ST_Distance_Sphere
Вы ищете такие вещи, как формула haversine . Смотрите здесь также.
Есть и другие, но это наиболее часто упоминаемые.
Если вы ищете что-то еще более надежное, вам, возможно, захочется взглянуть на возможности ГИС ваших баз данных. Они способны на некоторые интересные вещи, такие как сообщение о том, появляется ли точка (Город) в пределах данного полигона (Регион, Страна, Континент).
источник
Проверьте этот код на основе статьи Geo-Distance-Search-with-MySQL :
Пример: найдите 10 ближайших к моему текущему местоположению отелей в радиусе 10 миль:
источник
источник
Звучит так, будто вы хотите выполнить поиск ближайшего соседа с некоторым ограничением на расстоянии. Насколько мне известно, SQL не поддерживает ничего подобного, и вам необходимо использовать альтернативную структуру данных, такую как R-дерево или kd-дерево .
источник
Найти ближайших пользователей к моему:
Расстояние в метрах
На основании формулы Винсенти
у меня есть таблица пользователя:
SQL:
радиус земли: 6371000 (в метрах)
источник
MS SQL Edition здесь:
источник
Похоже, вы должны просто использовать PostGIS, SpatialLite, SQLServer2008 или Oracle Spatial. Все они могут ответить на этот вопрос для вас с пространственным SQL.
источник
В крайних случаях этот подход не работает, но для производительности я пропустил тригонометрию и просто вычислил диагональный квадрат.
источник
Эта проблема совсем не сложная, но она усложняется, если вам нужно ее оптимизировать.
Я имею в виду, у вас есть 100 мест в вашей базе данных или 100 миллионов? Это имеет большое значение.
Если количество мест невелико, выведите их из SQL в код, просто выполнив ->
Как только вы получите их в код, рассчитайте расстояние между каждым широтой и долготой и вашим оригиналом по формуле Хаверсайна и отсортируйте его.
источник