PostGIS 空间数据库入门

发布时间 2023-06-16 15:16:37作者: Snowclod

一、简介

1、PostgreSQL 与 PostGIS关系

我们在开发中可能需要使用 GIS 的需求,尽管在PostgreSQL提供了上述几项支持空间数据的特性,但其提供的空间特性很难达到GIS的要求,主要表现在 :缺乏复杂的空间类型;没有提供空间分析;没有提供投影变换功能。为了使得 PostgreSQL 更好的提供空间信息服务,PostGIS应运而生。

PostGIS通过添加对空间类型、空间索引和空间函数这三个特性的支持,将PostgreSQL数据库管理系统转变为空间数据库。它建立在 PostgreSQL 之上。

2、PostGIS介绍

PostGIS 是一个空间数据库。,它是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS支持所有的空间数据类型,包括:点(POINT)线(LINESTRING)面(POLYGON)多点(MULTIPOINT)多线(MULTILINESTRING)多面(MULTIPOLYGON) 和集合对象集 (GEOMETRYCOLLECTION) 等。

PostGIS提供如下空间信息服务功能:空间对象空间索引空间操作函数等。可以像普通数据库一样存储和操作空间对象。

二、空间数据类型

1、空间数据模型

开放地理空间联盟 (OGC) 开发了简单要素访问标准 (SFA),为地理空间数据提供模型。 它定义了几何的基本空间类型, 以及操作和转换几何值的操作 以执行空间分析任务。

PostGIS 将 OGC 几何模型实现为 PostgreSQL 数据类型几何类型(Geometry)地理类型(geography)

它们都包含了下面这些基本空间类型:

类型 含义
点(Point) 表示二维平面中的一个点,由 X 和 Y 坐标组成。
线(LineString) 表示由两个或多个点组成的线段。
多边形(Polygon) 表示由一个或多个线段组成的封闭区域。
多点(MultiPoint) 表示由多个点组成的集合。
多线(MultiLineString) 表示由多条线段组成的集合。
多边形集合(MultiPolygon) 表示由多个多边形组成的集合。
几何集合(GeometryCollection) 表示由多个几何对象组成的集合。

2、几何数据类型

OGC SFA 规范定义了两种格式来表示供外部使用的几何值 Well-Known Text (WKT)Well-Known Binary (WKB)

两种格式的展现出的结果不同:

  • WKT格式: point(1,1)
  • WKB格式:0101000000000000000000F03F000000000000F03F

两种格式可以使用函数相互转换


-- 输出结果:point(1 1)
SELECT st_astext('0101000000000000000000F03F000000000000F03F')

-- 输入结果:0101000020E6100000000000000000F03F000000000000F03F
-- 输出的值与上面不一样是因为使用了 4326 参考系统进行转换,默认为 0
SELECT st_geomfromtext('point(1 1)',4326)

PostGIS 定义了扩展的 EWKB 和 EWKT 格式。它们提供 3D(XYZ 和 XYM)和 4D (XYZM) 坐标支持并包括 SRID 信息。这些就先不介绍了。可以去官网看看 PostGIS 数据管理

3、地理数据类型

地理空间数据类型和几何空间数据类型是 PostGIS 中常用的两类空间数据类型,它们之间的主要区别在于坐标系的不同。

几何空间数据类型使用平面坐标系表示空间对象,适用于一般的二维空间分析和计算场景。而地理空间数据类型使用经纬度坐标系表示地球表面上的位置和空间对象,适用于地理空间分析和计算场景。不同坐标系的使用导致了两者在表示和计算空间对象时的差异。

4、元数据表

PostGIS 提供了两个表来跟踪和报告数据中可用的几何类型,spatial_ref_sysgeometry_columns

  • spatial_ref_sys 表定义了数据库所有的空间参考系统。
    我们常用的有坐标系又分为平面坐标系和地理坐标系、投影坐标系等等。
select * from spatial_ref_sys

image

  • geometry_columns 实际是一个视图,提供了所有存在几何属性对象的列表及基本信息。
SELECT * FROM geometry_columns

f_table_catalog, f_table_schema, f_table_name 分别表示数据库名、表名、列名

coord_dimensionsrid 分别定义几何的维度(2 维、3 维或 4 维)和空间参考系统标识符

type 表示列的几何类型

image

三、空间索引

我们使用普通数据库时常用B树索引,但是这对于空间数据作用不大。

空间索引分为:GISTBRINSP-GIST,我们最常用和最通用的就是GIST作为空间索引。

四、空间函数

PostGIS 遵循 SFA 标准,在空间函数前面加上“ST_”。 这旨在代表“空间和时间”, 但标准的时间部分从未开发过。 相反,它可以解释为“空间类型”。

下面记录一些常用的空间函数:

1、转换函数

在几何图形和外部数据格式之间进行转换的函数。

-- 将文本表示转换为几何类型
-- 结果:0101000000000000000000F03F000000000000F03F
SELECT st_geomfromtext('point(1 1)',0);

-- 将几何类型转换为文本表示
-- 结果:point(1 1)
SELECT st_astext('0101000000000000000000F03F000000000000F03F')

-- 将几何类型转为 GeoJson类型
-- 结果:{"type":"Point","coordinates":[1,1]}
SELECT st_asgeojson(st_geomfromtext('point(1 1)',4326))

-- 将几何类型从一个坐标系转换为另一个坐标系。
-- 结果:0101000020110F0000DB0B4ADA772DFB402B432E49D22DFB40
SELECT st_transform(st_geomfromtext('point(1 1)',4326), 3857)

2、检索函数

用于检索几何的属性和测量值的函数。

-- 查询几何的空间参考标识符号
-- 结果:4326
SELECT st_srid(st_geomfromtext('point(1 1)',4326))

-- 查询几何的类型
-- 结果:ST_Point
SELECT st_geometrytype(st_geomfromtext('point(1 1)',4326))

-- 返回几何的维数
-- 结果:2
SELECT st_ndims('0101000000000000000000F03F000000000000F03F')

-- 返回 x 和 y 坐标
SELECT st_x('0101000000000000000000F03F000000000000F03F')
SELECT st_y('0101000000000000000000F03F000000000000F03F')

-- 用于检查一个空间对象是否包含另一个空间对象
-- 结果:t (true)
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
-- 下面几个函数都是类似的用法
-- ST_Contains: 检查一个空间对象是否包含另一个空间对象。
-- ST_Intersects: 检查两个空间对象是否相交。
-- ST_Touches: 检查两个空间对象是否相邻。
-- ST_Equals: 检查两个空间对象是否相等。
-- ST_Disjoint: 检查两个空间对象是否不相交。

PostGIS中有很多的函数,我们使用时可以参照官网使用 PostGIS函数