【PostGIS】POSTGIS实现聚类统计提取外轮廓

news/2024/5/20 9:13:37 标签: 聚类, postgresql

项目需求根据某些条件进行聚类统计,然后返回聚类的外轮廓,这里主要用到POSTGIS的两个算法,一个是聚类统计功能,一个是提取外轮廓的功能。

1. 聚类统计

Postgis主要实现并提供了四种聚类方法,前两个为窗口函数,后两个为聚合函数:

ST_ClusterKMeans – 该函数是窗口函数,主要是用K-means(K均值聚类)算法进行聚类,算法原理比较简单,容易实现,主要适用于点样本数据,如果是多边形则用多边形的中心点计算,只有一个参数K簇,就是事先明确了要把这一堆样本数据聚成K个类,然后去计算一个目标函数达到最优解,因此K值对结果影响比较大,不太好选取,而且该算法而且适合凸的数据集,这也算法容易收敛;

ST_ClusterDBSCAN – 该函数也是窗口函数,主要利用DBSCAN算法对输入的地理要空间素进行聚类,该算法基于密度进行聚类,直觉上更加符合认知,主要是通过地理要素分布的紧密程度决定,同一类别的样本之间是紧密相连的,不同样本是分离的。该算法相对复杂,比较常用,聚类效果较好,。

ST_ClusterIntersecting – 该函数是一个聚合函数,方法比较好理解,顾名思义就是把相交关联关系的地理要素作为一个类簇。具体的函数声明和用法,看官网的例子介绍很容易看懂,也可以拿数据进行测试实验,不是很常用,不做重点;

ST_ClusterWithin – 该函数也是一个聚合函数,也很好理解,顾名思义通过一个距离参数,将距离之内的地理要素聚成一个类别,距离之外的就是非同类。详细可参考官网,也不做重点;

综合自己的需求,采用ST_ClusterDBSCAN函数
函数定义,有三个参数,(窗口函数中的每一个地理要素,搜索半径,最小点数),根据以上分析应该不难理解:

integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
例:

SELECT ST_ClusterDBSCAN(geom, eps := 0.000179, minpoints := 2) OVER () AS cluster_id,* FROM 表名

这里的eps需要根据表的srid来调整,我这边表的srid2为4490,是经纬度坐标,所以这里的0.000179也是经纬度的距离,大约20米,返回的cluster_id就是聚类后的类id,可以通过它将同一聚类的记录取出来。

2.外轮廓计算

  1. 计算凸包
    计算凸包十分简单,使用ST_ConvexHull即可,但同时可能失去很多特征点,生成的任务区比较粗,只能是一个大致的范围。
select ST_ConvexHull ((select ST_Collect(shape) from 表名))
  1. 计算凹包
    计算凹包十分简单相对复杂一些,使用ST_ConcaveHull,但相对于凸包会多保留一些特征点,生成的任务区保留了一些弯曲变化。

这个函数有三个参数:

  • geometry geom ,几何体
  • float target_percent,特征点抛弃的比例,0.1-0.99,越小特征保留的越多,但计算效率越低。当等于1时,和凸包的计算效果是一样的。
  • boolean allow_holes ,是否允许有洞
select ST_ConcaveHull ((select ST_Collect(shape) from 表名),0.7)

根据需求,我们选择凹包的计算方式

3.实现需求

这里聚类和计算外轮廓分步进行计算

  1. 首先进行聚类查询
SELECT ST_ClusterDBSCAN(geom, eps := 0.000179, minpoints := 2) OVER () AS cluster_id,* FROM allrecord

这里allrecord我是用了with子句的查询结果,目的是实现按照项目需求条件进行查询,这里不再展示

  1. 在java程序中完成聚类统计
Map<Integer, List<实体类>> collect = 聚类查询结果list.stream().filter(tcql -> tcql.getCluster_id() != null).collect(Collectors.groupingBy(实体类::getCluster_id));

然后分别将上述map中的id分别取出来,后续计算外轮廓是用

  1. 计算外轮廓
    这里直接将mapper的配置写出来
 <select id="selectConcaveHull" resultType="java.util.Map">
        with concaveResult as(
        select ST_ConcaveHull ((select ST_Collect(geom) from 表名 where id in
        <foreach collection="idList" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        ),0.7) geom
        )
        select st_astext(geom) geomtext,st_area(st_transform(geom,4528)) geomarea from concaveResult

    </select>

由于这里还计算了面积,所以还是采用了with子句的方式,现将凹包的geom查询出来,然后再取text形式和面积

参考文章
Postgis实现聚类分析
基于PostGIS实现大量不相邻多边形的外轮廓提取


http://www.niftyadmin.cn/n/5352951.html

相关文章

RabbitMQ基础编程模型及详细使用

目录 RabbitMQ基础编程模型 引入依赖 创建连接&#xff0c;获取Channel 声明Exchange-可选 声明queue 声明Exchange与Queue的绑定关系-可选 Producer根据应用场景发送消息到queue Consumer消费消息 Consumer主要有两种消费方式 1、被动消费模式 2、主动消费模式 完成…

搭建gitlab仓库

yum安装gitlab仓库 搭建gitlab仓库 配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 gpgcheck0 Repo_gpgcheck0 Enabled1 Gpgkeyhttps://packages.gitlab.com/gpg.keysudo yum ins…

selenium总结-css 定位高级语法

文章目录 推荐的定位方式的优先级定位元素的注意事项&#xff08;划重点&#xff09;CSS选择器组成id 选择器class 选择器标签选择器分组选择器属性选择器组合选择符伪类最佳实践 推荐的定位方式的优先级 优先级最高&#xff1a;ID优先级其次&#xff1a;name优先级再次&#…

SpringBoot之@RequestParam注解

RequestParam &#xff08;org.springframework.web.bind.annotation.RequestParam&#xff09;用于将指定的请求参数赋值给方法中的形参。 有三个属性&#xff1a; &#xff08;1&#xff09;value&#xff1a;请求参数名&#xff08;必须配置&#xff09; &#xff08;2&…

【Qt 多线程+opencv 读取和显示图像】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言工程需要Qt多线程opencv 结合信号与槽读取和显示图像 一、例程二、线程的开启和关闭三、判断线程是否还在运行总结 前言 提示&#xff1a;这里可以添加本文要记…

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习&#xff08;线上&#xff09;&#xff0c;hr问我有没有相关经历&#xff0c;我说我会用jupyter book进行数据导入&#xff0c;清洗&#xff0c;可视化&#xff0c;特征工程&#xff0c;建模&#xff0c;python学和用的比较多&#xff0c;…

Unity数据解析(Json、XML、CSV、二进制)

注释 常见的数据解析&#xff08;Json、XML、CSV、二进制&#xff09; using System; using System.IO; using System.Xml.Serialization; using Newtonsoft.Json; using System.Runtime.InteropServices; using System.Text; using System.Reflection; using System.Collect…

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤&#xff0c;可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理&#xff0c;实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…