我有这个mysql表:
CREATE TABLE
markers
(
id
INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
lat
FLOAT( 10, 6 ) NOT NULL ,
lng
FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;
以下数据:
lat lng id 37.0010 -122.0010 1 37.0020 -122.0020 2 37.1010 -122.1010 3 37.1020 -122.1020 4 37.1030 -122.1030 5 37.2010 -122.2010 6 38.9000 -123.9000 7 38.9010 -123.9010 8
我知道如何到达最近的地点:
markers
来自http://code.google.com/intl/en/apis/maps/articles/phpsqlsearch.html
但如果在特定距离内有更多的点,如何聚类那些最近的位置? 我想要的是这个结果:
newlat newlng count_points 37.1020 -122.1020 3 37.0015 -122.0015 2 37.2010 -122.2010 1
非常感谢任何输入。感谢
答案 0 :(得分:1)
SELECT
id,
( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance,
COUNT(*) as count_points
FROM markers
GROUP BY newlat, newlng
HAVING distance < 25
ORDER BY distance ASC, count_points DESC
LIMIT 0 , 20;
答案 1 :(得分:0)
您可以使用quadkey或geohash来聚类空间数据。四元组通常用于细分地图,但您也可以使用它来聚类感兴趣的点。计算quadkey或geohash的方法有很多种。最简单的是莫顿曲线。