Получить результаты, которые попадают в радиус маркеров из базы данных
Я хотел бы снова поднять этот вопрос, предлагая новую награду за солидное, хорошее решение. Кажется, что только решение (shubhansh
's answer) не работает эффективно сейчас. Я объясню почему.
Во-первых, у меня есть карта в реальном времени с радиусами и людьми, радиусы вred
и люди вblue
.
Как видите, естьtwo
люди на этой карте сeight
радиусы, в основном я получаю только человека, которыйPerson A
, но я не получаюPerson B
Я предполагаю, что SQL не правильно его подхватывает, и мне нужно, чтобы он был точным и точным, исходя из радиуса человека и радиуса маркера.
Похоже, что они находятся внутри радиусов, а не тех, которые перекрывают радиус, мне нужно, чтобы он мог получать любые результаты для любых радиусов, которые перекрывают друг друга.
Я ищу точный и точный SQL, чем ответ Шубханша. Вы можете прочитать ниже, чтобы прочитать, как именно мне нужен запрос, чтобы действовать и подбирать точных людей.
Данные,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');
Old summary
Note: все широты и долготы сделаны случайным образом.
У меня есть апплет карты, который пользователь может разместитьradius широта / долгота, с радиусом 1 км.
Теперь есть другой пользователь, который может поставить свойradiuses, в любом месте на карте, каждое с радиусом 1 км (так же, как пользователь выше).
Как этоUser A красный иUser B синий.
В принципеUser 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 |
+-----------+---------+-----------+-----------+
А такжеUser B сохраняет его радиус в другой таблице, которая выглядит следующим образом - (примечание: они могут хранить только 1 координату на учетную запись):
+---------+-----------+-----------+
| user_id | latitude | longitude |
+---------+-----------+-----------+
| 6 | 81.444126 | -1.244910 |
+---------+-----------+-----------+
Я хочу иметь возможность выбирать тех пользователей, которые попадают в определенные радиусы, даже если радиусы соприкасаются, на рисунке карты. Только маркерC
сможет подобрать единый радиус, когдаA
а такжеB
не делайте.
Я уверен, что это возможно, но я не знаю, как создать такую систему в MySQL.
Я нашел это на сайте разработчиков Google, он близок, а не только то, что он мне нужен.
Creating a Store Locator with PHP, MySQL & Google MapsEDIT: Я нашел лучший вариант, это очень близко, но все еще не то, что я ищу, поскольку он использует 1 границу координат широты и долготы, когда у меня есть несколько в таблице.
Select points from a database by latitude/longitude within a bounding circle