2014-08-29 2 views
0

У меня есть таблица, которая содержит события и местоположение с использованием MySQL POINT(X,Y) as geocodedLocation, и я пытаюсь использовать поиск по радиусу по этим данным сейчас, я нашел, что должно было быть ответом здесь https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql. Я видел это раньше, и, видимо, это ответ от Google для использования Locations ServicesPHP MySQL Найти событие в пределах диапазона Lat/Lng

У меня есть 2 зоны, которые должны быть собирание события

Area 1 = `Array ([0] => 51.524074 [1] => -0.1005592)` 
Area 2 = `Array ([0] => 53.818391 [1] => -1.4714507)` 

У меня есть некоторые события

Event 1 `geocodedLocation` = POINT(-1.54907739999999, 53.8007554) 
Event 2 `geocodedLocation` = POINT(-0.100559200000021, 51.524074) 

Да, знаю, что POINT - это неправильный путь, но я не создал его, и мне просто нужно его использовать.

Теперь это вопрос я бегу

SELECT a.* 
    ,(
     3959 * acos(cos(radians(51.524074)) * cos(radians((
         SELECT Y(`geocodedLocation`) 
         ))) * cos(radians((
         SELECT X(`geocodedLocation`) 
         )) - radians(- 0.1005592)) + sin(radians(51.524074)) * sin(radians((
         SELECT Y(`geocodedLocation`) 
         )))) 
     ) AS distance 
    ,COUNT(*) AS pagedAmount 
FROM Activities a 
HAVING distance < 10 
ORDER BY a.startTime ASC 

Как вы можете видеть, я использую расположение Area 1, событие Event 2 на этом месте только немного более точным, но по какой-то причине запроса не дает результата Event 2

+0

удалить COUNT (*) в качестве pagedAmound части и обмена выберите X и выберите Y, так как ваши значения точки являются наоборот, и вы хорошо идти! второе событие будет отображаться, когда расстояние больше 168 – Markus

+0

, оно обратное. Я использую Y как Lat и X как долго. зачем удалять счетчик? –

ответ

0

не уверен, что вы хотите подсчитать, если его общее количество событий, то вы должны поместить подзапрос в свой выбор, но если вы хотите подсчитать количество возвращаемых строк, запрос php для этого типа

$row_cnt = mysqli_num_rows($result); 

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

SELECT a.* 
    ,(3959 * acos(cos(radians(51.524074)) * cos(radians((
         SELECT Y(`geocodedLocation`) 
         ))) * cos(radians((
         SELECT X(`geocodedLocation`) 
         )) - radians(- 0.1005592)) + sin(radians(51.524074)) * sin(radians((
         SELECT Y(`geocodedLocation`) 
         )))) 
     ) AS distance 
    ,COUNT(*) AS pagedAmount 
FROM Activities a 
GROUP BY distance 
HAVING distance < 200 
ORDER BY a.startTime ASC; 

EDIT

немного рытье в MySQL показал что объект точки будет хранить широту и долготу как

Point(lon, lat) 

поэтому первоначальный заказ, как я сделал abov e дает вам правильные расстояния!

+0

Рамка, в которой я работаю, всегда добавляет счет (*) для подкачки, не возиться с каркасом, только строя сверху. что касается того, что я пробовал свой путь, первое расстояние было километров, так как я получал расстояние от 4976 из uk из моего текущего местоположения .... –

+0

извините, мои плохие ваши X и Y правы, но я все еще получение результата для события 2 в моем [sqlfiddle] (http://sqlfiddle.com/#!2/f000d5/3) – Markus

0

У меня есть аналогичный запрос в одном из моих проектов. Модифицированный к вашей конкретной ситуации это должно быть его:

SELECT a.*, (3959 * 
      acos(cos(radians(51.524074)) * 
        cos(radians((SELECT Y(`geocodedLocation`)))) * 
        cos(radians((SELECT X(`geocodedLocation`))) - 
         radians(-0.1005592)) + sin(radians(51.524074)) * 
        sin(radians((SELECT Y(`geocodedLocation`)))))) AS distance 
FROM Activities a HAVING distance < 10 ORDER BY a.startTime 
Смежные вопросы