Как найти ближайшее местоположение, используя широту и долготу из базы данных SQL?

Я хочу найти ближайшее местоположение из следующей таблицы базы данных

Address                            Latitude                longitude 

Kathmandu 44600, Nepal              27.7                   85.33333330000005
Los, Antoniterstraße                37.09024               -95.71289100000001
Sydney NSW, Australia               49.7480755             8.111794700000019
goa india                           15.2993265             74.12399600000003

Я получил это все данные из карт Google. Здесь я должен найти ближайшее место от места. Предположим, я нахожусь на месте Сурхета, его широта равна 28,6, а долгота равна 81,6, Как я могу найти ближайшее место от места Surkhet.

 Damien_The_Unbeliever20 июн. 2012 г., 08:44
@ Дагон - я полагаю, вы имеете в видуother оставил?
 Suresh Kamrushi18 дек. 2015 г., 08:06
Подробный блог:goo.gl/oU7Krf
 user55784620 июн. 2012 г., 21:56
@Damien_The_Unbeliever эм я живу в южном полушарии, слева от вас ваше право :-)
 Sandeep Nair20 июн. 2012 г., 06:47
Я считаю, что вам нужно сделать что-то вроде геопространственного поиска. Пожалуйста, посмотрите эту статьюscribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
 user55784620 июн. 2012 г., 06:46
Вы смотрели наrelated ссылки слева & gt; & gt; & gt; некоторые из них смотрят на тему для вас.

Ответы на вопрос(7)

вы можете использоватьGeocoder Класс. Так как у вас есть, Geopoints (широта и долгота), обратное геокодирование. Reverse Geocoding это процесс преобразования (широта, долгота) координаты в (частичный) адрес. Проверять, выписыватьсяэтот для дополнительной информации.

лучше сначала отфильтровать по широте и долготе, а затем рассчитать квадрат расстояния приблизительно. В скандинавских странах он будет примерно на 0,3% ниже в пределах 1000 км.

Таким образом, вместо расчета расстояния как:

dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)

можно вычислить приблизительное значение (предположим, что lat = lat 1 близко к lat 2) как

const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)

Порядок Dist_App 2, а затем просто уберите квадратный корень из результата.

Finding locations nearby with MySQL

Вот оператор SQL, который найдет ближайшие 20 местоположений в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы, а затем запрашивает только те строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию и ограничивает его 20 результатами. Для поиска по километрам вместо миль замените 3959 на 6371.

Структура таблицы:

id,name,address,lat,lng

ПРИМЕЧАНИЕ. - Здесь широта = 37 & amp; долгота = -122. Так что вы просто передаете свое.

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;

Вы можете найти деталиВот.

 20 июн. 2012 г., 06:54
И пройди через это. Это все хорошо объясняет.developers.google.com/maps/articles/phpsqlsearch
 20 июн. 2012 г., 07:15
Смотрите примечание. Я отредактировал свой ответ. Вы должны передать свой лат & amp; вместо 37 & amp; -122,
 Krishna Karki20 июн. 2012 г., 07:06
Большое спасибо за запрос. Я должен найти ближайшее местоположение из Сурхета, широта которого составляет 28,6, а долгота равна 81,6. Как включить этот пункт в этот запрос .. Пожалуйста, предложите мне .. :)
 Krishna Karki20 июн. 2012 г., 09:16
ВЫБЕРИТЕ адрес, lng, SQRT (POW (69.1 * (шир. -21.0486), 2) + POW (69.1 * (76.5344 - lng) * COS (шир. / 57.3), 2)) AS расстояние от partner_locations Расстояние HAVING & lt; 25000 Заказ по расстоянию Я нашел этот запрос .. Он работает правильно .. Но я не уверен насчет единицы расстояния ... Это километры или мили ... Можете ли вы предложить мне, пожалуйста, пожалуйста
 20 июн. 2012 г., 07:41
Это работает для вас? И также имейте в виду, что я использовал 3959, он будет искать по милям. Если вы хотите выполнить поиск по км, измените его на 6371.
sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];

`ubicacion` (
  `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
  `latitud` DOUBLE NOT NULL ,
  `longitud` DOUBLE NOT NULL ,
  PRIMARY KEY (`id_ubicacion`) )

Id_ubicacion изменяется при использовании:

SELECT  `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
Решение Вопроса

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Это лучший запрос

 10 авг. 2017 г., 22:15
Можете ли вы сказать нам, если это нормально работает для тысяч записей. Поблагодарить
 06 авг. 2013 г., 13:40
Да. 3959 - Мили, 6371 - Километры
 02 дек. 2012 г., 18:37
расстояние 25 вот в милях ??
 07 сент. 2015 г., 23:49
@ Кришна Карки, вернет ли это лат и долг, если я включу его в работу?
 07 февр. 2016 г., 22:44
Расстояние от куда?
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) +
    POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

[starlat] а также[startlng] это позиция, с которой начинается измерение расстояния, а 25 - это расстояние в км.

Рекомендуется сделать хранимую процедуру для использования запроса, потому что он будет проверять множество строк, чтобы найти результат.

Ваш ответ на вопрос