2012年11月16日更新
私はこの質問をもう一度提起し、堅実で優れた解決策のための新しい恩恵を提供したいと思います。現在、解決策(shubhansh
の答え)だけが効果的に機能していないようです。その理由を説明します。
まず、これは私が持っている半径と人のライブマップです。半径はにred
あり、人はにありblue
ます。
ご覧のとおりtwo
、このマップにはeight
半径のある人がいます。基本的には、その人だけを取得していますが、Person A
取得Person B
していません。SQLが正しく取得していないため、正確にする必要があります。人の半径とマーカーの半径から正確です。
ピックアップされるのは半径の内側にあるように見えますが、半径が重なっているものではありません。互いに重なっている半径の結果をピックアップできるようにする必要があります。
shubhanshの答えよりも正確で正確な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');
古い要約
注:すべての緯度と経度はランダムに作成されます。
私は、ユーザーが半径1kmの緯度/経度の場所の半径を配置できるマップアプレットを持っています。
現在、マップ上の任意の場所に、それぞれ半径1kmの半径を配置できる別のユーザーがいます(上記のユーザーと同じ)。
このように、ユーザー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でこの種のシステムを考え出す方法がわかりません。
私はこれをGoogleDevelopersサイトで見つけました。これは近いですが、必要なパフォーマンスだけではありません。
編集:私はより良いものを見つけました、これは非常に近いですが、それでも私が探しているものではありません。テーブルに複数ある場合、緯度と経度の座標の1つの境界を使用するからです。