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

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

相关文章
|
关系型数据库 MySQL 数据挖掘
MySQL数据高阶处理技巧:掌握先排序后分组的智慧
在MySQL数据库的数据探索旅程中,排序和分组是不可或缺的工具。然而,当你面对大量数据、重复值等情况时,常规的处理方法可能显得不够灵活。本文将为你揭示一个精妙的技巧:如何在MySQL中先排序,后分组,从而获取每个类型的最新数据,助你轻松驾驭复杂的数据处理任务。
206 0
|
关系型数据库
GreenPlum和openGauss进行简单聚合时对扫描列的区别
GreenPlum和openGauss进行简单聚合时对扫描列的区别
148 0
|
SQL 存储 关系型数据库
【MySQL从入门到精通】【高级篇】(二十八)子查询优化,排序优化,GROUP BY优化和分页查询优化
上一篇文章我们介绍了 1024程序员节|【MySQL从入门到精通】【高级篇】(二十七)外连接和内连接如何进行查询优化呢?join的原理了解一波,这篇文章我们接着来学习,本文主要学习的是子查询优化,排序优化,GROUP BY优化以及分页查询优化。
530 0
【MySQL从入门到精通】【高级篇】(二十八)子查询优化,排序优化,GROUP BY优化和分页查询优化
|
算法 关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL
|
移动开发 Oracle 关系型数据库
|
关系型数据库 PostgreSQL 索引
PostgreSQL 多维空间几何对象 相交、包含 高效率检索实践 - cube
标签 PostgreSQL , cube , 空间 , 几何 , 相交 , 包含 背景 多维空间对象的几何运算,高效率检索实践。 例如我们在数据库中存储了多维几何对象,可以使用lower, upper的数组来表达,例如3维度对象: CUBE [ xmin1 ymin1 zmin1 , xmax1 ymax1 zmax1 ] 在介绍CUBE类型前,我们可以使用6个字段(xmin,xmax,ymin,ymax,zmin,zmax)来表达一个立方体。
1185 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 空间聚合性能 - 行政区、电子围栏 空间聚合 - 时间、空间热力图
标签 PostgreSQL , 空间聚合 , 空间热力图 , 行政区 , 电子围栏 背景 某个时间区间(或其他条件),出现在某些围栏、行政区(多边形信息)中的对象(空间点信息)有多少,按颜色深浅渲染这些多边形。
2489 0
|
传感器 数据可视化 关系型数据库
基于PostGIS的高级应用(3)--线性参考
一 线性参考干啥用的   如果直接写个“高大上”的定义结果往往是一脸懵逼的,也不知道为什么要定义这么一个概念。其实线性参考技术在我们生活中是非常常见的,比如打开高德,百度地图的App,查看实时路况,道路被不同路况的颜色动态分段显示了;高速中发生交通事故,电视广播中常常对地点描述为“距离xx高速入口xx公里处”,地图是能非常精确的定位到这个地点的。
1715 0