【问题标题】:Cluster points in PostGISPostGIS 中的聚类点
【发布时间】:2011-09-21 18:51:39
【问题描述】:

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

  1. 获取所有点的数组
  2. 从数组中弹出第一个点
  3. 将第一个点与数组中的所有其他点进行比较,寻找落在 x 距离内的点
  4. 使用原始点和闭合点创建一个簇。
  5. 从数组中移除关闭点
  6. 重复

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

有人可以帮我入门或指出一些有关在 PostGIS 中简单实现此聚类算法的资源吗?

【问题讨论】:

标签: php postgresql geolocation gis postgis


【解决方案1】:

我最终使用了snaptogridavg 的组合。我意识到有一些算法(即 Denis 建议的 kmeans)可以为我提供更好的集群,但对于我正在做的事情来说,这足够快速和准确。

【讨论】:

    【解决方案2】:

    如果在您的浏览器中集群化就足够了,您可以轻松利用 OpenLayer 的集群化功能。有 3 个示例显示了聚类。

    我之前在 PostGIS 数据库中使用过它,只要您没有大量的数据,它就可以非常流畅地运行。

    【讨论】:

    • 我想做集群服务器端以减少客户端的加载时间。不过感谢您的回答。
    【解决方案3】:

    使用 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 的簇数永远不会低于输入行数。

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2014-08-27
      • 2015-11-20
      • 2020-03-03
      • 2015-12-09
      相关资源
      最近更新 更多