我正在构建一个应用程序,它从数据库中提取lat / long值并在Google Map上绘制它们。可能有数千个数据点,因此我“聚集”彼此接近的点,因此用户不会被图标所淹没。目前我在应用程序中执行此聚类,使用这样的简单算法:
现在我发布这是低效的,这也是我一直在研究GIS系统的原因。我已经设置了PostGIS并拥有我的lat& amp;存储在POINT几何对象中的long。
有人可以让我开始或指点我在PostGIS中简单实现这种聚类算法的一些资源吗?
答案 0 :(得分:2)
我最终使用了snaptogrid和avg的组合。我意识到那里有算法(即Denis建议的kmeans)会给我更好的聚类但是对于我正在做的事情来说这是快速和准确的。
答案 1 :(得分:1)
如果将足够的内容集中在浏览器中,您可以轻松利用OpenLayer的群集功能。有3个示例显示了聚类。
之前我曾在PostGIS数据库中使用它,只要你没有大量的数据,它就会非常流畅。
答案 2 :(得分:1)
使用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
窗口函数的Common Table Expression,以确保提供给ST_ClusterKMeans
的簇数永远不会低于输入行数。
我在Postgis here中写了一些关于如何进行群集的描述。