2012-03-05 4 views
2

私はこのMySQLのテーブルを有する:
CREATE TABLE markers
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY、
lat FLOAT(10、6)NULL NOT、
lng FLOAT(10,6)NOT NULL
)ENGINE = MYISAM;以下のデータを
SQLクエリ:特定の領域におけるLNG LATクラスタ、点順

 
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 

私は最寄りの場所を取得する方法を知っている:

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

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

クワッドキーまたはgeohashを使用して空間データをクラスタリングできます。クワッドキーはマップを細分するのに使用されますが、それを使って関心のあるポイントをクラスタリングすることもできます。クワッドキーやジオハッシュを計算する方法はたくさんあります。最も簡単なのはモルソンカーブです。

+1

geohash私を助けましたhttps://github.com/nowelium/geohash-mysql-func – david

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; 
関連する問題