SQL-запрос для выбора всех городов, которые, как птица летит, на расстоянии от заданной координаты? - PullRequest
1 голос
/ 20 декабря 2011

В настоящее время я использую этот запрос, чтобы получить город в моей БД, указав координату:

SELECT *
FROM citiesTable
WHERE latitude  >= ? AND latitude  <= ?
  AND longitude >= ? AND longitude <= ?;

Этот код работает хорошо, и я хочу, но иногда запрос ничего не соответствует ... Поэтому в этом случае я бы поставил птицу на расстоянии этого запроса, чтобы получить соседний город.
Любое предложение о том, как я могу это сделать?

1 Ответ

0 голосов
/ 20 декабря 2011

При поиске «расстояния от долготы и широты» была получена ссылка на http://www.movable -type.co.uk / scripts / latlong.html , в которой указан код для расчета расстояния:

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

Еще пару минут поиска привели к http://www.movable -type.co.uk / scripts / latlong-db.html

Эта страница переполнена информацией,Вот простое (но неэффективное) решение, при условии, что ваш город находится на $lon,$lat, а $R равен 6371 (что в км), и, наконец, вы хотите, чтобы города находились в пределах $rad вашего города:

Select ID, Postcode, Lat, Lon, 
       acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))*cos(radians(Lon)-$lon))*$R As D
From MyTable 
Where acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))*cos(radians(Lon)-$lon))*$R < $rad
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...