Как найти ближайшее местоположение с использованием широты и долготы из базы данных 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, как я могу найти ближайшее место с места Сурхет.

Solutions Collecting From Web of "Как найти ближайшее местоположение с использованием широты и долготы из базы данных sql?"

Поиск мест поблизости с MySQL

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

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

 id,name,address,lat,lng 

ПРИМЕЧАНИЕ. Здесь широта = 37 и долгота = -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; 

Здесь вы можете найти подробности.

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;

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

Чтобы найти близлежащее местоположение, вы можете использовать класс геокодера. Поскольку у вас есть Геопотоки (широта и долгота), можно использовать обратное геокодирование. Обратное геокодирование – это процесс преобразования координаты (широты, долготы) в (частичный) адрес. Проверьте это для получения дополнительной информации.

У SQL проблемы. В таблице:

 `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 
 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']; 

Когда метод должен выполнить, лучше сначала фильтровать по широте и долготе, а затем вычислить квадратное расстояние, приближенное. Для стран Северной Европы он составит около 0,3 процента в пределах 1000 км.

Таким образом, вместо калькуляции G расстояние как:

 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, а затем просто удалите квадратный корень из результата.

 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 – расстояние в км.

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