PostGIS中的集群点

时间:2011-06-24 06:04:52

标签: php postgresql geolocation gis postgis

我正在构建一个应用程序,它从数据库中提取lat / long值并在Google Map上绘制它们。可能有数千个数据点,因此我“聚集”彼此接近的点,因此用户不会被图标所淹没。目前我在应用程序中执行此聚类,使用这样的简单算法:

  1. 获取所有积分数
  2. Pop first point off array
  3. 将第一个点与数组中所有其他点进行比较,寻找落在x距离内的点
  4. 使用原始点和关闭点创建一个簇。
  5. 从数组中删除关闭点
  6. 重复
  7. 现在我发布这是低效的,这也是我一直在研究GIS系统的原因。我已经设置了PostGIS并拥有我的lat& amp;存储在POINT几何对象中的long。

    有人可以让我开始或指点我在PostGIS中简单实现这种聚类算法的一些资源吗?

3 个答案:

答案 0 :(得分:2)

我最终使用了snaptogridavg的组合。我意识到那里有算法(即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中写了一些关于如何进行群集的描述。