Обновление от 16 ноября 2012 г.
Я хотел бы снова поднять этот вопрос, предлагая новую щедрость для солидного, хорошего решения. Кажется, что только решение (shubhansh
answer) не работает эффективно. Я объясню, почему.
Во-первых, это живая карта с радиусами и людьми, радиусы находятся в red
, а люди находятся в blue
.
Как вы можете видеть, на этой карте есть люди с two
с радиусами eight
, в основном я получаю только человека, который Person A
, но я не получаю Person B
, я предполагаю, что SQL неправильно подбирает его, для чего мне нужно, чтобы он был точным и точным из радиуса человека и радиусы маркера.
Похоже, что то, что выбрано, находится внутри радиусов, а не тех, кто перекрывает радиус, мне нужно, чтобы он мог получать любые результаты для любых радиусов, которые перекрывают друг друга.
Я ищу точный и точный SQL, чем ответ shubhansh. Вы можете прочитать ниже, чтобы прочитать, как именно мне нужен запрос, чтобы действовать и подбирать точных людей.
Данные PEOPLE:
+-----------+-----------+--------+
| 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');
Старое резюме
Примечание: все широты и долготы просто произвольно сделаны.
У меня есть апплет карты, который пользователь может разместить радиус местоположения lat/lng с радиусом 1 км.
Теперь есть еще один пользователь, который может поместить свои радиусы в любом месте на карте с радиусом 1 км (так же, как пользователь выше).
Подобно этому Пользователь A красный, а Пользовательский B синий.
В основном Пользователь 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, но не только то, что оно мне нужно.
EDIT: я нашел лучший, это очень близко, но все же не то, что я ищу, поскольку он использует 1 границу координат широты и долготы, когда у меня есть несколько в таблице.