我正在构建一个从数据库中提取经/纬度值并将其绘制在Google Map上的应用程序。可能有成千上万个数据点,所以我将点“聚集”在一起,因此用户不会被图标淹没。目前,我在应用程序中使用以下简单算法执行此集群:
现在我发布这效率低下,这就是我一直在研究GIS系统的原因。我已经设置了PostGIS,并将经纬度存储在POINT几何对象中。
有人可以让我入门或为我提供一些有关在PostGIS中对该聚类算法进行简单实现的资源吗?
我最终使用snaptogrid和avg的组合。我意识到有一些算法(如Denis所建议的kmeans)可以为我提供更好的聚类,但对于我正在做的事情,它足够快且准确。
如果足以将内容聚类到浏览器中,则可以轻松利用OpenLayer的聚类功能。有3个示例显示聚类。
我以前在PostGIS数据库中使用过它,只要您没有大量的数据,它就可以很流畅地工作。
[PostGIS将lonlat
类型的st_point
点聚类的示例。结果集将包含(cluster_id,id)对。簇数是传递给ST_ClusterKMeans
的参数。
WITH sparse_places AS (
SELECT
lonlat, id, COUNT(*) OVER() as count
FROM places
)
SELECT
sparse_places.id,
ST_ClusterKMeans(lonlat::geometry, LEAST(count::integer, 10)) OVER() AS cid
FROM sparse_places;
我们需要具有COUNT
窗口函数的公用表表达式,以确保提供给ST_ClusterKMeans
的簇的数量永远不会低于输入行的数量。
我写了一些关于在Postgis here中如何进行聚类的描述。