PostGIS--空间聚合的使用案例

简介: 以PostGIS2.4版本说明,当前PostGIS已经提供了4种空间聚类的方法,列表如下:ST_ClusterDBSCANST_ClusterIntersectingST_ClusterKMeansST_ClusterWithin本文简单用图形化的方式简述一下这几种方法如何使用。

以PostGIS2.4版本说明,当前PostGIS已经提供了4种空间聚类的方法,列表如下:

  • ST_ClusterDBSCAN
  • ST_ClusterIntersecting
  • ST_ClusterKMeans
  • ST_ClusterWithin
    本文简单用图形化的方式简述一下这几种方法如何使用。

一 ST_ClusterDBSCAN

ST_ClusterDBSCAN是一个窗口函数,基于DBSCAN算法,返回每一个输入的2D图形所在“簇”的id。
定义:integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
参数说明:
geom:输入的2d图形对象。
eps:输入图形之间的距离如果小于eps规定的距离,他们就被化为同一“簇”。
minpoints:每个“簇”中图形最小数量。

使用说明:

# 查询buildings的面图层中,建筑之间距离小于20米(0.0002是度,约20米)分类,且每一类中数量不少于2。
gis_cluster=# SELECT gid,name, ST_ClusterDBSCAN(geom, eps:= 0.0002, minpoints := 2) 
over () AS cid FROM buildings;

gid |     name     | cid
-----+--------------+-----
   1 |              |
   2 |              |   2
   3 |              |   2
   4 |              |   2
   5 | 大洋百货     |
   6 | 商茂世纪广场 |   0
   7 | 华威大厦     |   2
   8 | 天安保险大厦 |   2
   9 |              |   2
  10 |              |
  11 | 江苏交通大厦 |   2
  12 | 阳光大厦     |
  13 |              |   0
  14 |              |   2
  15 |              |   2
  16 |              |   2
  17 |              |   2
  18 |              |   1
  19 |              |   1
  20 |              |   2
  21 |              |   2
  22 |              |   2
  23 |              |   2
  24 |              |   2
  25 |              |   2
  26 |              |   2
  27 |              |   2
-- More  --

可视化效果如下:


img_784d6df1001c0079884a61e6f86f9473.png
ST_ClusterDBSCAN.png

-1的是不属于任何“cluster”的图形,也就是查询中cid是null的数据,其他的数据都有自己的所属“cluster”的id值,即cid值。

二 ST_ClusterIntersecting

ST_ClusterIntersecting是一个聚合函数,返回一个GeometryCollections数组,每个数组中的geom都是直接或间接能相交的图形。
定义:geometry[] ST_ClusterIntersecting(geometry set g);
参数说明:
g:一组几何图形。
使用说明:
测试表中数据可视化如下:


img_dc9d6da652c7d9c7b0fbec79afcf6f6b.png
测试数据buildings3.png
gis_cluster=# select st_astext(unnest(ST_ClusterIntersecting(geom))) from buildings2;

                                                                                          st_astext                                                                                                                                                                                                                                                                         
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 GEOMETRYCOLLECTION(POLYGON((118.77376608689 32.0424742122357,118.774542742962 32.0416518705121,118.773994515147 32.0411036426964,118.773172173423 32.0418802987687,118.77376608689 32.0424742122357)),POLYGON((118.774222943403 32.0429310687489,118.775898083951 32.0413320709528,118.775456455989 32.0407838431371,118.774542742962 32.0416518705121,118.77376608689 32.0424742122357,118.774222943403 32.0429310687489)),POLYGON((118.775898083951 32.0413320709528,118.777055453785 32.0402813009728,118.776629054372 32.0397635302578,118.775456455989 32.0407838431371,118.775898083951 32.0413320709528)))
 GEOMETRYCOLLECTION(POLYGON((118.771192461866 32.0393066737446,118.772684859809 32.0389259599839,118.772258460397 32.0379208756551,118.770705148252 32.0383320465169,118.771192461866 32.0393066737446)),POLYGON((118.772258460397 32.0379208756551,118.772684859809 32.0389259599839,118.774375228908 32.0384234178194,118.773964058046 32.0375097047933,118.772258460397 32.0379208756551)))
 GEOMETRYCOLLECTION(POLYGON((118.776766111326 32.0381188468106,118.778045309563 32.0377076759488,118.778167137966 32.0373117336375,118.777695052903 32.0366721345192,118.776080826556 32.0371746766835,118.776766111326 32.0381188468106)),POLYGON((118.778700137232 32.0380274755081,118.779857507065 32.0373878763897,118.779461564754 32.0368853342252,118.778730594333 32.0369614769774,118.778167137966 32.0373117336375,118.778045309563 32.0377076759488,118.778700137232 32.0380274755081)))
(3 行记录)

已有数据被划分成了三类如下:


img_e1fe1e9e49b4d45e47743daef65ef220.png
分类结果.png

聚合函数只返回了图形的集合出来,没带上记录的标记,该方法最好也能将记录的id返回比较好用。

三 ST_ClusterKMeans

ST_ClusterKMeans:均值中心聚类,窗口函数,对每个输入的图形,根据图形之间的二维distance进行均值中心聚类,返回聚类的id。distance指的是图形之间的centroids。
定义:integer ST_ClusterKMeans(geometry winset geom, integer number_of_clusters);
参数说明:
geom:输入的二维图形。
number_of_clusters:聚类的数量。
使用示例:

#均值中心聚类,聚成3类
gis_cluster=# SELECT gid,ST_ClusterKMeans(geom,3) over () AS cid,geom FROM buildings;
img_4f097e7437b6bc6a23fd66900703b161.png
均值中心为3类.png

同理,聚合成4类效果图如下:


img_e7192327986aa90413dadda91c601dac.png
均值中心为4类.png

使用也比较简单,也好理解。

四 ST_ClusterWithin

ST_ClusterWithin:聚合函数,对输入的图形,指定一个笛卡尔距离(距离单位是图形srid对应的单位),图形之间的距离在指定的距离内,则归并为一类。最后返回聚类后的图形数组。
定义:geometry[] ST_ClusterWithin(geometry set g, float8 distance);
使用简介:

create table buildings6(
    id serial primary key,
    cid int,
    geom geometry(Polygon,4326)
);

do language plpgsql $$  
 DECLARE
        rec record;
        num int;
        i int;
BEGIN
    truncate table buildings6;
        --距离设置为约50米,改成0.0003就是约30米
    for rec in with a as (select unnest(ST_ClusterWithin(geom, 0.0005)) geom from buildings) select row_number() over() as id,a.geom from a loop
        num:=ST_NumGeometries(rec.geom);
        for i in 1..num loop
            insert into buildings6(cid,geom) select rec.id,ST_GeometryN(rec.geom, i);
        end loop;
    end loop;
end;  
img_a2ceefe4f1796446ca5aa3d246ac1732.png
50米.png
img_a411f95751786f7114fda84d0d17c104.png
30米.png

聚类效果还是比较明显的。几个聚类函数比较常用,尤其在选址等应用上,不过具体的业务比简单的应用复杂多,笔者抛砖引玉,希望读者能有好的案例出现。

相关文章
|
5月前
|
分布式计算 BI MaxCompute
SQL 能力问题之输出聚合的维度列的名称,如何解决
SQL 能力问题之输出聚合的维度列的名称,如何解决
|
7月前
|
存储 数据挖掘 数据库
InfluxDB的连续查询与数据聚合技术详解
【4月更文挑战第30天】InfluxDB的连续查询(CQ)功能用于自动定时聚合时间序列数据,适用于数据降采样、实时分析和告警通知等场景。CQ使用InfluxQL编写,例如,每1小时对`cpu_usage`测量值计算主机的平均CPU使用率并存入`cpu_usage_hourly`。InfluxDB提供多种聚合函数如`MEAN()`, `MAX()`, 支持滑动窗口聚合等复杂操作,助力时间序列数据分析和趋势预测。通过CQ,用户能高效管理和利用时间序列数据信息。
|
7月前
|
存储 关系型数据库 MySQL
MySQL相关(三)- 索引数据模型推演及 B+Tree 的详细介绍
MySQL相关(三)- 索引数据模型推演及 B+Tree 的详细介绍
63 0
|
关系型数据库
GreenPlum和openGauss进行简单聚合时对扫描列的区别
GreenPlum和openGauss进行简单聚合时对扫描列的区别
140 0
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
110 0
|
SQL 关系型数据库 MySQL
以 MySQL 为例我们来聊聊,索引创建原则和执行计划分析。
以 MySQL 为例我们来聊聊,索引创建原则和执行计划分析。
115 0
以 MySQL 为例我们来聊聊,索引创建原则和执行计划分析。
|
存储 SQL 搜索推荐
PG+MySQL第10课-多维组合搜索
多维组合查询也是pg非常擅长的产品,它的解决方法或者优化方法非常的多,并且也具备了跟搜索引擎一样的倒排索引技术,可以便捷有效地解决任意字段组合查询的业务场景诉求
PG+MySQL第10课-多维组合搜索
|
数据库
时空数据库系列(二)-空间数据典型处理
本文阐述了空间数据处理中一些常见问题如何解决,为大家提供参考。
11383 0
|
关系型数据库 PostgreSQL 索引
PostgreSQL 多维空间几何对象 相交、包含 高效率检索实践 - cube
标签 PostgreSQL , cube , 空间 , 几何 , 相交 , 包含 背景 多维空间对象的几何运算,高效率检索实践。 例如我们在数据库中存储了多维几何对象,可以使用lower, upper的数组来表达,例如3维度对象: CUBE [ xmin1 ymin1 zmin1 , xmax1 ymax1 zmax1 ] 在介绍CUBE类型前,我们可以使用6个字段(xmin,xmax,ymin,ymax,zmin,zmax)来表达一个立方体。
1176 0
|
传感器 数据可视化 关系型数据库
基于PostGIS的高级应用(3)--线性参考
一 线性参考干啥用的   如果直接写个“高大上”的定义结果往往是一脸懵逼的,也不知道为什么要定义这么一个概念。其实线性参考技术在我们生活中是非常常见的,比如打开高德,百度地图的App,查看实时路况,道路被不同路况的颜色动态分段显示了;高速中发生交通事故,电视广播中常常对地点描述为“距离xx高速入口xx公里处”,地图是能非常精确的定位到这个地点的。
1698 0