Выберите координаты, которые находятся в радиусе центральной точки? - PullRequest
9 голосов
/ 16 октября 2011

У меня есть база координат в схеме:

ID: Широта: Долгота: Название: убывание

Я настроил свое приложение Google Maps для эффективного отображения маркеров на экране. Однако мне нужно добавить еще одну функцию, с помощью которой пользователь может просматривать все указатели, которые попадают в радиус от центральной точки.

Как бы я написал SQL-оператор вида:

Select all pointers that fall within a 10 mile radius of X & Y

Ответы [ 2 ]

22 голосов
/ 16 октября 2011

SQL, приведенный ниже, должен работать:

SELECT * FROM Table1 a 
WHERE (
          acos(sin(a.Latitude * 0.0175) * sin(YOUR_LATITUDE_X * 0.0175) 
               + cos(a.Latitude * 0.0175) * cos(YOUR_LATITUDE_X * 0.0175) *    
                 cos((YOUR_LONGITUDE_Y * 0.0175) - (a.Longitude * 0.0175))
              ) * 3959 <= YOUR_RADIUS_INMILES
      )

Это основано на сферическом законе косинусов, для более подробной информации по этой теме, ознакомьтесь с этой статьей - http://www.movable -типа.co.uk/scripts/latlong.html

2 голосов
/ 16 октября 2011

Возможно, вам нужно сделать это в два этапа. Выберите точки, которые лежат в пределах 20-мильного квадрата с центром в X, Y. Предполагая, что вы сначала вычислите верхнюю, левую и нижнюю правую координаты квадрата, вы можете получить все точки внутри квадрата из базы данных с помощью:

select * from coordinates where longitude < right and longitude > left and 
latitude < top and latitude > bottom;

Второй шаг - посмотреть, находится ли набор точек внутри круга радиусом 10 миль. На этом этапе у меня будет соблазн использовать карты Google для вычисления расстояния между точками и центром вашего квадрата с помощью функции google.maps.geometry.spherical.computeDistanceBetween(from:LatLng, to:LatLng, radius?:number). Проверьте ответ менее 10 миль. Эта функция по умолчанию использует радиус Земли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...