sql查询:特定区域中的集群lat lng,按点排序

时间:2012-03-05 23:49:45

标签: mysql

我有这个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

非常感谢任何输入。感谢

2 个答案:

答案 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的方法有很多种。最简单的是莫顿曲线。