ここに私が基本的に達成したいものの写真があります:
タイトルが示すように、半径(たとえば25Kms)である長点/緯度点を、長点/緯度点のバウンディングボックス内にマージしたいと考えています。
これが私の非常に単純なDB構造です。
+-------+-------------+------------+
| id | long | lat |
+-------+-------------+------------+
| 1 | -90.27137 | 50.00702 |
| 2 | -92.27137 | 52.00702 |
| 3 | -87.27137 | 48.00702 |
| 4 | -91.27137 | 51.00702 |
+-------+-------------+------------+
これまでの私のクエリは次のとおりです。
set @bottom_lat = -100.27137;
set @bottom_lon = 40.00702;
set @top_lat = -80.27137 ;
set @top_lon = 60.00702 ;
;
SELECT AVG(latitude), AVG(longitude)
FROM destination
WHERE latitude > @bottom_lat AND longitude > @bottom_lon AND latitude < @top_lat AND longitude < @top_lon
したがって、私のクエリは、半径を考慮せずに、架空の境界ボックス内のすべてのポイントをマージするだけです。
私は、Haversine 式を使用しなければならない可能性が高いことを知っていますが、数学と MySQL が苦手で、物事が少し難しくなっています。確かに、半径が 1 つしかない場合でも最終的にポイントをマージできますが、各ポイントには独自の半径があり、苦労しています。
これは学生のプロジェクトのためのものであり、どんな助けも非常に高く評価されます。
参考文献:
- SQL Fiddle に関する私のクエリ: http://sqlfiddle.com/#!2/3a42b/2 (コメントに Haversine Formula の SQL Fiddle の例が含まれています)
-MySQL クエリの Haversine 式: (指定された半径内のすべてのポイントをチェックするために機能します)
SELECT*, ( 6371* acos( cos( radians(
@my_lat) ) * cos( radians(
destination.latitude ) ) * cos( radians(
destination.longitude ) - radians(
@my_lon) ) + sin( radians(
@my_lat) ) * sin( radians(
destination.latitude ) ) ) ) AS distance
FROM destination
ORDER BY distance limit 1
;