PostGIS空间数据库之空间数据融合实践

news2025/2/4 13:05:01

目录

前言

一、ST_Union()简介

1、方法说明       

2、参数介绍

二、ST_Collect()简介

1、方法说明

2、参数介绍

3、两者区别

三、实际案例实践

1、不重叠融合

2、空间重叠融合

总结


前言

        众所周知,熟悉GIS桌面软件的同学一定都知道,想要对空间中的两个或者多个地理数据进行融合,可以使用融合的工具。常见的桌面软件,比如ArcGIS或者QGIS、SuperMap等均有成熟的工具。以QGIS为例,可以使用工具包中的合并工具,如下所示:

         在日常的工作当中,可以采用这些工具进行数据的融合。只是这些数据操作通常需要人工进行干预,而且数据不能实时进行。比如有时候,我们已经将这些数据保存到了空间数据库PostGIS中,而用户可能会随机抽取一些空间数据进行动态的融合。

        应对上面的场景,我们就可以采用SQL查询的方式来满足。比如在实际需求中,需要将某几个城市的空间数据进行融合形成新的数据以供查询分析。而在进行数据融合的时候,通常我们可以选用PostGIS中的ST_Union()和ST_Collect()这两个函数。

        这两个函数乍一看几乎是一样的,其实两者还是有一些区别的,但是通过官网的介绍又不是特别清楚。因此本文采用实例的方式进行讲解,将ST_Union()和ST_Collect()这两个函数进行空间融合实战,我们通过实际的两个面的函数操作和实际场景融合,来看看两个函数的具体使用。

一、ST_Union()简介

         在PostGIS中,对于st_union函数的定义有以下的几个入参,我们来看一下定义:

         st_union函数的定义如下:

CREATE OR REPLACE FUNCTION "public"."st_union"("geom1" "public"."geometry", "geom2" "public"."geometry")
  RETURNS "public"."geometry" AS '$libdir/postgis-3', 'ST_Union'
  LANGUAGE c IMMUTABLE STRICT
  COST 10000

1、方法说明       

         与Java的方法重载类似,st_union方法有5个重载。

序号方法
1st_union(geometry, geometry)
2st_union(geometry, geometry, float8)
3st_union(_geometry)
4st_union(geometry)
5st_union(geometry, float8)

2、参数介绍

        在上面的方法介绍中,geometry表示一个空间对象,float8的参数表示数据精度。注意,使用st_union函数进行运算之后,得到的结果是合并输入几何体,合并几何体以生成没有重叠的结果几何体。输出可以是原子几何图形、多重几何图形或几何图形集合。请一定注意这里合并的描述。

二、ST_Collect()简介

        首先来看在PostGIS数据库中对于st_collect()函数的定义。

st_collect函数的定义SQL如下:

CREATE OR REPLACE FUNCTION "public"."st_collect"("geom1" "public"."geometry", "geom2" "public"."geometry")
  RETURNS "public"."geometry" AS '$libdir/postgis-3', 'LWGEOM_collect'
  LANGUAGE c IMMUTABLE
  COST 50

1、方法说明

序号函数说明
1geometry ST_Collect(geometry g1, geometry g2);接受两个输入几何
2geometry ST_Collect(geometry[] g1_array);接受几何图形数组
3geometry ST_Collect(geometry set g1field);接受几何图形行集的聚合函数

2、参数介绍

        将几何图形收集(聚合)到几何图形集合中。结果是一个多*或一个GeometryCollection,这取决于输入几何的类型是相同的还是不同的(同构或异类)。输入几何图形在集合中保持不变。这里特别要注意的描述是聚合,与上面的函数相比,合并和聚合是两个概念。

3、两者区别

        如果单纯的从文字上讲,合并和聚合是一个近义词,表示两者的概念是差不多的。实际上两者的区别比较大,尤其是在空间运算中。可以用这句话来概括:ST_Collect将几何图形聚合到一个集合中,而不会以任何方式更改它们。ST_UNION以几何形式合并重叠的几何图形,并在交点处拆分线串。融合边界时,它可能会返回单个几何图形。

        简单来理解就是,使用st_collect进行运算,不会改变数据;而用st_union进行空间运算,会改变原有的数据。下面就进行实际的讲解。

三、实际案例实践

        在这里将采用面数据进行讲解,这里选择的面数据又分两种。第一种情况是空间不重叠融合,第二种是空间重叠融合,通过实际的例子来看一下在不同的空间关系中,两个函数的融合结果是什么样的。

1、不重叠融合

        空间不重叠融合中,我们采用保存在PostGIS数据库中的城市信息进行实例开展,对长株潭三个城市进行融合。

         biz_city的表数据如下所示:

 st_union融合sql:

select st_asgeojson(st_union(geom)) from biz_city where city_name in ('长沙市','株洲市','湘潭市');

查询结果如下:

 来看QGIS的结果:

        通过上图可以看出,使用st_union之后,三个城市已经完全融合,从而形成了一个全新的数据。下面再来看看st_collect函数的运行效果。

select st_asgeojson(st_collect(geom)) from biz_city where city_name in ('长沙市','株洲市','湘潭市');

        来看一下在QGIS中的展示结果:

        从总体来看,虽然长株潭三个城市同样合成了,但是三个城市的边界还是存在的,并没有进行融合。而在geojson的type中明确了两个的区别。

         结论:在空间不重叠的情况下,使用st_union和st_collect的合并结果虽然不大,但是对于数据是否改变来说,影响还是很大的。

2、空间重叠融合

 首先我们准备两份空间上重叠的数据,我们可以采用一下的模拟数据进行展示。

A B 图作为测试图形,用来验证这些函数的使用
-- A 图
select ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.74729919466666,31.483245492650792],[120.52757263183594,31.495432803134843]]]}')

-- B 图
select ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')

        将上述两个空间数据转成geojson,在QGIS中展示如下,首先是A图

         下面是B图:

         将两者空间叠加后,可以看到空间关系:

 st_union融合语句:

-- ST_Union在几何形状重叠的地方对其进行几何合并,并在相交处拆分线串。溶解边界时,它可能会返回单个几何。
select ST_Union (
ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.52757263183594,31.495432803134843]]]}'),
ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')
)

st_collect融合语句:

--  ST_Collect将几何形状聚合到一个集合中,而无需进行任何更改。 
select ST_Collect (
	ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.52757263183594,31.495432803134843],[120.59211730957031,31.31199502365151],[120.89012145996094,31.35950051982242],[120.74729919466666,31.483245492650792],[120.52757263183594,31.495432803134843]]]}'),
	ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[120.74386596679688,31.487235582017444],[120.84548950195312,31.269747790889888],[121.01783752441405,31.378261512889125],[120.91827392578125,31.487821121636433],[120.74386596679688,31.487235582017444]]]}')
)

         通过实验,同样可以得到上面的结论,使用st_collect对于原来的空间数据没有什么改变,而st_untion对数据的改变很大。

        所以,到了这里一定要深深的理解合并和聚合的区别。在实际项目过程中,根据需要进行合理的选择。

总结

        以上就是本文的主要内容,本文采用实例的方式进行讲解,将ST_Union()和ST_Collect()这两个函数进行空间融合实战,我们通过实际的两个面的函数操作和实际场景融合,希望通过实战的方式让你了解两者的区别,在具体使用空间函数的时候给予充分的评估和参考。行文仓促,不免有错误,欢迎朋友进行批评指正交流。

本文部分参考博文,原文地址:postgis函数知识积累

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟着pink老师前端入门教程-day13

品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称:品优购 项目描述:品优购是一个电商网站,我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合,里面需要大量的布…

【Linux C | I/O模型】Unix / Linux系统的5种IO模型 | 图文详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

oracle 19c上安装样例数据库

样例schema的分类 HR: Human Resources OE: Order Entry PM: Product Media IX: Information Exchange SH: Sales History BI: Business Intelligence 安装样例数据库 1:HR的安装,通过dbca时候 2:HR的安装,安装完数据库后&#…

面试经典 150 题 -- 矩阵 (总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 36 . 有效的数独 模拟 : 用数组模拟哈希表来判断对应的行,列和当前元素所在的3*3方格中是否重复出现,是的话,直接return false…

vue3前端开发,element-plus前端框架探秘:scope对象

vue3前端开发,element-plus前端框架探秘:scope对象!我们经常需要对当前行的数据进行操作,比如增加,删除,编辑等,为此我们需要传递当前行所对应的唯一主键,通常情况下,当前行对应的业务主键是id属…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url:https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

【Linux-crontab】Linux 系统 crontab 执行定时任务

【Linux-crontab】Linux 系统 crontab 执行定时任务 1)crontab简介2)操作步骤3)知识扩展4)常见的分时任务格式 1)crontab简介 crond 是 Linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程&#xff0…

专有D区震撼上市,高性价比的稀缺大机型谁不爱?

有时候,你可能想要一台或数台大机器: 核数多点,100不算多吧 内存大点,2T、4T的 主频高点,3.5GHz 要么三合一,既要又要还要? 那么问题来了: 这些既多核心,又大内存&a…

初学者必会的100个Python编程代码,入门全套资料都给朋友们整理好了,文末免费领!

我记得刚开始接触编程的时候,觉得太难了。 也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧? 他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会…

Unity SRP 管线【第七讲:URP LOD实现以及Reflections反射探针】

目录 一、URP LOD 组件1、LOD Group的使用2、LOD切换原理Cross Fade(淡入淡出)模式Animated Cross-Fading如果未设置Clip,并且Fade Transition Width不为0LOD物体烘培 SpeedTree 模式 二、反射探针1. 获取反射探针数据2. 环境光照明 IBL3. 反射探针(Refl…

创业公司的项目经理,如何有效争取股权激励

摘要:PM圆桌派,思考要快,行动要快。希赛聚集了一群有追求的PM校友,在一起谈天说地。在这里,我们无问对错,不论输赢,不分高下,每周四,一期一个话题battle,将真…

LeetCode--189

189. 轮转数组 提示 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

ele-h5项目使用vue3+vite开发:第一节、页面头部实现

实现页面 确认需求 顶部提示栏搜索框搜索提示 normalize.css:处理不同浏览器的默认样式 安装 npm i normalize.css 使用 src\App.vue<style scoped> import normalize.css;#app {/** 让字体抗锯齿&#xff0c;看起来更清晰 */-webkit-font-smoothing: antialiased;-moz-o…

面试中问到的算法题。————目录树生成

前言 我在面试中遇到了算法题&#xff0c;也是我第一次面试&#xff0c;也不知道是太紧张了还是太久没刷算法题了&#xff0c;感觉压有点懵的状态&#xff0c;所以当时面试的时候没有做出来或者说只做了一半没有做完。 面试完成后&#xff0c;我又重新审视了一下题目&#xff…

【送书福利-第三十一期】《区块链安全理论与实践(安全技术经典译丛)》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Xline Jepsen 测试分析

Table of Contents 摘要背景介绍 XlineJepsen CheckersNemesisJepsen 测试设计 数据一致性 SerializabilityLinearizabilityStrict SerializabilityJepsen etcd test RegistersSetsAppendWRJepsen Xline test测试结果分析 测试结果异步落盘Revision生成 背景旧的实现分析1-RTT…

九、Qt图表使用

一、QCharts概述 Qt图表提供了&#xff1a;折线图、样条曲线图、面积图、散点图、条形图、饼图、方块胡须图、蜡烛图、极坐标图。1、QChart介绍 Qt Charts基于Qt的QGraphics View架构&#xff0c;其核心组件是QChartView和QChartQChartView是显示图标的视图&#xff0c;基类为…

如何用gpt快速做好数据分析?

由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压就能正常完成后续需求。 …

Vue学习之使用HBuilderX创建并使用vue3.0项目

Vue学习之使用HBuilderX创建并使用vue3.0项目 下文将简述如何使用HBuilderX创建并使用vue3.0项目&#xff0c;包含项目创建、目录介绍、如何引用组件、首页自定义设置。 1、创建vue3.0项目 具体操作之前章节已经阐述过不在冗余介绍&#xff0c;创建时选择vue3项目即可。vue2…

2023年03月CCF-GESP编程能力等级认证Python编程二级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 以下存储器中的数据不会受到附近强磁场干扰的是( )。 A:硬盘 B:U 盘 C:内存 D:光盘 答案:D 第2题 下列流程图,属于计算机的哪种程序结构?( ) A:顺序结构 B:循环结构 C:…