PostgreSQL / PostGIS:创建地理要素

news/2025/2/8 22:18:26/

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 peopleADD CONSTRAINT people_geom_point_chkCHECK(GeomeTryType(geom)='POINT'::textOR 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_chkCHECK(GeomeTryType(geom)='LINESTRING'::textOR geom IS NULL);# 修改约束的投影ALTER TABLE streetsALTER COLUMN geom TYPE geometry(LINESTRING, 4326)USING ST_SetSRID(geom,4326);#添加几何信息UPDATE streetsSET geom = ST_LineFromText('LINESTRING(20 -33,21 -34,24 -33)',4326)WHERE streets.id=2;
(6)QGIS加载PostGIS图层

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

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

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


http://www.ppmy.cn/news/1570431.html

相关文章

php得到本周的起始日期实现签到功能

要做一个签到功能&#xff0c;在签到界面会显示本周&#xff0c;从周一到周日的七天。 上代码 <?php$stime_format date(Y-m-d 00:00:00, strtotime(monday this week));$stime strtotime($stime_format);for ($i 0; $i < 6; $i) {$ta array(timestamp > $stim…

【数据采集】基于Selenium采集豆瓣电影Top250的详细数据

基于Selenium采集豆瓣电影Top250的详细数据 Selenium官网:https://www.selenium.dev/blog/ 豆瓣电影Top250官网:https://movie.douban.com/top250 写在前面 实验目标:基于Selenium框架采集豆瓣电影Top250的详细数据。 电脑系统:Windows 使用软件:PyCharm、Navicat 技术需求…

TLS 和 SSL区别

TLS 与 SSL 的区别 TLS&#xff08;传输层安全协议&#xff09;和 SSL&#xff08;安全套接字层&#xff09;都是用于加密网络通信的协议&#xff0c;特别是在 Web 流量&#xff08;如 HTTPS&#xff09;中保护数据传输的安全。虽然它们有相似的功能和目的&#xff0c;但在协议…

Nginx部署Umi React前端项目标准配置

文章目录 概要前端Umi项目配置文件请求后端Api打包 后端项目Nginx配置配置文件 错误信息 概要 使用UmiJs开发的前端项目打包部署在Nginx&#xff0c;主要是Umi中项目的配置和Nginx的配置 前端Umi项目 基于"umijs/max": "^4.3.24", "react": &…

2.7学习总结

并查集&#xff1a; 1.查询&#xff08;采用了递归的方法&#xff09; 2.合并、 完整代码模板&#xff08;联系题目直接套模板&#xff09; 1.优化前 #include<stdio.h> #include<stdlib.h> #define MAXSIZE 100int uset[MAXSIZE];//定义一个足够长的数组 //用…

RISC-V芯片与扩展医疗影像处理边缘设备编程探析

一、引言 在数智化医疗快速发展的当下,医疗影像处理作为疾病诊断、治疗方案制定的关键环节,对设备性能与效率提出了极高要求。传统的医疗影像处理多依赖于集中式的大型计算中心,数据需传输至远程服务器进行处理,这不仅面临网络延迟、带宽限制的问题,还存在数据隐私安全风险…

前端高级面试题及其答案

以下是一些前端高级面试题及其答案&#xff1a; 一、JavaScript相关 事件循环&#xff08;Event Loop&#xff09;机制 答案&#xff1a; JavaScript的事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。它包含宏任务&#xff08;macrotask&#xff09;队列&…

深度学习 Pytorch 建模可视化工具TensorBoard的安装与使用

50 TensorBoard的安装和使用 在深度学习建模过程中&#xff0c;为了能够快速绘制模型基本结构、观察模型评估指标伴随训练过程的动态变化情况&#xff0c;当然也为了能够观察图像数据&#xff0c;我们可以使用TensorBoard工具来进行Pytorch深度学习模型的可视化展示。 Tensor…