PostgreSQL / PostGIS:创建地理要素

PostGIS详细教程可以参考官方文档:https://postgis.net/workshops/zh_Hans/postgis-intro/,并且官方文档提供了练习数据、教程、PPT版本教程。我这里参考QGIS文档中关于PostGIS的教程进行学习。

PostGIS 可以被认为是一组数据库内函数的集合,这些函数扩展了 PostgreSQL 的核心功能,以便它可以存储、检索、查询和操作空间数据。我们可以在psql中使用\df *point*查询与point有关的函数,使用\dT+ *Point*查看点数据类型。

除了PostGIS函数外,PostGIS扩展还EPSG定义的空间参考系(SRS)定义集合。这些在坐标参考系(CRS)转换等操作中使用。这些SRS被定义在spatial_ref_sys表中,可以查看该表的架构:\d spatial_ref_sys;还可以使用SELECT语句来查看特定的EPSG,例如查询常用的WGS 84坐标系。

SELECT * FROM spatial_ref_sys Where srid=4326; 

SFS模型

如何在数据库中存储和表示地理要素,可以使用开放地理空间联盟 (OGC)标准接口:Simple Feature for SQL (SFS) Model,也就是SFS模型。SFS模型是一种以非拓扑方式在数据库中存储地理空间数据方法,并定义了访问、操作和构造数据的函数,用于在SQL数据库中处理简单的空间特征数据。总的来说,SFS包括两部分内容,第一部分是描述简单要素的通用模型,定义了几何对象的基本类型,如点、线、面等;第二部分是描述第一部分模型在SQL中的实现,定义了空间SQL语句中的操作,如AsTextIntersects等。

除此之外,OGC还定义了其他多种标准接口:WMS(Web Map Service)、WFS(Web Feature Service)、WCS(Web Coverage Service)、WMTS(Web Map Tile Service)等。

(1)添加 geometry 字段

首先,修改完善之前创建的streets表和people表:

# 先完善streets表
UPDATE streets SET name='High street' WHERE id=1;
INSERT INTO streets(name) VALUES ('Main Road');
INSERT INTO streets(name) VALUES ('Low Street');
# 完善people表
insert into people (name, house_no, street_id, phone_no)
          values ('Joe Bloggs',3,2,'072 887 23 45');
insert into people (name,house_no, street_id, phone_no)
          values ('Jane Smith',55,3,'072 837 33 35');
insert into people (name,house_no, street_id, phone_no)
          values ('Roger Jones',33,1,'072 832 31 38');
insert into people (name,house_no, street_id, phone_no)
          values ('Sally Norman',83,1,'072 932 31 32'); 

接下来,为数据库pglearn添加postgis拓展:CREATE EXTENSION postgis;,然后向 people 表添加一个 point 字段:

ALTER TABLE people ADD COLUMN geom geometry;
(2)根据几何类型添加约束

geometry 字段类型并没有隐式地指定字段的几何类型,因此添加一个约束,指定几何类型只接受point类型或 null 值,这里的约束'POINT'要注意大小写,小写可能导致后续插入数据失败。

ALTER TABLE people
	ADD CONSTRAINT people_geom_point_chk
	CHECK(GeomeTryType(geom)='POINT'::text
	OR geom IS NULL);
# 删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
(3)处理geometry_columns表

geometry_columns 表是 PostGIS 扩展的一部分,用于存储空间数据的元信息,这个表记录了每个空间表的详细信息,包括表名、列名、坐标系等。首先查看这个表,发现表里面已经具有了people这个表的相关信息,表中的coord_dimension等于2,表示X和Y两个纬度,但坐标系是0。

 select * from geometry_columns;

因此,修改坐标系为WGS84,我在这里使用UpdateGeometrySRID 函数(表在 public 模式中,可以省略了'public'),显示query string argument of EXECUTE is null,但是表中明明有这个字段。因此,我又使用了原生SQL语句修改,然后修改成功了。我认为可能是因为存在多个geometry_columns 文件,所以使用UpdateGeometrySRID 函数查询时没有查询到正确的表。

SELECT UpdateGeometrySRID('people', 'geom', 4326);

ALTER TABLE people
ALTER COLUMN geom TYPE geometry(Point, 4326)
USING ST_SetSRID(geom,4326);
(4)添加几何信息

使用 SQL 语句将几何记录添加到people表中,要注意ST_GeomFromText函数中不要出现多余的空格和符号等。

insert into people (name,house_no, street_id, phone_no, geom)
    values ('Fault Towers', 34, 3, '072 812 31 28',
            ST_GeomFromText('POINT(33 -33)', 4326)
           );

添加点后,可以使用QGIS连接到数据库查看点的位置。

(5)创建线

在 streets 表中插入一个 LINESTRING;创建多边形相似,需要将参数改为 POLYGON

 sudo -u postgres psql
 \c pglearn
 # 添加列
 ALTER TABLE streets ADD COLUMN geom geometry;
 # 添加约束
 ALTER TABLE streets                         
 ADD CONSTRAINT streets_geom_line_chk
 CHECK(GeomeTryType(geom)='LINESTRING'::text
 OR geom IS NULL);
 # 修改约束的投影
 ALTER TABLE streets
 ALTER COLUMN geom TYPE geometry(LINESTRING, 4326)
 USING ST_SetSRID(geom,4326);
 #添加几何信息
 UPDATE streets
 SET geom = ST_LineFromText('LINESTRING(20 -33,21 -34,24 -33)',4326)
 WHERE streets.id=2;
(6)QGIS加载PostGIS图层

在QGIS中添加PostGIS图层,在图层–添加图层–添加PostGIS图层,打开添加工具。

接下来新建连接,并输入主机IP、测试连接输入用户名和密码。

连接后,便可以看到点图层,双击便可以加载到QGIS中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

embeddingbag词袋

文章目录 1. embeddingbag2. pytorch 1. embeddingbag 词袋embeddingbag 是在embedding词表的基础上演变起来的,nn.embedding的作用是构建一个词表,通过输入index序号来索引词对应的词向量,是可以根据词索引index进行forward计算的,embeddin…

分享|通过Self-Instruct框架将语言模型与自生成指令对齐

结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限, 从而阻碍模型通用性的背景下, Self - Instruct 框架, 通过 自动生成 并 筛选指令数据 微调预训练语言模型, 有效提升了其指令遵循能…

无穿戴动捕数字人互动方案 展馆展览创新引擎,推动文旅数字化转型

随着经济社会的发展和文旅融合的加速推进,“博物馆热”已成为一种不可忽视的社会现象,成为文化领域最具潜力的增长点之一。在信息技术的迅猛推动下,科技赋能的博物馆展览日益受到公众的关注,其中,“元宇宙”等创新概念…

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录 前言一、Mybatis Generator简介二、Maven插件运行方式三、生成配置 generatorConfig.xml MyBatis3Simple风格MyBatis3风格MyBatis3DynamicSql风格 四、Java代码运行方式五、MGB生成全部表六、增加Ext包七、Git提交总结 前言 本文我们主要实战Mybatis官方的代码生成器…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数(C11起)默认移动赋值运算符(C11起)取地址及const取地址操作符重载取地址操作符重…

Ext文件系统

文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件,按照参…

免费接入DeepSeek等多种大模型

核心代码 import cn.hutool.core.collection.CollUtil; import com.tool4j.pasteshare.entity.params.AiParams; import com.tool4j.pasteshare.entity.params.Message; import com.tool4j.pasteshare.service.AiCompletionService; import com.tool4j.pasteshare.util.deepse…

PostIn简明安装教程(入门级)

PostIn是一款开源免费的接口管理工具,包含接口调试、接口文档设计、数据MOCK等模块,本文将介绍如何快速安装配置,以快速入门上手。 1、服务端安装 私有部署版本支持多种操作系统,包括 Linux、Docker、Windows及macOS,…

java Fx进阶操作

1.java Fx基本介绍 JavaFX是用于构建富互联网应用程序的Java库。 使用此库编写的应用程序可以跨多个平台一致运行。 使用JavaFX开发的应用程序可以在各种设备上运行,如台式计算机,手机,电视,平板电脑等。 要使用Java编程语言开…

java-重载与重写

介绍 在 Java 中,重载(Overloading) 和 重写(Overriding) 是两个重要的概念,它们都与方法有关,但它们的应用场景和行为完全不同。 通过理解重载和重写的区别,可以更好地设计类的继承…

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…

嵌入式工程师必学(143):模拟信号链基础

概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…

2.5学习

misc buuctf-假如给我三天光明 下载附件后得到了一个压缩包和一个图片,压缩包为加密压缩包,需要解出密码,然后注意到这个图片并非简单的一个封面,在下方还有诸多点,有黑有灰。经过搜索,发现这是盲文通过与…

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别? (1)变量 定义不仅告知编译器变量的类型和名字,还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型,但并不为它分配内存空间…

设备通过国标GB28181接入EasyCVR,显示在线但视频无法播放的原因排查

安防监控EasyCVR平台支持多种视频源接入,包括但不限于IP摄像头、NVR、编码器、流媒体服务器等。平台采用高效的视频流接入技术,支持大规模视频流的并发接入,确保视频流的稳定性和流畅性。 有用户反馈,项目现场使用国标GB28181接入…

Electricity Market Optimization 探索系列(三)

本文参考链接link 电网容量规划是一个寻求最优发电容量的过程,找到的最优发电容量能够可靠地满足未来电网的需求 发电机的容量和发电成本呈正相关关系,一台发电机的发电量不能超过其额定发电容量,结合我之前的博客所说的内容,可…

深入理解和使用定时线程池ScheduledThreadPoolExecutor

文章目录 前言认识定时线程池什么是定时线程池?定时线程池基本API使用定时线程池的应用场景1、定时任务调度2、缓存过期清理3、心跳检测4、延迟任务执行 定时线程池scheduleAtFixedRate与scheduleWithFixedDelay区别scheduleAtFixedRate案例demo(period&…

在Mac mini M4上部署DeepSeek R1本地大模型

在Mac mini M4上部署DeepSeek R1本地大模型 安装ollama 本地部署,我们可以通过Ollama来进行安装 Ollama 官方版:【点击前往】 Web UI 控制端【点击安装】 如何在MacOS上更换Ollama的模型位置 默认安装时,OLLAMA_MODELS 位置在"~/.o…

动态规划练习九(完全背包问题)

一、问题介绍与解题心得 完全背包问题与01背包问题很相似,不同点就是每个物品数量有多个,每个物品可以取多个或不取,来达到收益最大,或者收益在某个值。 限制条件:背包容量有限 解决问题:从价值入手&…