В базе данных есть таблица location :

id | latitude | longitude
---| -------- | --------
1  | 45.0000  | 90.0000
...

Поэтому я могу использовать SQL для запроса местоположений, которые мне нужны:

SELECT id FROM location 
WHERE latitude BETWEEN min_latitude AND max_latitude
AND longitude BETWEEN min_longitude AND max_longitude;

Где min_latitude, max_latitude, min_longitude, max_longitude означают 4 границы на 1 км рядом с current_location.

Теперь я хочу знать, как я могу получить min_latitude, max_latitude, min_longitude, max_longitude с помощью current_location?

enter image description here

Я видел ответ на этот вопрос: Как чтобы получить ближайший район из списка мест?, если их слишком много allLocations , я не думаю, что это хорошее решение.

0
Mil0R3 18 Фев 2014 в 19:29
 – 
Wain
18 Фев 2014 в 19:34

1 ответ

Лучший ответ

Имейте в виду, что ваш желаемый подход с max и min lat / lon выбирает строки, которые находятся внутри прямоугольника от текущей позиции, а не внутри круга, как предлагает диаграмма.
Проблема в том, что продольная дельта в градусах меняется с широтой на заданном расстоянии. Этот код упрощает Землю в идеальную сферу.

    double centerLat = 45.0;
    double centerLon = 90.0;

    double d = 1000; // desired distance in meters

    double angle = 45 * M_PI / 180; // 45 degrees in radians
    double oneDegree = 111319.9; // distance in meters from degree to degree at the equator

    double maxLat = centerLat + (d / oneDegree) * sin(angle);
    double maxLon = centerLon + (d / (oneDegree*(cos(centerLat * M_PI / 180)))) *  cos(angle);
    double minLat = centerLat - (d / oneDegree)* sin(angle);
    double minLon = centerLon - (d / (oneDegree*(cos(centerLat * M_PI / 180)))) *  cos(angle);
2
user3071962 19 Фев 2014 в 01:53
1
Привет, как получить константу double oneDegree = 111319.9?
 – 
Mil0R3
20 Фев 2014 в 10:12
Я поискал это в википедии :-). Это то, что вы получите, если разделите окружность Земли на 360.
 – 
user3071962
20 Фев 2014 в 13:09