postgis学习

article/2025/9/29 0:04:55

以后估计会长期从事gis相关的工作,postgis作为一款功能比较强大的gis数据库还是需要好好学习一下的。虽然几何数据存储用任何一种类型的数据库都可以自行实现,但也仅仅只是存储,后续的坐标转换、空间分析等功能如果都要一一自己实现,那势必非常麻烦,postgis已经集成了这些功能,在此记录一下学习过程,便于以后回顾。

一、安装postgis

postgispostgresql数据库的一个扩展,所以安装postgis前必须先安装postgresql(点此下载),可根据自己的系统下载对应的安装包,具体安装过程就不说明了,网上有很多教程。

如果你的电脑装有docker,则推荐使用postgisdocker镜像,可以省去安装的麻烦,部署迁移管理也都更加方便。

docker pull postgis/postgis

运行postgis容器,设置容器名称your_container_name和postgres的访问密码your_postgres_passwd

docker run -d --name your_container_name -P -p 5432:5432 -e POSTGRES_PASSWORD=your_postgres_passwd postgis/postgis

以后想要使用postgis数据库,只要启动此容器就行了。

二、创建数据库

  1. 创建postgres数据库test,用于学习
create database test
  1. 进入test数据库,并增加postgis扩展
create extension postgis
  1. 查看postgis版本,如果由版本号显示则说明postgis数据库创建成功
select postgis_full_version()

三、几何数据读写

3.1 测试数据准备

选择WGS84坐标系下的1个点(120, 40, 500),使用EPSG网站进行坐标转换得到另外两个坐标系下的坐标,后面就用这两个坐标进行读写测试。
EPSG:3857 WGS 84 / Pseudo-Mercator坐标系下的坐标为(13358338.90, 4865942.28, 500)EPSG:4586 New Beijing / Gauss-Kruger CM 117E 坐标系下的坐标为(756206.42, 4433921.00, 500)

3.2 几何类型

3.2.1 OGC格式

postgis数据库支持OGC标准的空间几何数据类型,其格式分WKTWell-Known Text)和WKBWell-Known Binary)两种,前者是文本格式,后者是二进制格式,WKT格式的几何类型数据如下所示(举例,未列全),同一点坐标用空格分隔,不同点坐标用逗号分隔:
POINT(0 0) 二维点
POINTZ(0 0 0) 三维点
POINTZM(0 0 0 0) 三维带属性值的点
LINESTRING(0 0, 1 1, 1 2) 二维线
POLYGON((0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 2 1, 2 2, 1 2, 1 1)) 二维多边形

3.2.2 postgis格式

postgisOGC的格式进行了扩展,分为EWKTEWKB两种,这两种类型主要在数据的表示上进行了简化,如WKT表示有POINTPOINTZPOINTMPOINTZM四种形式,EWKT则只有POINTPOINTM两种形式,EWKTPOINT可以表示二维或三维,取决于填写的坐标数量,而WKT的二维和三维是根据类型名是否含Z来区分的,其基本对比如下

类型WKTEWKT
二维点POINT(0 0)POINT(0 0)
三维点POINTZ(0 0 0)POINT(0 0 0)
二维带属性点POINTM(0 0 0)POINTM(0 0 0)
三维带属性点POINTZM(0 0 0 0)POINTM(0 0 0 0)

3.3 geometry关键字

postgis数据库可以创建带有几何类型字段的数据表,其关键字为geometry,此字段可以存储点线面等几何类型数据以及坐标系参数srid(实际上是EPSG的编号)。在创建表时,该字段可以不带参数,此时字段可以存储不同类型的几何数据和坐标系参数;也可以带上参数,格式为(geomType, srid)geomType表示几何数据类型,srid表示投影参数,如定义一个坐标系为WGS84墨卡托投影的三维点类型字段对应的描述为(pointz,3857)(建表时的类型得用OGC的格式)。

3.4 固定几何类型和坐标系参数的数据表读写

如果表里存储的数据都是相同坐标系和几何类型的,可以在建表时指定,这样在后续的数据插入时就不需要再设置坐标系了。注意:设置了坐标系和类型的表在插入其他类型的坐标系和几何类型时会报错

3.4.1 创建投影坐标系为3857的几何点表

表名为testid为自增字段,name为几何数据名称,geom为几何数据

create table test (id serial PRIMARY KEY, name VARCHAR(50), geom geometry(pointz, 3857))

3.4.2 插入一条记录,WKT格式输入geom

st_geomfromtext表示把字符串转化为WKT格式

insert into test (name, geom) values('point1', st_geomfromtext('pointz(13358338.90 4865942.28 500)'))

3.4.3 插入一条记录,EWKT格式输入geom

st_geomfromewkt表示把字符串转化为EWKT格式,可以看出相同的数据在WKTEWKT两种不同的解析格式导入之后还是一致的。

insert into test (name, geom) values('point1', st_geomfromewkt('point(13358338.90 4865942.28 500)'))

在这里插入图片描述

3.4.4 查询记录,WKT格式输出geom

st_astext表示把几何数据转化为WKT格式,可以看到结果里带着POINTZ,坐标与原来一致

select name, st_astext(geom) from test

在这里插入图片描述

3.4.5 查询记录,EWKT格式输出geom

st_asewkt表示把几何数据转化为EWKT格式,可以看到结果里带着SRIDPOINT,坐标与原来一致

select name, st_asewkt(geom) from test

在这里插入图片描述

3.4.6 查询记录,GeoJSON格式输出geom

st_asgeojson表示把几何数据转化为JSON格式,可以看到结果为键值对格式,相比较前两种取值会更方便些

select name, st_asgeojson(geom) from test

在这里插入图片描述

3.4.7 查询记录,将geom转换到WGS84坐标系,并以WKT格式输出

st_transform表示将几何数据转到目标坐标系,参数格式为(几何数据,目标坐标系),可以看到输出的坐标与转换前的WGS84坐标一致(小数8位后有误差)

select name, st_astext(st_transform(geom, 4326)) from test

在这里插入图片描述

3.4.8 查询记录,将geom转换到WGS84坐标系,并以EWKT格式输出

select name, st_asewkt(st_transform(geom, 4326)) from test

在这里插入图片描述

3.4.9 查询记录,将geom转换到WGS84坐标系,并以JSON格式输出

综合类看,基于st_transformst_asgeojson可以方便地得到WGS84坐标系下的经纬度坐标,便于后续可视化绘制。

select name, st_asgeojson(st_transform(geom, 4326)) from test

在这里插入图片描述

3.5 无几何类型和坐标系参数的数据表读写

如果数据表存储的数据类型或坐标系不固定,则可以在建表时不指定,在插入数据时指定。

3.5.1 创建表

geometry参数不用设置

create table test2 (id serial PRIMARY KEY, name VARCHAR(50), geom geometry)

3.5.2 插入一条记录,WKT格式输入geom

使用坐标系为3857的坐标插入一个点

insert into test2 (name, geom) values ('point1', st_geomfromewkt('srid=3857;point(13358338.90 4865942.28 500)'))

3.5.3 插入一条记录,EWKT格式输入geom

使用坐标系为4586的坐标插入一条线,线的点xy相同,z不同,可以看出不同几何类型和坐标系可以成功导入

insert into test2 (name, geom) values ('linestring1', st_geomfromewkt('srid=4586;linestring(756206.42 4433921.00 500, 756206.42 4433921.00 600)'))

在这里插入图片描述

3.5.4 查询记录,WKT格式输出geom

select name, st_astext(geom) from test2

在这里插入图片描述

3.5.5 查询记录,EWKT格式输出geom

select name, st_asewkt(geom) from test2

在这里插入图片描述

3.5.6 查询记录,GeoJSON格式输出geom

select name, st_asgeojson(geom) from test2

在这里插入图片描述

3.5.7 查询记录,将geom转换到WGS84坐标系,并以WKT格式输出

select name, st_astext(st_transform(geom, 4326)) from test2

在这里插入图片描述

3.5.8 查询记录,将geom转换到WGS84坐标系,并以EWKT格式输出

select name, st_asewkt(st_transform(geom, 4326)) from test2

在这里插入图片描述

3.5.9 查询记录,将geom转换到WGS84坐标系,并以JSON格式输出

select name, st_asgeojson(st_transform(geom, 4326)) from test2

在这里插入图片描述

四、几何数据空间分析

待更新


http://chatgpt.dhexx.cn/article/fFKt6ECZ.shtml

相关文章

【笔试题】求最小公倍数 C++(两种方法)

题目 本题链接:求最小公倍数 正整数A和正整数B 的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。 输入描述: 输出描述: 示例1: 解题思路一: 暴力破解 …

多个数求最小公倍数详解!

最小公倍数 既然想算最小公倍数,首先要清楚最小公倍数的求法,还有最大公约数的求法 最小公倍数*最大公约数两数乘积 有了公式,我们很清楚可以知道了,只要有最大公约数就可以求出最小公倍数,因为两数乘积肯定是已知的&a…

最大公约数(GCD) 与 最小公倍数(LCM)的 定义、关系、求法

最大公约数 与 最小公倍数 约数 和 倍数最大公约数最小公倍数 最大公约数与最小公倍数的关系求最大公约数、最小公倍数例一例二 约数 和 倍数 如果数 a a a能被数 b b b整除, a a a就叫做 b b b的倍数, b b b就叫做 a a a的约数。 约数和倍数都表示一个…

最大公约数和最小公倍数

一、求最大公因数的三种方法: 最大公因数定义: (最大公约数、最大公因子):指两个或多个整数共有约数中最大的一个。 最小公倍数定义: 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。 ①辗转相除法&#x…

最大公约数和最小公倍数的关系

联系: 最大公约数: 指两个或多个整数共有的约数中最大的那个 最小公倍数: 指两个或多个整数共有的倍数中最小的那个 以两个整数为例: 最大公约数表示为:(a,b) 最小公倍数表示为:[a&#xff0…

公约数(也叫公因数)|公倍数 |小知识|Golang

一、最大公约数(也叫公因数) 两个数的 最大公约数 是能够被两个数整除的最大正整数。 举例: 3 和 6 的最大公约数是3。“6和3的最大公因数是3。 6的因数有1,2,3,6,3的因数有1,3。两个数的最大公约数是能够被两个数整除的最大整数…

线性代数学习笔记——第六十九讲——正交向量组与标准正交基

1. 正交向量组的定义 2. 正交的判定 3. 正交向量组必然线性无关,线性无关向量组未必是正交向量组 4. 正交向量组求解示例 5. 标准正交向量组的定义

线性空间标准正交基的构造——Schmidt正交化

证明: 两两正交的一组向量必然线性无关 线性空间的标准正交基定义 (定义摘自《矩阵论》,程云鹏,1999年第2版,p88) 下面的定理证明了欧式空间一定存在标准正交基,其证明过程可以看作把任意一组基化成标准正交基的算法&#xff0…

Schmidt正交化(正交规范化方法)

设有向量α1,α2...αn,则正交规范化方法为 ... 其中,括号内是指做内积运算,即((x1,x2,...xn),(y1,y2...yn))x1*y1x2*y2...xn*yx 然后,再将每个向量单位化、 即 最后得到的一系列γ组成的向量组就正交且均为单位向量

【矩阵论笔记】Schmidt正交化、标准正交基

正交定义 正交例题 正交向量组 标准正交基 Schmidt正交化 例题

正交基函数

SH光照论文需要知道基函数(basis functions)知识。基函数就是小片的信号,可以被缩放、组合来产生原函数的近似,计算多少基函数需要被加到结果中的过程被称为投影(projection)。通过基函数估计原函数&#x…

第十章 正交基和标准正交基

10.1正交基 10.2一维投影 10.3高维投影 10.4标准正交基的性质 10.5矩阵的QR分解 10.6总结

施密特正交化

定义 施密特正交化(Schmidt orthogonalization)是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm&…

线性代数学习之正交性,标准正交矩阵和投影

正交基和标准正交基: 前言: 经过上一次线性代数学习之向量空间,维度,和四大子空间的学习,对于空间的概念已经有了非常深刻的认识了,而描述空间很重要的方式除了维度以外,那就是空间的基了&…

【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(8):标准正交基与Gram-Schmidt过程

目录 前言往期文章2.2 标准正交基与Gram-Schmidt过程2.2.1 标准正交基定义2.4定理2.2.1定义2.5 2.2.2 求标准正交基的Schmide方法定理2.2.2举例 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指…

c语言实现向量组的标准/规范正交基(施密特正交化)

问题:任意一个向量组求标准正交基,尽量用C/C。 思路:下面是我找的课本上面的算向量组标准正交基的方法。第一步,用施密特正交化方法,使向量组正交;第二步,将向量组各向量单位化。 代码实现&a…

正交基

规范正交基是n维欧式空间V中n个两两正交的非零单位向量组成的一个规范正交组。V中的任意向量ξ都可以由V的一组规范正交基{a1,a2,…,an}唯一表示ξx11x22…xnn,x1,x2,…,xn是ξ关于基{a1,a2,…,an}的坐标,由于{a1,a2&a…

线性代数(三十九) :格拉姆-施密特正交化与标准正交基

本节介绍正交的概念,以及将基变为正交基的格拉姆-施密特(Gram-Schmidt)方法 1 正交 如果向量x,y满足: 则称x与y正交(orthogonal)或者垂直(perpendicular),记做: 2 标准正交基 设X是具有欧几里得结构的有限维线性空间 是X的一组基,如果他们满足&#x…

线性代数(14)——正交性、标准正交基和投影

正交性、标准正交基和投影 正交基与标准正交基一维投影高维投影和Gram-Schmidt过程三维空间四维及以上空间实现Gram-Schmidt过程相关话题 标准正交基的性质 正交基与标准正交基 一个 n n n维空间中任何一组线性无关的向量,都是这个 n n n维空间的一组基。当这组基的…

线性代数中一组基向量的标准正交化原理通熟易懂理解

我们先来看图,看看这个方法的操作过程,等一下,我找找我的大学的线性代数课本,找到啦!(哈哈,虽然读研了,因为我是菜鸟,所以还是随时带着)如下图所示&#xff1…