PostGIS中的集群点

问题描述 投票:8回答:3

我正在构建一个从数据库中提取经/纬度值并将其绘制在Google Map上的应用程序。可能有成千上万个数据点,所以我将点“聚集”在一起,因此用户不会被图标淹没。目前,我在应用程序中使用以下简单算法执行此集群:

  1. 获取所有点的数组
  2. 弹出第一点关闭数组
  3. 将第一个点与数组中的所有其他点进行比较,以寻找x距离之内的点
  4. 创建具有原始和封闭点的聚类。
  5. 从数组中删除闭合点
  6. 重复

现在我发布这效率低下,这就是我一直在研究GIS系统的原因。我已经设置了PostGIS,并将经纬度存储在POINT几何对象中。

有人可以让我入门或为我提供一些有关在PostGIS中对该聚类算法进行简单实现的资源吗?

php postgresql geolocation gis postgis
3个回答
2
投票

我最终使用snaptogridavg的组合。我意识到有一些算法(如Denis所建议的kmeans)可以为我提供更好的聚类,但对于我正在做的事情,它足够快且准确。


1
投票

如果足以将内容聚类到浏览器中,则可以轻松利用OpenLayer的聚类功能。有3个示例显示聚类。

我以前在PostGIS数据库中使用过它,只要您没有大量的数据,它就可以很流畅地工作。


0
投票

[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中如何进行聚类的描述。

© www.soinside.com 2019 - 2024. All rights reserved.