Получение результатов, попадающих в радиусы маркеров, из базы данных

Обновление от 16 ноября 2012 г.

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

Во-первых, это моя живая карта с радиусами и людьми, радиусы есть вredи люди вblue.

enter image description here

Как видите, естьtwoлюди на этой карте сeightрадиусы, в основном я получаю только человека, которыйPerson A, но я не получаюPerson B, я предполагаю, что SQL неправильно улавливает его, что мне нужно, чтобы он был точным и точным по радиусу человека и радиусам маркера.

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

Я ищу точный и точный SQL, чем ответ Шубханша. Вы можете прочитать ниже, чтобы узнать, как именно мне нужен запрос, чтобы действовать и подбирать точных людей.

Данные, ЛЮДИ:

+-----------+-----------+--------+
| latitude  | longitude | radius |
+-----------+-----------+--------+
| 51.517395 | -0.053129 | 5.6    |
| 51.506607 | -0.116129 | 0.7    |
+-----------+-----------+--------+

Обратите внимание, что radiusуказывается в километрах.

+-----------+-----------+-----+
| latitude  | longitude | km  |
+-----------+-----------+-----+
| 51.502117 | -0.103340 | 0.3 |
| 51.498913 | -0.120850 | 0.7 |
| 51.496078 | -0.108919 | 0.7 |
| 51.496506 | -0.095873 | 0.7 |
| 51.503399 | -0.090723 | 0.7 |
| 51.508049 | -0.100336 | 0.7 |
| 51.508797 | -0.112610 | 0.7 |
| 51.505535 | -0.125227 | 0.7 |
| 51.502331 | -0.108061 | 0.7 |
+-----------+-----------+-----+

Текущий SQL, который я использую:

SELECT ppl.latitude,
       ppl.longitude,
       ppl.radius
FROM 
(
    people ppl
),
(
    SELECT latitude, longitude 
    FROM radiuses
) AS radius
WHERE (POW((ppl.longitude - radius.longitude) * 111.12 * COS(ppl.latitude), 2) + POW((ppl.longitude - radius.longitude) * 111.12, 2)) <= 4
GROUP BY ppl.id

Данные для MySQL, которые вы можете использовать для проверки вашего запроса,

INSERT INTO radiuses (id, latitude, longitude, km) VALUES ('1', '51.502117', '-0.103340', '0.3'), ('2', '51.498913', '-0.120850', '0.7'), ('3', '51.496078', '-0.108919', '0.7'), ('4', '51.496506', '-0.095873', '0.7'), ('5', '51.503399', '-0.090723', '0.7'), ('6', '51.508049', '-0.100336', '0.7'), ('7', '51.508797', '-0.112610', '0.7'), ('8', '51.505535', '-0.125227', '0.7'), ('9', '51.502331', '-0.108061', '0.7');

INSERT INTO people (id, latitude, longitude, radius) VALUES ('1', '51.517395', '-0.053129', '5.6'), ('2', '51.506607', '-0.116129', '0.7');

Старое резюме

Примечание:все широты и долготы просто случайным образом сделаны.

У меня есть апплет карты, в котором пользователь может разместить свой радиус местоположения широты/долготы с радиусом 1 км.

Теперь есть еще один пользователь, который может размещать свои радиусы в любом месте на карте, каждый с радиусом 1 км (, как и пользователь выше ).

Например, Пользователь A — красный, а Пользователь B — синий.

enter image description here

В основном Пользователь A хранит свои радиусы в таблице, которая выглядит следующим образом:

+-----------+---------+-----------+-----------+
| radius_id | user_id | latitude  | longitude |
+-----------+---------+-----------+-----------+
|         1 |       1 | 81.802117 | -1.110035 |
|         2 |       1 | 81.798272 | -1.144196 |
|         3 |       1 | 81.726782 | -1.135919 |
+-----------+---------+-----------+-----------+

И Пользователь B сохраняет свой радиус в другой таблице, которая выглядит так-(обратите внимание :они могут хранить только 1 координату на аккаунт):

+---------+-----------+-----------+
| user_id | latitude  | longitude |
+---------+-----------+-----------+
|       6 | 81.444126 | -1.244910 |
+---------+-----------+-----------+

Я хочу иметь возможность выбирать тех пользователей, которые попадают в определенные радиусы, даже если круги радиуса соприкасаются, на изображении карты. Только маркер Cсможет определить один радиус, тогда как Aи Bэтого не делают.

Я уверен, что это возможно, но я не знаю, как придумать такую ​​систему в MySQL.

Я нашел это на сайте разработчиков Google, это близко, но не только то, что мне нужно.

РЕДАКТИРОВАТЬ:Я нашел лучший, это очень близко, но все же не то, что я ищу, так как он использует 1 границу координат широты и долготы, когда у меня есть несколько в таблице.

20
задан Community 23 May 2017 в 12:33
поделиться