UDB-TS 开发使用手册

1 架构概述

UDB-TS 是九有数据库UDB-TX产品在时空数据库领域的延伸。 UDB-TS 提供如下空间信息服务功能: 空间对象、空间索引、空间操作函数和空间操作符。UDB-TS 基于PostGIS构建,并遵循OpenGIS的国际GIS行业规范。

UDB-TS作为时空数据库管理系统也可用于地理信息以外的应用。例如,空间数据库可以用于管理与人体解剖、大规模集成电路、分子结构和电磁场等相关的数据。

目前,UDB-TS 的版本与UDB-TX的标准版本同步发行。UDB-TX的标准版本不包含UDB-TS的相关功能。

2 安装和检查

UDB-TS和UDB-TX的标准版本安装过程完全相同。具体过程,请参考《UDB-TX22.4 服务器管理手册》的安装部分即可。 UDB-TS版本实现了时空数据库一系列功能的“开箱即用”。

可通过ud_sql客户端,连接到数据库中,通过如下命令查看到和UDB-TS相关的所有插件:

unvdb=# \dx

典型插件列表如下:

udbgis ### gis的基本核心功能,仅支持地理图形(矢量要素)

udbgis_raster ### 对栅格数据的支持

udbgis_sfcgal ### 三维或多维空间数据的空间运算

udbgis_tiger_geocoder ### 提供了 TIGER(拓扑集成地理编码和参考)数据的地理编码支持

udbgis_topology ### 拓扑功能的支持

fuzzystrmatch ### 字 符 串 模 糊 查 询

address_standardizer ### 地理编码和逆向地理编码数据地址规则化

address_standardizer_data_us ### 数据地址规则化示例数据集

pgrouting ### 基于拓扑路网数据进行最短路径查询或耗费成本计算,并支持矩阵运算

pointcloud ### 提供对 LiDAR 点云的支持,提供对点云数据的存储

pointcloud_postgis ### 提供对 LiDAR 点云的支持,提供对点云数据的存储(与pointcloud一起使用)

ogr_fdw ### 利用 OGR 读取外部的 GIS 数据(例如 Shapefile)

目前UDB-TS支持的GIS数据格式主要包括shapefile和raster,对于其他格式的GIS数据,可以借助于GDAL工具ogr2ogr 进行转换(ogr2ogr需要额外安装)。

整个关于GIS的扩展在安装数据库和创建数据库时,是默认打开的无需后续创建。但是不包括所有Schema下,只在public默认模式下创建,在其他模式下需要使用时则需要引用public模式。

3 基本概念

3.1 空间数据类型

普通数据库拥有字符串(string)、数值(number)和日期(date)这些数据类型,空间数据库添加额外的数据类型(空间数据类型)以用于表达地理特征(geographic features)。

这些空间数据类型抽象并封装了诸如边界(boundary)和维度(dimension)等空间结构。

在许多方面,空间数据类型可以简单的理解为形状(shape)

3.2 空间索引和边界框(bounding box)

普通数据库提供索引机制以允许对数据子集进行快速、随机地访问。

标准的数据类型(number、string、date)的索引通常是B-tree索引(B树索引),B树索引使用自然排序顺序(natural sort order)对数据进行分区,以便将数据放入分层树中。

数字、字符串和日期的自然排序顺序很容易确定 —— 每个值都小于、大于或等于其他值。

但是由于多边形(Polygon)可以重叠,可以相互包含,并且可以排列在二维(或更多维数)空间中,因此无法使用B树索引有效地索引它们。

空间数据库提供了一个“空间索引(spatial index)”,它回答了“哪些对象在这个特定的边界框内?”这个问题。

边界框(bounding box)是平行于坐标轴且包含给定地理要素(feature)的最小的矩形。

使用边界框是为了判断”A被包含在B中吗?”这个问题,对多边形进行计算,计算量非常大而且难以计算,但在计算矩形的情况下,计算比较容易,而且速度非常快。即使是最复杂的多边形和线段(LineString)也可以用一个简单的边界框来表示。索引必须快速执行才能起到理想的作用。因此,空间索引不像B树索引那样提供精确的结果,而是提供近似的结果。 “多边形内部包含哪些线段“将由空间索引解释为”这个多边形边界框内部包含哪些线段边界框?“

3.3 空间函数

关于查询的数据操作,普通数据库提供的函数功能包括连接字符串、对字符串执行哈希操作、对数值进行数学运算以及从日期中提取信息等。

空间数据库为分析几何信息、确定空间关系和操作几何图形提供了一套完整的空间函数。

空间函数中的大部分可以被归纳为以下五类:

  • 转换 —— 在geometry(UDB-TS中存储空间信息的格式)和外部数据格式之间进行转换的函数

  • 管理 —— 管理关于空间表和UDB-TS组织的信息的函数

  • 检索 —— 检索几何图形的属性和空间信息测量的函数

  • 比较 —— 比较两种几何图形的空间关系的函数

  • 生成 —— 基于其他几何图形生成新图形的函数

4 数据管理

4.1 空间数据模型

4.1.1 OGC几何形状

开放地理空间联盟(OGC)开发了简单特征访问提供地理空间数据模型的标准(SFA)。它定义了基本的空间类型几何形状以及操纵和变换几何值以执行空间分析任务的操作。UDB-TS将OGC几何模型实现为UDB-TX数据类型Geometry和Geography.

Geometry是一种抽象类型。Geometry值属于它的一个具体的代表各种几何形状和维度的子类型。这些包括原子的类型点, 线串, 线性环和多边形,以及集合类型多点, 多重线串, 多重多边形和几何集合。这简单特征访问-第1部分:通用架构1.2.1版为结构添加子类型多面体表面, 三角和TIN.

Geometry在二维笛卡尔平面中对形状建模。多面体表面、三角形和TIN类型也可以表示三维空间中的形状。形状的大小和位置由它们的坐标系指定。每个坐标都有一个X和Y坐标确定其在平面中位置的值。形状由点或线串构成,点由单个坐标指定,线串由两个坐标指定。

坐标可能包含可选的Z和M坐标值。Z坐标通常用来表示高度。M坐标包含一个测量值,它可以代表时间或距离。如果几何值中存在Z或M值,则必须为几何中的每个点定义它们。如果一个几何图形有Z或M坐标坐标维度是3D;如果它既有Z又有M,坐标维数就是4D。

Geometry值与一个空间参考系统指示它所嵌入的坐标系。空间参考系统由几何SRID值来标识。X轴和Y轴的单位由空间参考系统确定。在平面的参考系统X和Y坐标通常表示东和北,而在大地测量学中它们代表经度和纬度。SRID 0表示一个无限笛卡尔平面,其轴上没有指定单位。看见第4.5节,“空间参考系统”.

Geometry维度是几何类型的属性。点类型的维度为0,线性类型的维度为1,多边形类型的维度为2。集合具有最大元素维度的维度。

Geometry值可以是空的。空值不包含顶点(对于原子几何体类型)或元素(对于集合)。

Geometry值的一个重要属性是它们的空间延伸或者边界框OGC模型称之为envelope。这是一个2或3维的盒子,它包含了一个几何图形的坐标。这是在坐标空间中表示几何形状的范围并检查两个几何形状是否相交的有效方法。

几何模型允许评估拓扑空间关系,如第5.1.1节,“尺寸扩展的9-交叉点模型”中所述。为了支持这一点,每种几何形状定义了内部, 分界线外部 。几何图形在拓扑上是封闭的,因此它们总是有它们的边界。边界是一个比几何本身小一个维度的几何。

OGC几何模型定义了每种几何类型的有效性规则。这些规则确保几何体值代表真实的情况(例如,可以指定一个多边形,其洞位于边界的外部,但这在几何上没有意义,因此是无效的)。UDB-TS还允许存储和操作无效的几何值。这允许在需要时检测和修复它们。参见第4.4节,“几何验证”

4.1.1.1 点

点是0维几何图形,表示坐标空间中的单个位置。

POINT (1 2)
POINT Z (1 2 3)
POINT ZM (1 2 3 4)
4.1.1.2 线串

线串是由连续的线段序列形成的一维线。每个线段由两个点定义,一个线段的终点构成下一个线段的起点。OGC有效线串可以有零个、两个或更多点,但UDB-TS也允许单点线串。线串可以自身交叉(自相交)。如果起点和终点相同,线串是封闭的。如果它不自相交,线串是简单的

LINESTRING (1 2, 3 4, 5 6)
4.1.1.3 线性环

线性环是既封闭又简单的线段。第一个点和最后一个点必须相等,并且直线不能自相交。

LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
4.1.1.4 多边形

多边形是一个二维平面区域,由外部边界(外壳)和零个或多个内部边界(孔洞)界定。每个边界都是一个线性环.

POLYGON ((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
4.1.1.5 多点

多点是点的集合。

MULTIPOINT ( (0 0), (1 2) )
4.1.1.6 多重线串

多重线串是线串的集合。如果一个多重线串的每个元素都是封闭的,那么它就是封闭的。

MULTILINESTRING ( (0 0,1 1,1 2), (2 3,3 2,5 4) )
4.1.1.7 多重多边形

多重多边形是不重叠、不相邻的多边形的集合。集合中的多边形只能接触有限数量的点。

MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
4.1.1.8 几何集合

几何集合是几何的异构(混合)集合。

GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
4.1.1.9 多面体表面

多面体表面是共享一些边的面片或小平面的连续集合。每个面片是一个平面多边形。如果多边形坐标有Z坐标,那么这个表面就是三维的。

POLYHEDRALSURFACE Z (
  ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
  ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
  ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
  ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
  ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),
  ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
4.1.1.10 三角

三角形是由三个不同的非共线顶点定义的多边形。因为三角形是多边形,所以它由四个坐标表示,第一个和第四个坐标相等。

TRIANGLE ((0 0, 0 9, 9 0, 0 0))
4.1.1.11 TIN

TIN是不重叠的集合三角代表不规则三角网.

TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )

4.1.2 SQL/MM曲线

ISO/IEC 13249-3 SQL多媒体-空间标准(SQL/MM)扩展了OGC SFA以定义包含圆弧曲线的几何子类型。SQL/MM类型支持3DM、3DZ和4D坐标。

4.1.2.1 弧形串

CircularString是基本曲线类型,类似于线性世界中的线串。单个弧段由三个点指定:起点和终点(第一个和第三个)以及弧上的其他点。要指定一个闭合圆,起点和终点相同,中点是圆直径上的相对点(即圆弧的中心)。在一系列弧中,前一个弧的终点是下一个弧的起点,就像线段的线段一样。这意味着一个循环字符串必须有大于1的奇数个点。

CIRCULARSTRING(0 0, 1 1, 1 0)

CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
4.1.2.2 复合曲线

复合曲线是可以包含圆弧段和直线段的单一连续曲线。这意味着除了具有格式良好的组件之外,每个组件(除了最后一个)的终点必须与下一个组件的起点一致。

COMPOUNDCURVE( CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))
4.1.2.3 曲线多边形

曲线多边形类似于多边形,有一个外环和零个或多个内环。区别在于环可以是圆串或复合曲线,也可以是线段。

从UDB-TS 1.4开始,UDB-TS支持曲线多边形中的复合曲线。

CURVEPOLYGON(
  CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),
  (1 1, 3 3, 3 1, 1 1) )

示例:曲线多边形,其壳由包含圆串和线段的复合曲线定义,孔由圆串定义

CURVEPOLYGON(
  COMPOUNDCURVE( CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),
                 (4 3, 4 5, 1 4, 0 0)),
  CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )
4.1.2.4 多曲线

多曲线是曲线的集合,可以包括线段、圆串或复合曲线。

MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))
4.1.2.5 多面

多曲面是曲面的集合,可以是(线性)多边形或曲线多边形。

MULTISURFACE(
  CURVEPOLYGON(
    CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0),
    (1 1, 3 3, 3 1, 1 1)),
  ((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11)))

4.1.3 WKT和WKB

OGC SFA规范定义了两种表示外部使用的几何值的格式: Well-Known Text(WKT)和 Well-Known Binary(WKB)。WKT和WKB都包括关于物体类型和定义它的坐标的信息。

Well-Known Text(WKT)提供了空间数据的标准文本表示。空间对象的WKT表示的例子有:

  • 点(0 0)

  • Z点(0 0 0)

  • ZM点(0 0 0 0)

  • 空点

  • 线串(0 0,1 1,1 2)

  • 空线串

  • 多边形((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))

  • 多点((0 0),(1 2))

  • Z多点 ((0 0 0),(1 2 3))

  • 空多点

  • 多重字符串((0 0,1 1,1 2),(2 3,3 2,5 4))

  • 多重多边形((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)),((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))

  • 几何集合(点(2 ^ 3),线串(2 ^ 3,3 ^ 4))

  • 空几何集合

WKT的输入和输出由函数提供ST_AsText和ST_GeomFromText:

text WKT = ST_AsText(geometry);
geometry = ST_GeomFromText(text WKT, SRID);

例如,从WKT和SRID创建并插入空间对象的语句是:

INSERT INTO geotable ( geom, name )
  VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

Well-Known Binary(WKB)以二进制数据(字节数组)的形式提供了空间数据的可移植的全精度表示。空间对象的WKB表示的示例有:

  • WKT:点(1 1)

    WKB:01010000000000000000000 f03f 0000000000000 f03

  • WKT: LINESTRING (2 2,9 9)

    WKB:010200000000200000000000000004000000000000400000000000022400000000000000002240

WKB的输入和输出由函数提供ST_AsBinaryST_GeomFromWKB:

bytea WKB = ST_AsBinary(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);

例如,从WKB创建和插入空间对象的语句是:

INSERT INTO geotable ( geom, name )
  VALUES ( ST_GeomFromWKB('\x0101000000000000000000f03f000000000000f03f', 312), 'A Place');

4.2 几何数据类型

4.2.1 UDB-TS EWKB和EWKT

UDB-TS通过定义名为‘’geometry‘’的UDB-TX数据类型来实现OGC简单特征模型`。它通过使用内部类型代码来表示所有几何子类型(请参见GeometryType)和(ST_GeometryType)。这就将空间特征建模为用类型为‘’geometry‘’的列定义的表的行。

这个geometry数据类型为不透明的,这意味着所有访问都是通过对几何值调用函数来完成的。函数允许创建几何对象,访问或更新所有内部字段,并计算新的几何值。UDB-TS支持OGC中指定的所有功能简单特征访问-第2部分:SQL选项(SFS)规范以及许多其他规范。参见本文档的**“7 参考”** 部分获取完整的函数列表。

提示:UDB-TS遵循SFA标准,将“ST_”作为空间函数的前缀。这是为了代表“空间和时间”,但标准的时间部分从未制定。相反,它可以被解释为“空间类型”。

SFA标准规定空间对象包括空间参考系统标识符(SRID)。创建插入数据库的空间对象时需要SRID(可能默认为0)。参考ST_SRID和第4.5节,“空间参考系统”

为了提高查询几何的效率,UDB-TS定义了各种空间索引和使用它们的空间操作符。参见第4.9节,“空间索引”和第5.2节,“使用空间索引”详情。

4.2.1.UDB-TS EWKB和EWKT

OGC SFA规范最初仅支持2D几何,而几何SRID不包括在输入/输出表示中。OGC SFA规范1.2.1(符合ISO 19125标准)增加了对3D (ZYZ)和测量(XYM和XYZM)坐标的支持,但仍然不包括SRID值。

由于这些限制,UDB-TS定义了扩展的EWKB和EWKT格式。它们提供3D (XYZ和XYM)和4D (XYZM)坐标支持,并包含SRID信息。包含所有几何信息允许UDB-TS使用EWKB作为记录格式(例如,在转储文件中)。

EWKB和EWKT用于UDB-TS数据对象的“规范形式”。对于输入,二进制数据的规范形式是EWKB,对于文本数据,可以接受EWKB或EWKT。这允许通过使用将HEXEWKB或EWKT中的文本值转换为几何值来创建几何值::geometry。对于输出,二进制的标准形式是EWKB,对于文本,标准形式是HEXEWKB(十六进制编码的EWKB)。

例如,此语句通过从EWKT文本值进行转换来创建几何图形,并使用HEXEWKB的规范形式输出它:

SELECT 'SRID=4;POINT(0 0)'::geometry;
  geometry
  ----------------------------------------------------
  01010000200400000000000000000000000000000000000000

UDB-TS EWKT输出与OGC WKT有些不同:

  • 对于3DZ几何图形,Z限定符被省略:

    OGC: POINT Z (1 2 3)

    EWKT: POINT(1 2 3)

  • 对于3DM几何图形,包括M限定符:

    OGC: POINT M(1 2 3)

    EWKT: POINTM (1 2 3)

  • 对于4D几何图形,省略了ZM限定词:

    OGC: POINT ZM(1 2 3 4)

    EWKT: POINT (1 2 3 4)

EWKT避免了过度指定维度和OGC/ISO格式可能出现的不一致,例如:

  • POINT ZM(1 1)

  • POINT ZM(1 1 1)

  • POINT(1 1 1 1)

提示:UDB-TS扩展格式目前是OGC格式的超集,因此每个有效的OGC WKB/WKT也是有效的EWKB/EWKT。但是,如果OGC以与PosGIS定义相冲突的方式扩展格式,这种情况将来可能会发生变化。因此,你不应该依赖这种兼容性!

空间对象的EWKT文本表示的示例有:

  • POINT(0 0 0) – XYZ

  • SRID=32632;POINT(0 0) – XY with SRID

  • POINTM(0 0 0) – XYM

  • POINT(0 0 0 0) – XYZM

  • SRID=4326;MULTIPOINTM(0 0 0,1 2 1) – XYM with SRID

  • MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))

  • POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))

  • MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))

  • GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )

  • MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )

  • POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )

  • TRIANGLE ((0 0, 0 10, 10 0, 0 0))

  • TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )

使用这些格式的输入和输出可通过以下函数实现:

bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT);

例如,使用EWKT创建和插入UDB-TS空间对象的语句是:

INSERT INTO geotable ( geom, name )
  VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )

4.3 geography数据类型

UDB-TS的geography 数据类型为“地理”坐标(有时称为“大地”坐标,或“纬度/经度”,或“经度/纬度”)上表示的空间要素提供了本机支持。地理坐标是以角度单位(度)表示的球面坐标。

UDB-TS几何数据类型的基础是平面。平面上两点之间的最短路径是一条直线。这意味着几何上的函数(面积、距离、长度、交点等)是使用直线向量和笛卡尔数学计算的。这使得它们实现起来更简单,执行起来更快,但也使得它们对于地球球形表面上的数据不准确。

UDB-TS地理数据类型基于球形模型。球体上两点之间的最短路径是一个大圆弧。地理上的函数(面积、距离、长度、交叉点等)是用球体上的弧来计算的。通过考虑世界的球体形状,这些函数提供了更精确的结果。

因为基础数学更复杂,所以为地理类型定义的函数比几何类型少。随着时间的推移,随着新算法的加入,geography类型的功能将会扩展。作为一种变通方法,可以在几何和地理类型之间来回转换。

与几何数据类型类似,地理数据通过空间参考系统标识符(SRID)与空间参考系统相关联。中定义的任何大地测量(基于经度/纬度)空间参考系统spatial_ref_sys表可以使用。可以添加自己的自定义大地测量空间参考系统,如中所述第4.5.2节,“用户定义的空间参考系统”.

对于所有空间参考系统,测量函数返回的单位(例如ST_Distance, ST_Length, ST_Perimeter, ST_Area)和的距离参数[ ST_DWithin 单位是米。

4.3.1 创建地理表

您可以使用创建一个表来存储地理数据。 使用CREATE TABLE 包含类型为geography列的SQL语句。以下示例创建了一个表,表中的地理列存储了WGS84大地坐标系(SRID 4326)中的2D线段:

CREATE TABLE global_points (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    location geography(POINT,4326)
  );

地理类型支持两个可选的类型修饰符:

  • 空间类型修饰符限制了柱中允许的形状和尺寸的种类。空间类型允许的值有:POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION。地理类型不支持曲线、TINs或多面体表面。修改器通过添加后缀支持坐标维数限制:Z、M和ZM。例如,修饰符“LINESTRINGM”只允许具有三维的线段,并将第三维视为度量。类似地,“POINTZM”需要四维(XYZM)数据。

  • SRID修改器将空间参考系统SRID限制为一个特定的数字。如果省略,SRID默认为4326 (WGS84大地测量),所有计算都使用WGS84进行。

创建包含地理列的表的示例:

  • 使用默认的SRID 4326 (WGS84经度/纬度)创建一个包含2D点地理信息的表:

    CREATE TABLE ptgeogwgs(gid serial PRIMARY KEY, geog geography(POINT) );
    
  • 使用NAD83 longlat中的2D点地理创建一个表:

    CREATE TABLE ptgeognad83(gid serial PRIMARY KEY, geog geography(POINT,4269) );
    
  • 使用3D (XYZ)点和4326的显式SRID创建一个表:

    CREATE TABLE ptzgeogwgs84(gid serial PRIMARY KEY, geog geography(POINTZ,4326) );
    
  • 使用默认的SRID 4326创建一个包含2D线段地理信息的表:

    CREATE TABLE lgeog(gid serial PRIMARY KEY, geog geography(LINESTRING) );
    
  • 使用SRID 4267 (NAD 1927 long lat)创建一个包含2D多边形地理的表:

    CREATE TABLE lgeognad27(gid serial PRIMARY KEY, geog geography(POLYGON,4267) );
    

地理字段注册在geography_columns系统视图。您可以查询geography_columns查看并看到该表已列出:

SELECT * FROM geography_columns;

创建空间索引的工作方式与创建几何列相同。GIS会注意到列类型是GEOGRAPHY,并创建一个适当的基于球体的索引,而不是通常用于几何的平面索引。

-- Index the test table with a spherical index
CREATE INDEX global_points_gix ON global_points USING GIST ( location );

4.3.2 使用地理表

您可以像插入几何图形一样将数据插入地理表中。如果具有SRID 4326,几何数据将自动转换为地理类型。这EWKT和EWKB格式也可以用来指定地理值。

-- Add some data into the test table
INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)');
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)');
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');

中列出的任何大地测量(经度/纬度)空间参考系统spatial_ref_sys表可以指定为地理SRID。如果使用非大地坐标系,会产生误差。

-- NAD 83 lon/lat
SELECT 'SRID=4269;POINT(-123 34)'::geography;
                    geography
----------------------------------------------------
 0101000020AD1000000000000000C05EC00000000000004140
-- NAD27 lon/lat
SELECT 'SRID=4267;POINT(-123 34)'::geography;
                    geography
----------------------------------------------------
 0101000020AB1000000000000000C05EC00000000000004140
-- NAD83 UTM zone meters - gives an error since it is a meter-based planar projection
SELECT 'SRID=26910;POINT(-123 34)'::geography;

ERROR:  Only lon/lat coordinate systems are supported in geography.

查询和测量功能使用米为单位。所以距离参数应该用米表示,返回值应该用米(或者面积用平方米)表示。

-- A distance query using a 1000km tolerance
SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);

通过计算一架从西雅图到伦敦(LINESTRING(-122.33 47.606,0.0 51.5))绕大圆飞行的飞机离雷克雅未克(POINT(-21.96 64.15))有多近,可以看出地理的力量.

地理类型计算雷克雅未克与西雅图和伦敦之间的大圆飞行路线之间的球面上的真实最短距离122.235 km。

-- Distance calculation using GEOGRAPHY
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography);
   st_distance
-----------------
 122235.23815667

几何类型计算雷克雅未克和世界平面地图上绘制的从西雅图到伦敦的直线路径之间的无意义笛卡尔距离。结果的名义单位是“度”,但是结果并不对应于点之间的任何真实角度差,所以即使称它们为“度”也是不准确的。

-- Distance calculation using GEOMETRY
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry);
      st_distance
--------------------
 13.342271221453624

4.3.3 何时使用地理数据类型

geography数据类型允许您在经度/纬度坐标中存储数据,但这是有代价的:在GEOGRAPHY上定义的函数比在GEOMETRY上定义的少;那些被定义的函数需要更多的CPU时间来执行。

您选择的数据类型应该由您正在构建的应用程序的预期工作区域决定。您的数据是跨越全球还是大洲,还是局限于某个州、县或市?

  • 如果您的数据包含在一个小区域内,您可能会发现,就性能和可用功能而言,选择适当的投影并使用几何是最佳解决方案。

  • 如果您的数据是全球性的或覆盖一个大陆地区,您可能会发现地理允许您构建一个系统,而不必担心投影细节。您将数据存储在经度/纬度中,并使用已经在地理上定义的函数。

  • 如果您不理解投影,也不想了解它们,并且您准备接受地理中可用功能的限制,那么使用地理可能比使用几何更容易。只需将您的数据加载为经度/纬度,然后就可以了。

4.3.4 地理常见问题

4.3.4.1 你是在球体上还是在椭球体上计算?
默认情况下,所有距离和面积计算都在椭球体上完成。您应该会发现,在良好的局部投影中,局部区域的计算结果与局部平面结果相匹配。在更大的区域内,椭球计算将比在投影平面上进行的任何计算更精确。通过将最终布尔参数设置为“FALSE”,所有地理功能都可以选择使用球体计算。这将在一定程度上加快计算速度,特别是对于几何图形非常简单的情况。
4.3.4.2 日期变更线和极点呢?
所有的计算都没有日期变更线或极点的概念,坐标是球形的(经度/纬度),所以从计算的角度来看,穿过日期变更线的形状与任何其他形状没有区别。
4.3.4.3 你能加工的最长圆弧是多少?
我们使用大圆弧作为两点之间的“插值线”。这意味着任何两点实际上是以两种方式连接在一起的,这取决于你沿着大圆的哪个方向行进。我们所有的代码都假设这些点是由大圆上两条路径中较短的一条连接起来的。因此,圆弧超过180度的形状将无法正确建模。
4.3.4.4 为什么计算欧洲/俄罗斯/在这里插入大地理区域的面积这么慢?
因为多边形太大了!大区域不好有两个原因:它们的边界很大,所以无论您运行什么查询,索引都倾向于提取特性;顶点的数量是巨大的,并且测试(距离、包含)必须遍历顶点列表至少一次,有时是N次(N是另一个候选特征中顶点的数量)。与几何图形一样,我们建议当您有非常大的多边形,但是在小区域中执行查询时,您将几何图形数据“反规范化”为较小的块,以便索引可以有效地子查询对象的部分,并且查询不必每次都提取整个对象。请参考ST_Subdivide功能文档。仅仅因为你可以在一个多边形中存储整个欧洲并不意味着你应该这样做。

4.4 几何验证

UDB-TS符合开放地理空间联盟(OGC)的简单要素规范。这个标准定义了几何的概念简单的有效的。这些定义允许简单特征几何模型以支持高效计算的一致且明确的方式表示空间对象。(注意:OGC SF和SQL/MM对简单和有效有相同的定义。)

4.4.1 简单几何

简单的几何是指没有异常几何点的几何,如自相交或自相切。

POINT 是天生的简单的作为0维几何对象。

如果没有两个坐标(POINTs)相等(具有相同的坐标值),MULTIPOINTs是简单的。

如果除了端点之外,它没有通过同一点两次,LINESTRING 是简单的。如果一个简单线串的端点相同,则称为封闭的并且被称为线性环。

(a)和(c)属于简单LINESTRINGs, (b)和(d)不属于简单的。(c)是一个封闭的线性环。

img(a) img(b)
img(c) img(d)

MULTILINESTRING被认定为是简单的,只有当它的所有元素都是简单的,并且任意两个元素之间的唯一交集出现在这两个元素边界上的点上。

(e)和(f)很简单MULTILINESTRING,而(g)不简单。

img(e) img(f) img(g)

POLYGONs由线性环构成,因此有效的多边形几何总是简单的.

若要测试几何图形是否简单,请使用ST_IsSimple函数:

SELECT
   ST_IsSimple('LINESTRING(0 0, 100 100)') AS straight,
   ST_IsSimple('LINESTRING(0 0, 100 100, 100 0, 0 100)') AS crossing;

 straight | crossing
----------+----------
 t        | f

通常,UDB-TS函数不要求几何参数简单。简单性主要用作定义几何有效性的基础。这也是某些类型的空间数据模型的要求(例如,线性网络通常不允许线交叉)。多点和线性几何可以通过使用ST_UnaryUnion.

4.4.2 有效几何图形

几何有效性主要适用于二维几何(POLYGONs和MULTIPOLYGONs)。有效性由允许多边形几何体明确地模拟平面区域的规则定义。

POLYGON在如下情况下被认为是有效的:

  1. 多边形边界环(外壳环和内部孔环)是简单的(请勿交叉或自摸)。因此,多边形不能有切割线、尖状物或环。这意味着多边形孔必须表示为内环,而不是外环自接触(所谓的“反向孔”)。

  2. 边界环不交叉

  3. 边界环可以在点上接触,但只能相切(即不在一条线上)

  4. 内环包含在外环中

  5. 多边形内部是简单连接的(即环不能以将多边形分割成多个部分的方式接触)

(h)和(i)是有效的POLYGON而(j-m)是无效的。(j)可以表示为有效的MULTIPOLYGON.

img(h) img (i) img(j)
img(k) img(l) img(m)

MULTIPOLYGON被认为是有效的,如果:

  1. 它的元素POLYGONs是有效的

  2. 元素不重叠(即它们的内部不能相交)

  3. 元素仅在点上接触(即不沿直线)

(n)是有效的MULTIPOLYGON. (o)和(p)是无效的。

img(n) img(o) img(p)

这些规则意味着有效的多边形几何图形也简单的.

对于线性几何,唯一的有效性规则是LINESTRINGs必须至少有两个点,并且长度非零(或者等价地,至少有两个不同的点)。注意,非简单(自相交)线有效。

SELECT
   ST_IsValid('LINESTRING(0 0, 1 1)') AS len_nonzero,
   ST_IsValid('LINESTRING(0 0, 0 0, 0 0)') AS len_zero,
   ST_IsValid('LINESTRING(10 10, 150 150, 180 50, 20 130)') AS self_int;

 len_nonzero | len_zero | self_int
-------------+----------+----------
 t           | f        | t

POINTMULTIPOINT几何没有有效性规则。

4.4.3 管理有效性

UDB-TS允许创建和存储有效和无效的几何。这允许检测和标记或修复无效的几何图形。也有OGC有效性规则比预期更严格的情况(例如零长度线段和带倒孔的多边形)。)

UDB-TS提供的许多功能都依赖于几何参数有效的假设。例如,计算在多边形外部定义了洞的多边形的面积,或者从非简单的边界线构造多边形是没有意义的。假设有效的几何输入允许函数更有效地运行,因为它们不需要检查拓扑正确性。(值得注意的例外是零长度线和反转的多边形通常可以正确处理。)此外,如果输入有效,大多数UDB-TS函数都会产生有效的几何输出。这允许将UDB-TS函数安全地链接在一起。

如果在调用UDB-TS函数时遇到意外的错误消息(如“GEOS Intersection()抛出错误!”),您应该首先确认函数参数有效。如果不是,那么考虑使用下面的技术之一来确保您正在处理的数据是有效的。

提示:如果函数报告有效输入错误,则您可能在UDB-TS或其使用的某个库中发现了错误,您应该将此报告给UDB-TS项目。如果UDB-TS函数为有效输入返回无效几何,情况也是如此。

若要测试几何图形是否有效,请使用ST_IsValid函数 :

SELECT ST_IsValid('POLYGON ((20 180, 180 180, 180 20, 20 20, 20 180))');
-----------------
 t

关于几何无效的性质和位置的信息由ST_IsValidDetail功能:

SELECT valid, reason, ST_AsText(location) AS location
    FROM ST_IsValidDetail('POLYGON ((20 20, 120 190, 50 190, 170 50, 20 20))') AS t;

 valid |      reason       |                  location
-------+-------------------+---------------------------------------------
 f     | Self-intersection | POINT(91.51162790697674 141.56976744186045)

在某些情况下,需要自动修正无效的几何图形。使用ST_MakeValid函数来实现这一点。(ST_MakeValid是一个空间函数用于允许无效输入的例子)

默认情况下,UDB-TS在加载几何时不会检查有效性,因为对于复杂的几何,有效性测试会占用大量CPU时间。如果不信任数据源,可以通过添加check约束来对表强制进行有效性检查:

ALTER TABLE mytable
  ADD CONSTRAINT geometry_valid_check
	CHECK (ST_IsValid(geom));

4.5 空间参考系统

**空间参考系统(SRS)**也称为坐标参考系统(CRS)定义几何如何参考地球表面上的位置。SRS有三种类型:

  • 大地测量学的SRS使用直接映射到地球表面的角度坐标(经度和纬度)。

  • SRS项目使用数学投影变换将地球球体表面“展平”到一个平面上。它以允许直接测量距离、面积和角度等量的方式指定位置坐标。坐标系是笛卡尔坐标系,这意味着它有一个定义的原点和两个垂直轴(通常指向北方和东方)。每个投影SRS使用一个规定的长度单位(通常是米或英尺)。投影的SRS可能在其应用范围内受到限制,以避免失真并符合规定的坐标界限。

  • 本地的SRS是一个笛卡尔坐标系,它不以地球表面为参考。在UDB-TS中,是由SRID值指定为0。

有许多不同的空间参考系统在使用。在欧洲石油调查组织中,通用SRS是标准化的EPSG数据库。为了方便起见,UDB-TS(和许多其他空间系统)使用一个称为SRID的整数标识符来引用SRS定义。

Geometry通过其SRID值与空间参考系统相关联,可通过访问ST_SRID获得该值。Geometry的SRID可通过以下方式分配ST_SetSRID。一些几何构造函数允许提供SRID(例如ST_Point和ST_MakeEnvelope)。 EWKT格式支持带有SRID=n;前缀。

空间函数处理成对的几何图形(例如overly和relationship)要求输入几何位于相同的空间参考系统中(具有相同的SRID)。可以通过ST_Transform将几何数据转换到不同的空间参考系统。从函数返回的Geometry与输入Geometry具有相同的SRS。

4.5.1 空间参考系统表

UDB-TS使用符合OGC标准的数据库表SPATIAL_REF_SYS,用于定义可用的空间参考系统。它保存了坐标系统的SRIDs数值和文本描述。

spatial_ref_sys表定义为:

CREATE TABLE spatial_ref_sys (
  srid       INTEGER NOT NULL PRIMARY KEY,
  auth_name  VARCHAR(256),
  auth_srid  INTEGER,
  srtext     VARCHAR(2048),
  proj4text  VARCHAR(2048)
)

这些列是:

  • srid

    唯一标识的整数代码**空间参考系统(SRS)**在数据库中。

  • auth_name

    该参考系统引用的标准或标准机构的名称。例如,“EPSG”是一个有效的auth_name.

  • auth_srid

    引用的权威机构在auth_name里定义的空间参考系统的ID。在EPSG,这是EPSG电码。

  • srtext

    SRS 的Well-Known Text 文本表示。WKT SRS代表的一个例子是:

    PROJCS["NAD83 / UTM Zone 10N", 

    GEOGCS["NAD83",

        DATUM["North_American_Datum_1983", 

      SPHEROID["GRS 1980",6378137,298.257222101]

    ],

    PRIMEM["Greenwich",0],

    UNIT["degree",0.0174532925199433] 

    ], 

    PROJECTION["Transverse_Mercator"], 

    PARAMETER["latitude_of_origin",0], 

    PARAMETER["central_meridian",-123], 

    PARAMETER["scale_factor",0.9996], 

    PARAMETER["false_easting",500000], 

    PARAMETER["false_northing",0], 

    UNIT["metre",1]

    ]

    关于SRS WKT的讨论,参见OGC标准。

  • proj4text

    UDB-TS使用PROJ库来提供坐标转换功能。这个proj4text列包含特定SRID的PROJ坐标定义字符串。例如:

    +proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m

    有关更多信息,请参见PROJ网站。这个spatial_ref_sys.sql文件包含两者srtextproj4text所有EPSG投影的定义。

检索空间参考系统定义以用于变换时,UDB-TS使用以下策略:

  • 如果auth_nameauth_srid存在(非空)使用基于这些条目的PROJ SRS(如果存在)。

  • 如果可能,用srtext,创建一个SRS。

  • 如果可能,用proj4text创建一个SRS。

4.5.2 用户定义的空间参考系统

UDB-TSspatial_ref_sys表包含3000多个最常见的空间参考系统定义,由PROJ投影库处理。但是有许多坐标系它不包含。如果您有关于空间参考系统的所需信息,可以将SRS定义添加到表中。或者,如果您熟悉PROJ构造,您可以定义自己的自定义空间参考系统。请记住,大多数空间参考系统都是区域性的,在超出其预期范围时没有任何意义。

用于查找核心数据集未定义的空间参考系统的资源有http://spatialreference.org/

一些常用的空间参考系统有 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - US National Atlas Equal Area,,以及60个WGS84 UTM分区。

以下是使用未分配的SRID和US-centric Lambert Conformal 投影的PROJ定义加载自定义坐标系的示例:

INSERT INTO spatial_ref_sys (srid, proj4text)
VALUES ( 990000,
  '+proj=lcc  +lon_0=-95 +lat_0=25 +lat_1=25 +lat_2=25 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs'
);

4.6 空间表

4.6.1.创建空间表

您可以使用创建一个表来存储几何数据,CREATE TABLE的SQL语句包含类型为geometry的列。以下示例创建了一个表,其中的几何列存储了BC-Albers坐标系(SRID 3005)中的2D (XY)线串:

CREATE TABLE roads (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    geom geometry(LINESTRING,3005)
  );

geometry类型支持两个可选的类型修饰符:

  • 空间类型修饰符限制列中允许的形状和尺寸的种类。该值可以是任何支持的几何子类型(例如,点、线串、多边形、多点、多线串、多多边形、几何集合等)。修改器通过添加后缀支持坐标维数限制:Z、M和ZM。例如,修饰符“LINESTRINGM”只允许具有三维的线段,并将第三维视为一个度量。类似地,“POINTZM”需要四维(XYZM)数据。

  • SRID修改器限制了空间参考系统SRID到一个特定的号码。如果省略,SRID默认为0。

创建带有geometry列的表的示例:

  • 使用默认SRID创建包含任何类型几何的表:

    CREATE TABLE geoms(gid serial PRIMARY KEY, geom geometry );
    
  • 使用默认SRID创建包含2D点geometry的表:

    CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINT) );
    
  • 创建一个包含3D (XYZ)点和显式SRID 3005的表:

    CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINTZ,3005) );
    
  • 使用默认SRID创建包含4D (XYZM)线串geometry的表:

    CREATE TABLE lines(gid serial PRIMARY KEY, geom geometry(LINESTRINGZM) );
    
  • 使用SRID 4267 (NAD 1927 long lat)创建一个具有2D多边形geometry的表:

    CREATE TABLE polys(gid serial PRIMARY KEY, geom geometry(POLYGON,4267) );
    

一个表中可以有多个geometry列。这可以在创建表时指定,也可以使用ALTER TABLE 这个SQL语句。本示例添加一个可容纳3D线条的列:

ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);

4.6.2 GEOMETRY_COLUMNS视图

OGC简单特性规范给SQL定义了GEOMETRY_COLUMNS元数据表去描述geometry表结构。在UDB-TS中geometry_columns 是从数据库系统catalog表中读取的视图。这确保了空间元数据信息始终与当前定义的表和视图保持一致。视图结构是:

\d geometry_columns
             View "public.geometry_columns"
      Column       |          Type          | Modifiers
-------------------+------------------------+-----------
 f_table_catalog   | character varying(256) |
 f_table_schema    | character varying(256) |
 f_table_name      | character varying(256) |
 f_geometry_column | character varying(256) |
 coord_dimension   | integer                |
 srid              | integer                |
 type              | character varying(30)  |

这些列是:

  • f_table_catalog, f_table_schema, f_table_name

    包含geometry列的要素表的全限定名称。UDB-TX中没有类似的“catalog ”,因此该列留空。对于“模式”,使用UDB-TX模式名(public是默认值)。

  • f_geometry_column

    特征表中geometry列的名称。

  • coord_dimension

    列的坐标维度(2、3或4)。

  • srid

    用于此表中坐标几何的空间参考系统的ID。它是对spatial_ref_sys表的外键引用。

  • type

    空间对象的类型。要将空间列限制为单一类型,请使用以下之一: POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION或相应的XYM版本POINTM、LINESTRINGM、POLYGONM、MULTIPOINTM、MULTILINESTRINGM、MULTIPOLYGONM、GEOMETRYCOLLECTIONM。对于异类(混合类型)集合,可以使用“GEOMETRY”作为类型。

4.6.3 手动注册geometry列

您可能需要这样做的两种情况是SQL视图和批量插入。对于大容量插入情况,可以通过约束列或执行alter table来更正geometry_columns表中的注册。对于视图,您可以使用强制转换操作来公开。注意,如果您的列是基于typmod的,创建过程会正确地注册它,所以不需要做任何事情。此外,未对几何应用空间函数的视图也将注册为基础表geometry列。

-- Lets say you have a view created like this
CREATE VIEW public.vwmytablemercator AS
	SELECT gid, ST_Transform(geom, 3395) As geom, f_name
	FROM public.mytable;

-- For it to register correctly
-- You need to cast the geometry
--
DROP VIEW public.vwmytablemercator;
CREATE VIEW  public.vwmytablemercator AS
	SELECT gid, ST_Transform(geom, 3395)::geometry(Geometry, 3395) As geom, f_name
	FROM public.mytable;

-- If you know the geometry type for sure is a 2D POLYGON then you could do
DROP VIEW public.vwmytablemercator;
CREATE VIEW  public.vwmytablemercator AS
	SELECT gid, ST_Transform(geom,3395)::geometry(Polygon, 3395) As geom, f_name
	FROM public.mytable;
--Lets say you created a derivative table by doing a bulk insert
SELECT poi.gid, poi.geom, citybounds.city_name
INTO myschema.my_special_pois
FROM poi INNER JOIN citybounds ON ST_Intersects(citybounds.geom, poi.geom);

-- Create 2D index on new table
CREATE INDEX idx_myschema_myspecialpois_geom_gist
  ON myschema.my_special_pois USING gist(geom);

-- If your points are 3D points or 3M points,
-- then you might want to create an nd index instead of a 2D index
CREATE INDEX my_special_pois_geom_gist_nd
	ON my_special_pois USING gist(geom gist_geometry_ops_nd);

-- To manually register this new table's geometry column in geometry_columns.
-- Note it will also change the underlying structure of the table to
-- to make the column typmod based.
SELECT populate_geometry_columns('myschema.my_special_pois'::regclass);

-- If you are using UDB-TS 2.0 and for whatever reason, you
-- you need the constraint based definition behavior
-- (such as case of inherited tables where all children do not have the same type and srid)
-- set optional use_typmod argument to false
SELECT populate_geometry_columns('myschema.my_special_pois'::regclass, false); 

尽管仍然支持基于旧约束的方法,但在视图中直接使用的基于约束的geometry列将无法在geometry_columns中正确注册,typmod列也是如此。在这个例子中,我们使用typmod定义了一个列,使用constraints定义了另一个列。

CREATE TABLE pois_ny(gid SERIAL PRIMARY KEY, poi_name text, cat text, geom geometry(POINT,4326));
SELECT AddGeometryColumn('pois_ny', 'geom_2160', 2160, 'POINT', 2, false);

如果我们在ud_sql中运行

\d pois_ny;

我们注意到它们的定义不同——一个是typmod,一个是constraint

                                  Table "public.pois_ny"
  Column   |         Type          |                       Modifiers

-----------+-----------------------+------------------------------------------------------
 gid       | integer               | not null default nextval('pois_ny_gid_seq'::regclass)
 poi_name  | text                  |
 cat       | character varying(20) |
 geom      | geometry(Point,4326)  |
 geom_2160 | geometry              |
Indexes:
    "pois_ny_pkey" PRIMARY KEY, btree (gid)
Check constraints:
    "enforce_dims_geom_2160" CHECK (st_ndims(geom_2160) = 2)
    "enforce_geotype_geom_2160" CHECK (geometrytype(geom_2160) = 'POINT'::text
        OR geom_2160 IS NULL)
    "enforce_srid_geom_2160" CHECK (st_srid(geom_2160) = 2160)

在geometry_columns中,它们都正确注册

SELECT f_table_name, f_geometry_column, srid, type
	FROM geometry_columns
	WHERE f_table_name = 'pois_ny';
f_table_name | f_geometry_column | srid | type
-------------+-------------------+------+-------
pois_ny      | geom              | 4326 | POINT
pois_ny      | geom_2160         | 2160 | POINT

然而,如果我们要创建一个这样的视图

CREATE VIEW vw_pois_ny_parks AS
SELECT *
  FROM pois_ny
  WHERE cat='park';

SELECT f_table_name, f_geometry_column, srid, type
	FROM geometry_columns
	WHERE f_table_name = 'vw_pois_ny_parks';

基于typmod的geom视图列可以正确注册,但基于约束的geom视图列却不行。

   f_table_name   | f_geometry_column | srid |   type
------------------+-------------------+------+----------
 vw_pois_ny_parks | geom              | 4326 | POINT
 vw_pois_ny_parks | geom_2160         |    0 | GEOMETRY

这在UDB-TS的未来版本中可能会有所改变,但目前要强制基于约束的视图列正确注册,您需要执行以下操作:

DROP VIEW vw_pois_ny_parks;
CREATE VIEW vw_pois_ny_parks AS
SELECT gid, poi_name, cat,
  geom,
  geom_2160::geometry(POINT,2160) As geom_2160
  FROM pois_ny
  WHERE cat = 'park';
SELECT f_table_name, f_geometry_column, srid, type
	FROM geometry_columns
	WHERE f_table_name = 'vw_pois_ny_parks';
   f_table_name   | f_geometry_column | srid | type
------------------+-------------------+------+-------
 vw_pois_ny_parks | geom              | 4326 | POINT
 vw_pois_ny_parks | geom_2160         | 2160 | POINT

4.7 加载空间数据

一旦创建了空间表,就可以将空间数据上传到数据库。将空间数据放入UDB-TS/UDB-TX数据库有两种内置方法: 使用格式化的SQL语句或使用Shapefile加载程序。

4.7.1 使用SQL加载数据

如果空间数据可以转换为文本表示(如WKT或WKB ),那么使用SQL可能是将数据导入UDB-TS的最简单方法。通过加载SQL的文本文件,可以将数据大容量加载到UDB-TS/UDB-TX中INSERT使用ud_sqlSQL实用程序。

SQL加载文件(roads.sql例如)可能是这样的:

BEGIN;
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (1,'LINESTRING(191232 243118,191108 243242)','Jeff Rd');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (2,'LINESTRING(189141 244158,189265 244817)','Geordie Rd');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (3,'LINESTRING(192783 228138,192612 229814)','Paul St');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (4,'LINESTRING(189412 252431,189631 259122)','Graeme Ave');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (5,'LINESTRING(190131 224148,190871 228134)','Phil Tce');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (6,'LINESTRING(198231 263418,198213 268322)','Dave Cres');
COMMIT;

可以使用以下命令将SQL文件加载到UDB-TX中ud_sql:

ud_sql -d [database] -f roads.sql

4.7.2 使用Shapefile Loader

shp2pgsql loader将Shapefiles转换为适合以geometry或geography格式插入UDB-TS/UDB-TX数据库的SQL。loader 有几种由命令行标志选择的操作模式。

还有一个shp2pgsql-gui图形界面,大部分选项和命令行 loader 相同。对于一次性的非脚本加载,或者如果您不熟悉UDB-TS,这可能更容易使用。它已经配置为UDB-Studio的插件。

  • (c|a|d|p) 这些是互斥的选项:

    -c

    创建一个新表并从Shapefile填充它。这是默认模式。

    -a

    将Shapefile中的数据追加到数据库表中。请注意,要使用此选项加载多个文件,这些文件必须具有相同的属性和相同的数据类型。

    -d

    在用Shapefile中的数据创建新表之前,删除数据库表。

    -p

    只生成表创建SQL代码,不添加任何实际数据。如果需要将表创建和数据加载步骤完全分开,可以使用这种方法。

  • -?

    显示帮助屏幕。

  • -D

    对输出数据使用UDB-TX“dump”格式。这可以与-a、-c和-d结合使用,比默认的“插入”SQL格式加载要快得多。对非常大的数据集使用这个。

  • -s [<FROM_SRID>:]

    使用指定的SRID创建并填充几何表。可以选择指定输入shapefile使用给定的FROM_SRID,在这种情况下,几何将被重新投影到目标SRID。

  • -k

    保持标识符的大小写(列、模式和属性)。请注意,Shapefile中的属性都是大写的。

  • -i

    将所有整数强制转换为标准的32位整数,不要创建64位bigints,即使DBF标头签名似乎允许这样做。

  • -I

    在几何列上创建点索引。

  • -m

    -ma_file_name指定一个文件,该文件包含一组(长)列名到10个字符的DBF列名的映射。该文件的内容是一行或多行两个名称,由空格分隔,没有尾随或前导空格。例如:COLUMNNAME DBFFIELD1 AVERYLONGCOLUMNNAME DBFFIELD2

  • -S

    生成简单的几何图形而不是多重几何图形。仅当所有几何体实际上都是单个几何体时(即具有单个外壳的多多边形,或具有单个顶点的多点几何体),才会成功。

  • -t <dimensionality>

    强制输出几何具有指定的维数。使用以下字符串表示维度:2D、3DZ、3DM、4D。如果输入的维数少于指定的维数,输出将用零填充这些维数。如果输入的维度多于指定的维度,将不需要的维度去除。

  • -w

    输出WKT格式,而不是WKB。请注意,由于精度损失,这可能会引入坐标漂移。

  • -e

    单独执行每条语句,不使用事务。这允许在存在一些产生错误的坏的几何图形时加载大多数好的数据。请注意,这不能与-D标志一起使用,因为“转储”格式总是使用事务。

  • -W

    指定输入数据的编码(dbf文件)。使用时,dbf的所有属性都从指定的编码转换为UTF8。产生的SQL输出将包含一个SET CLIENT_ENCODING to UTF8命令,以便后端能够从UTF8重新转换为数据库内部配置使用的任何编码。

  • -N

    空几何处理策略(插入*、跳过、中止)

  • -n

    -n仅导入DBF文件。如果您的数据没有相应的shapefile,它将自动切换到此模式,并只加载dbf。因此,只有当您拥有完整的shapefile集,并且只需要属性数据而不需要几何图形时,才需要设置此标志。

  • -G

    在WGS84 long lat (SRID=4326)中使用地理类型而不是几何图形(需要经度/纬度数据)

  • -T

    指定新表的表空间。除非还使用了-X参数,否则索引仍将使用默认表空间。UDB-TX文档对何时使用定制表空间有很好的描述。

  • -X

    为新表的索引指定表空间。这适用于主键索引,也适用于-I指定的GIST空间索引。

  • -Z

    使用时,此标志将防止生成ANALYZE声明。如果没有-Z标志(默认行为),则ANALYZE将生成报表。

使用loader 程序创建输入文件并加载它的示例会话可能如下所示:

# shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql
# psql -d roadsdb -f roads.sql

使用UNIX管道可以一步完成转换和加载:

# shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb

4.8 提取空间数据

可以使用SQL或Shapefile dumper 程序从数据库中提取空间数据。关于SQL的部分介绍了一些可用于对空间表进行比较和查询的函数。

4.8.1.使用SQL提取数据

从数据库中提取空间数据最直接的方法是使用SQLSELECT定义要提取的数据集并将结果列转储到可解析文本文件中的查询:

db=# SELECT road_id, ST_AsText(road_geom) AS geom, road_name FROM roads;

road_id | geom                                    | road_name
--------+-----------------------------------------+-----------
	  1 | LINESTRING(191232 243118,191108 243242) | Jeff Rd
	  2 | LINESTRING(189141 244158,189265 244817) | Geordie Rd
	  3 | LINESTRING(192783 228138,192612 229814) | Paul St
	  4 | LINESTRING(189412 252431,189631 259122) | Graeme Ave
	  5 | LINESTRING(190131 224148,190871 228134) | Phil Tce
	  6 | LINESTRING(198231 263418,198213 268322) | Dave Cres
	  7 | LINESTRING(218421 284121,224123 241231) | Chris Way
(6 rows)

有时,需要某种限制来减少返回的记录数量。对于基于属性的限制,使用与非空间表相同的SQL语法。在空间限制的情况下,以下函数很有用:

  • ST_Intersects

    这个函数告诉我们两个几何图形是否共享任何空间。

  • =

    这将测试两个几何图形在几何上是否相同。例如,如果’ POLYGON((0 0,1 1,1 0,0 0))’与’ POLYGON((0 0,1 1,1 0,0 0))’相同(它是)。

接下来,您可以在查询中使用这些运算符。请注意,在SQL命令行上指定几何图形和方框时,必须显式地将字符串表示转换为几何图形函数。312是一个与我们的数据相匹配的虚拟空间参考系统。比如说:

SELECT road_id, road_name
  FROM roads
  WHERE roads_geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;

上述查询将从“ROADS_GEOM”表中返回geometry等于该值的单个记录。

要检查某些道路是否经过由多边形定义的区域,请执行以下操作:

SELECT road_id, road_name
FROM roads
WHERE ST_Intersects(roads_geom, 'SRID=312;POLYGON((...))');

最常见的空间查询可能是“frame-based”的查询,由数据浏览器和web制图器等客户端软件使用,以获取“map frame”大小的数据进行显示。

使用“&&”运算符时,可以指定一个BOX3D作为比较特征,也可以指定一个GEOMETRY。但是,当您指定GEOMETRY时,其边界框将用于比较。

使用“BOX3D”对象作为框架,这样的查询如下所示:

SELECT ST_AsText(roads_geom) AS geom
FROM roads
WHERE
  roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);

注意使用SRID 312来指定Envelope的投影。

4.8.2.使用Shapefile dumper

pgsql2shptable dumper连接到数据库,并将表格(可能由查询定义)转换为形状文件。基本语法是:

pgsql2shp [<options>] <database> [<schema>.]<table>
pgsql2shp [<options>] <database> <query>

命令行选项包括:

  • -f

    将输出写入特定的文件名。

  • -h

    要连接的数据库主机。

  • -p

    数据库主机上要连接的端口。

  • -P

    连接到数据库时使用的密码。

  • -u

    连接到数据库时使用的用户名。

  • -g

    如果表格具有多个geometry列,则为写入形状文件时使用的geometry列。

  • -b

    使用二进制游标。这将使操作更快,但如果表中的任何非geometry属性缺少到文本的转换,这将不起作用。

  • -r

    原始模式。不要掉落gid字段或转义列名。

  • -mfilename

    将标识符重新映射到十个字符名称。该文件的内容是由两个符号组成的行,由一个空格分隔,没有尾随或前导空格:very long symbol short one other very long symbol short等。

4.9 空间索引

空间索引使得对大型数据集使用空间数据库成为可能。如果没有索引,搜索要素需要对数据库中的每个记录进行顺序扫描。索引通过将数据组织成一种可以快速遍历以找到匹配记录的结构来加快搜索速度。

通常用于属性数据的B树索引方法对于空间数据不是很有用,因为它只支持在一个维度上存储和查询数据。像几何图形(具有2个或更多维)这样的数据需要一个支持跨所有数据维的范围查询的索引方法。UDB-TX处理空间数据的一个关键优势是它提供了几种适用于多维数据的索引方法:GiST、BRIN和SP-GiST索引。

  • GiST (Generalized Search Tree) 索引将数据分解为“一边的东西”、“重叠的东西”、“内部的东西”,可以用于各种数据类型,包括GIS数据。UDB-TS使用在GiST上实现的R树索引来索引空间数据。GiST是最常用和最通用的空间索引方法,提供了非常好的查询性能。

  • BRIN (Block Range Index) 索引通过汇总表记录范围的空间范围来运行。搜索是通过扫描范围来完成的。BRIN仅适用于某些类型的数据(按空间排序,不经常更新或不更新)。但是它提供了更快的索引创建时间和更小的索引大小。

  • SP-GiST (Space-Partitioned Generalized Search Tree) 是一种通用索引方法,支持分区搜索树,如quad-trees, k-d trees, and radix trees (tries).。

空间索引仅存储几何的边界框。空间查询使用索引作为初级过滤器以快速确定可能匹配查询条件的一组几何图形。大多数空间查询都需要精滤器它使用空间谓词函数来测试更具体的空间条件。有关使用空间谓词排队的更多信息,请参见第5.2节,“使用空间索引”.

4.9.1 GiST 索引

GiST代表“通用搜索树”,是多维数据索引的通用形式。UDB-TS使用在GiST上实现的R树索引来索引空间数据。GiST是最常用和最通用的空间索引方法,提供了非常好的查询性能。GiST的其他实现用于加速对各种不规则数据结构(整数数组、谱数据等)的搜索,这些数据结构不适用于普通的B树索引。

一旦空间数据表超过几千行,您将需要构建一个索引来加速数据的空间搜索(除非您的所有搜索都基于属性,在这种情况下,您将需要在属性字段上构建一个普通索引)。

在“geometry”列上构建GiST索引的语法如下:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

上述语法将总是建立一个2D索引。要获取几何类型的n维索引,可以使用以下语法创建一个索引:

CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);

构建空间索引是一项计算量很大的工作。它还会在其创建的时间内阻止对表的写访问,因此在生产系统上,您可能希望以一种较慢的CONCURRENTLY-aware方式进行:

CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

构建索引后,有时强制UDB-TX 收集用于优化查询计划的表统计信息会很有帮助:

VACUUM ANALYZE [table_name] [(column_name)];

4.9.2 BRIN 索引

BRIN 代表“区块范围索引”。这是UDB-TX中引入的一种通用索引方法。是一个有损耗索引方法,这意味着需要进行二次检查来确认记录与给定的搜索条件相匹配(所有提供的空间索引都是这种情况)。它提供了更快的索引创建和更小的索引大小,以及合理的读取性能。它的主要目的是支持索引非常大的表,这些表的列与它们在表中的物理位置相关。除了空间索引,BRIN还可以加速各种属性数据结构(整数、数组等)的搜索。

一旦一个空间表超过了几千行,您就会想要构建一个索引来加速数据的空间搜索。只要GiST索引的大小不超过数据库可用的RAM数量,并且只要您能够负担得起索引存储大小和写时更新索引的成本,GiST索引的性能就非常好。否则,对于非常大的表,可以考虑使用BRIN索引。

BRIN索引将包围行中包含的所有几何图形的边界框存储在一组连续的表块中,称为块范围。使用索引执行查询时,将扫描块范围以查找与查询范围相交的块。只有当数据被物理排序,使得块范围的边界框具有最小的重叠(并且理想地是互斥的)时,这才是有效的。结果索引的大小非常小,但是对于读取来说,它的性能通常不如相同数据上的GiST索引。

构建BRIN索引比构建GiST索引占用的CPU资源少得多。对于相同的数据,构建BRIN索引比GiST索引快十倍,这是很常见的。因为BRIN索引只为每个范围的表块存储一个边界框,所以通常使用的磁盘空间比GiST索引少一千倍。

您可以选择一个范围内要汇总的块数。如果减少这个数字,索引会更大,但可能会提供更好的性能。

为了使BRIN有效,表数据应该以物理顺序存储,这样可以最大限度地减少块区重叠。数据可能已经进行了适当的排序(例如,如果它是从另一个已经按空间顺序排序的数据集中加载的)。否则,这可以通过按一维空间键对数据进行排序来实现。一种方法是创建一个按几何值排序的新表(在最近的UDB-TS版本中使用了高效的希尔伯特曲线排序):

CREATE TABLE table_sorted AS
   SELECT * FROM table  ORDER BY geom;

或者,可以使用GeoHash作为(临时)索引,并在该索引上进行聚类,从而对数据进行就地排序:

CREATE INDEX idx_temp_geohash ON table
    USING btree (ST_GeoHash( ST_Transform( geom, 4326 ), 20));
CLUSTER table USING idx_temp_geohash;

geometry列上构建BRIN索引的语法是:

CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col] ); 

上面的语法构建了一个2D索引。要构建三维索引,请使用以下语法:

CREATE INDEX [indexname] ON [tablename]
    USING BRIN ([geome_col] brin_geometry_inclusion_ops_3d);

您还可以使用4D运算符类获得4D维索引:

CREATE INDEX [indexname] ON [tablename]
    USING BRIN ([geome_col] brin_geometry_inclusion_ops_4d);

上述命令使用一个范围内的默认块数,即128。要指定一个范围内要汇总的块数,请使用以下语法

CREATE INDEX [indexname] ON [tablename]
    USING BRIN ( [geome_col] ) WITH (pages_per_range = [number]); 

请记住,BRIN索引只为大量行存储一个索引条目。如果您的表存储具有混合维数的geometry,那么结果索引的性能可能会很差。通过选择存储geometry维数最少的操作符类,可以避免这种性能损失

BRIN索引支持geography数据类型。在地理列上构建布林索引的语法是:

CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geog_col] ); 

以上语法为椭球体上的地理空间对象建立了2D索引。

目前,只提供“包含支持”,这意味着只有&&, ~@运算符可用于2D情况(两种情况都适用geometrygeography),而且只是&&&3Dgeometry的运算符。目前不支持kNN搜索。

BRIN和其他索引类型的一个重要区别是,数据库不动态维护索引。对表中空间数据的更改只是附加到索引的末尾。随着时间的推移,这将导致索引搜索性能下降。可以通过执行VACUUM,或者通过使用特殊功能brin_summarize_new_values(regclass)。因此,BRIN可能最适合用于只读或很少更改的数据。

概括地说,将BRIN用于空间数据:

  • 索引构建时间非常快,索引大小非常小。

  • 索引查询时间比GiST慢,但仍然可以接受。

  • 要求表数据按空间顺序排序。

  • 需要手动维护索引。

  • 最适合非常大的表,重叠很少或没有重叠(例如点),这些表是静态的或很少更改。

  • 对于返回相对大量数据记录的查询更有效。

4.9.3 SP-GiST索引

SP-GiST代表 “Space-Partitioned Generalized Search Tree”,是多维数据类型的通用索引形式,支持分区的搜索树,如quad-trees, k-d trees, and radix trees (tries)。这些数据结构的共同特征是它们重复地将搜索空间划分成不需要相等大小的分区。除了空间索引之外,SP-GiST还用于加速多种数据的搜索,如电话路由、ip路由、子串搜索等。

与GiST索引的情况一样,SP-GiST索引是有损耗的,因为它们存储包围空间对象的边界框。SP-GiST索引可被视为GiST索引的替代方案。

一旦GIS数据表超过几千行,就可以使用空间索引来加速数据的空间搜索。在“geometry”列上构建SP-GiST索引的语法如下:

CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield] ); 

上述语法将构建一个二维索引。可以使用3D运算符类创建几何类型的三维索引:

CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield] spgist_geometry_ops_3d);

构建空间索引是一项计算密集型操作。它还会在其创建的时间内阻止对表的写访问,因此在生产系统上,您可能希望以一种较慢的CONCURRENTLY-aware方式进行:

CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING SPGIST ( [geometryfield] ); 

构建索引后,有时强制UDB-TX收集用于优化查询计划的表统计信息会很有帮助:

VACUUM ANALYZE [table_name] [(column_name)];

SP-GiST索引可以加速涉及以下运算符的查询:

  • <<, &<, &>, >>, <<|, &<|, |&>, |>>, &&, @>, <@, and ~=, for 2-dimensional indexes,

  • &/&、~==、@ > >和< < @,用于三维索引。

目前还不支持kNN搜索。

4.9.4 优化索引使用

通常,索引会无形地加速数据访问:一旦建立了索引,UDB-TX查询计划生成器会自动决定何时使用它来提高查询性能。但是在某些情况下,查询计划生成器不会选择使用现有的索引,因此查询最终会使用缓慢的顺序扫描而不是空间索引。

如果您发现空间索引没有被使用,您可以做一些事情:

  • 检查查询计划并检查您的查询是否确实计算了您需要的东西。一个错误的连接,无论是被遗忘还是连接到错误的表,都可能意外地多次检索表记录。要获取查询计划,请执行EXPLAIN在查询的前面。

  • 确保收集了关于表中值的数量和分布的统计信息,以便为查询规划器提供更好的信息,从而做出有关索引使用的决策。VACUUM ANALYZE将计算两者。

    无论如何,你应该定期清理你的数据库。许多UDB-TX数据库管理员运行VACUUM ANALYZE作为一个非高峰时期的定期cron工作。

  • 如果VACUUM没有帮助,可以使用命令临时强制计划员使用索引信息 *SET ENABLE_SEQSCAN TO OFF;这样,您就可以检查查询计划生成器是否能够为您的查询生成索引加速的查询计划。您应该只在调试时使用此命令;一般来说,查询计划生成器比你更清楚何时使用索引。一旦运行了查询,不要忘记运行*将ENABLE_SEQSCAN设置为ON;****以便计划程序可以正常处理其他查询。

  • 如果**SET ENABLE_SEQSCAN TO OFF;**帮助您的查询运行得更快,您的UDB-TX可能不适合您的硬件。如果您发现查询计划生成器对顺序扫描与索引扫描的成本估计有误,请尝试降低RANDOM_PAGE_COSTUDB-TX配置文件,或使用 SET RANDOM_PAGE_COST TO 1.1;RANDOM_PAGE_COST的默认值是4.0。尝试将其设置为1.1(对于SSD)或2.0(对于快速磁盘)。减小该值会使计划程序更有可能使用索引扫描。

  • 如果**SET ENABLE_SEQSCAN TO OFF;**对您的查询没有帮助,查询可能使用了查询计划生成器还无法优化的SQL结构。以查询计划生成器能够处理的方式重写查询是可能的。例如,带有内联SELECT的子查询可能不会产生有效的计划,但可以使用横向连接重写。

5 空间查询

空间数据库存在的理由就是它的主要任务是在数据库内部执行查询,这通常需要桌面GIS功能。有效地使用UDB-TS需要了解哪些空间函数可用,如何在查询中使用它们,并确保有适当的索引来提供良好的性能。

5.1 确定空间关系

空间关系表明两个几何图形如何相互作用。它们是查询几何图形的基本功能。

5.1.1 维度扩展的9-Intersection模型

根据 OpenGIS Simple Features Implementation Specification for SQL, 比较两个几何图形的基本方法是对两个几何图形的内部、边界和外部之间的相交进行成对测试,并根据所得‘相交’矩阵中的条目对两个几何图形之间的关系进行分类。”

在点集拓扑理论中,嵌入在二维空间中的几何图形中的点被分类为三个集合:

  • Boundary

    几何的边界是下一个更低维度的几何的集合。为POINTs,其维数为0,边界是空集。的边界LINESTRING是两个端点。为POLYGONs,边界是外环和内环的线条。

  • Interior

    几何的内部是几何中不在边界内的那些点。为POINTs,内部就是点本身。的内部LINESTRING是端点之间的点集。为POLYGONs,内部是多边形内部的面积曲面。

  • Exterior

    几何图形的外部是几何图形所嵌入的空间的其余部分;换句话说,所有点不在几何图形的内部或边界上。它是一个二维非封闭曲面。

维度扩展的9-Intersection(DE-9IM)通过为每个几何图形指定上述集合之间的9个交点的尺寸来描述两个几何图形之间的空间关系。交集尺寸可以正式表示为3x3交集矩阵.

对于几何图形g ** Interior, Boundary, and Exterior 用符号表示I(g), B(g),以及E(g)**。还有,dim(s)表示集合的维数s的域{0,1,2,F}:

  • 0= >点

  • 1= >线路

  • 2= >面积

  • F= >空集

使用这种符号,两个几何图形的交集矩阵ab是:

Interior Boundary Exterior
Interior dim( I(a) ∩ I(b)) dim( I(a) ∩ B(b)) dim( I(a) ∩ E(b))
Boundary dim( B(a) ∩ I(b)) dim( B(a) ∩ B(b)) dim( B(a) ∩ E(b))
Exterior dim( E(a) ∩ I(b)) dim( E(a) ∩ B(b)) dim( E(a) ∩ E(b))

从视觉上看,对于两个重叠的多边形几何体。

从左到右和从上到下阅读时,交集矩阵表示为文本字符串’212101212’.

5.1.2 命名空间关系

为了便于确定常见的空间关系,OGC SFS定义了一组命名空间关系谓词。UDB-TS提供了这些函数 ST_Contains, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within。它还定义了非标准的关系谓词 ST_Covers, ST_CoveredBy, 以及 ST_ContainsProperly

空间谓词通常用作SQL中的条件WHERE或者JOIN条款。如果空间索引可用,命名空间谓词会自动使用空间索引,因此不需要使用边界框操作符&&也是。例如:

SELECT city.name, state.name, city.geom
FROM city JOIN state ON ST_Intersects(city.geom, state.geom);

5.1.3 一般空间关系

在某些情况下,命名的空间关系不足以提供期望的空间过滤条件。

img例如,考虑表示道路网络的线性数据集。可能需要识别所有相互交叉的路段,不是在一个点上,而是在一条线上(可能是为了验证一些业务规则)。这种情况下ST_Crosses不提供必要的空间过滤器,因为对于线性要素,只有在它们相交在一个点上时,它返回true。两步解决方案是首先计算实际的交点(ST_Intersection)在空间上相交的道路线对(ST_Intersects),然后检查交叉点的ST_GemometryType’是’LINESTRING ( 正确处理[MULTI]POINTs,[MULTI]LINESTRING的返回值是GEOMETRYCOLLECTION`等)。显然,更简单、更快速的解决方案是可取的。

img第二个例子是定位在与湖的边界相交并且码头的一端在岸上的码头。换句话说,当码头在湖内但不完全被湖包含时,与湖的边界在一条线上相交,并且码头的一个端点正好在湖的边界内或边界上。可以使用空间谓词的组合来找到所需的特性:

  • ST_Contains(lake, wharf) = TRUE

  • ST_ContainsProperly(lake, wharf) = FALSE

  • ST_GeometryType(ST_Intersection(wharf, lake)) = ‘LINESTRING’

  • ST_NumGeometries(ST_Multi(ST_Intersection(ST_Boundary(wharf), ST_Boundary(lake)))) = 1

不用说,这是相当复杂的。

这些要求可以通过计算完整的DE-9IM交集矩阵来满足。UDB-TS提供了ST_Relate函数来完成此操作:

SELECT ST_Relate( 'LINESTRING (1 1, 5 5)',
                  'POLYGON ((3 3, 3 7, 7 7, 7 3, 3 3))' );
st_relate
-----------
1010F0212

为了测试特定的空间关系交集矩阵模式已使用。这是增加了附加符号的矩阵表示{T,*}:

  • T= >交集维度非空;即处于{0,1,2}

  • *= >不关注

使用交集矩阵模式,可以以更简洁的方式评估特定的空间关系。ST_RelateST_RelateMatch函数可以用来测试交集矩阵模式。对于上面的第一个例子,指定在一条线上相交的两条直线的相交矩阵模式是 ‘1*1****1**’:

-- Find road segments that intersect in a line
SELECT a.id
FROM roads a, roads b
WHERE a.id != b.id
      AND a.geom && b.geom
      AND ST_Relate(a.geom, b.geom, '1*1***1**');

对于第二个例子,指定一条线部分在多边形内部,部分在多边形外部的交集矩阵模式是**’102101FF2’**:

-- Find wharves partly on a lake's shoreline
SELECT a.lake_id, b.wharf_id
FROM lakes a, wharfs b
WHERE a.geom && b.geom
      AND ST_Relate(a.geom, b.geom, '102101FF2');

5.2 使用空间索引

使用空间条件构建查询时,为了获得最佳性能,确保使用空间索引(如果存在)是很重要的(请参见第4.9节,“空间索引”). 为此,必须在中使用空间运算符或索引感知函数WHERE或者ON查询的子句。

空间运算符包括边界框运算符(其中最常用的是**&&;看见第7.10.1节,“边界框运算符”完整列表**)和最近邻查询中使用的距离运算符(最常见的是**<->;参见第7.10.2节,“距离运算符”**查看完整列表。)

索引感知函数自动将边界框运算符添加到空间条件中。索引感知函数包括命名的空间关系谓词ST_Contains, ST_ContainsProperly, ST_CoveredBy, ST_Covers, ST_Crosses, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, 及ST_3DIntersects, 和距离谓词 ST_DWithin, ST_DFullyWithin, ST_3DDFullyWithin, 和 ST_3DDWithin .)

诸如函数ST_Distance不使用索引来优化它们的操作。例如,以下查询在大型表上会非常慢:

SELECT geom
FROM geom_table
WHERE ST_Distance( geom, 'SRID=312;POINT(100000 200000)' ) < 100

此查询从表geom_table选择与点(100000,200000)的100个单位内所有几何图形。它会很慢,因为它正在计算表中每个点与指定点之间的距离,即。一个ST_Distance()计算的目的是每一表中的行。

使用索引感知函数ST_DWithin可以大大减少处理的行数:

SELECT geom
FROM geom_table
WHERE ST_DWithin( geom, 'SRID=312;POINT(100000 200000)', 100 )

该查询选择相同的几何图形,但它以更有效的方式进行。这是通过ST_DWithin()使用&&运算符方式实现的,在查询geometry的扩展边界框上进行内部运算。如果geom上有空间索引,查询优化处理器将认识到它可以在计算距离之前使用索引来减少扫描的行数。空间索引仅允许检索其边界框与扩展范围重叠的几何记录,因此可能在要求的距离内。然后计算实际距离,以确认是否将记录包含在结果集中。

5.3 空间SQL的示例

本节中的示例使用了线性道路表和多边形城市边界表。bc_roads表的定义是:

Column    | Type              | Description
----------+-------------------+-------------------
gid       | integer           | Unique ID
name      | character varying | Road Name
geom      | geometry          | Location Geometry (Linestring)

bc_municipality表的定义是:

Column   | Type              | Description
---------+-------------------+-------------------
gid      | integer           | Unique ID
code     | integer           | Unique ID
name     | character varying | City / Town Name
geom     | geometry          | Location Geometry (Polygon)

5.3.1 所有道路的总长度是多少,用公里表示?

您可以用一段非常简单的SQL来回答这个问题:

SELECT sum(ST_Length(geom))/1000 AS km_roads FROM bc_roads;

km_roads
------------------
70842.1243039643

5.3.2 乔治王子城有多大,以公顷计?

该查询将属性条件(针对自治市名称)与空间计算(针对面区域)相结合:

SELECT
  ST_Area(geom)/10000 AS hectares
FROM bc_municipality
WHERE name = 'PRINCE GEORGE';

hectares
------------------
32657.9103824927

5.3.3 按面积计算,该省最大的直辖市是哪个?

该查询使用空间测量值作为排序值。有几种方法可以解决这个问题,但最有效的方法如下:

SELECT
  name,
  ST_Area(geom)/10000 AS hectares
FROM bc_municipality
ORDER BY hectares DESC
LIMIT 1;

name           | hectares
---------------+-----------------
TUMBLER RIDGE  | 155020.02556131

注意,为了回答这个问题,我们必须计算每个多边形的面积。如果我们经常这样做,那么向表中添加一个area列是有意义的,这样可以为性能建立索引。通过按降序对结果进行排序,然后使用UDB-TX的“LIMIT”命令,我们可以轻松地选择最大值,而无需使用像MAX()这样的聚合函数。

5.3.4 每个城市内完全包含的道路长度是多少?

这是一个“空间连接”的示例,它使用空间交互(“包含”)作为连接条件(而不是通常的连接一个公共键的关系方法),将两个表中的数据(通过连接)放在一起:

SELECT
  m.name,
  sum(ST_Length(r.geom))/1000 as roads_km
FROM bc_roads AS r
JOIN bc_municipality AS m
  ON ST_Contains(m.geom, r.geom)
GROUP BY m.name
ORDER BY roads_km;

name                        | roads_km
----------------------------+------------------
SURREY                      | 1539.47553551242
VANCOUVER                   | 1450.33093486576
LANGLEY DISTRICT            | 833.793392535662
BURNABY                     | 773.769091404338
PRINCE GEORGE               | 694.37554369147
...

这个查询需要一段时间,因为表中的每条道路都被汇总到最终结果中(示例表中大约有25万条道路)。对于较小的数据集(几百条记录上的几千条记录),响应可能非常快。

5.3.5 创建一个包含乔治王子城市内所有道路的新表。

这是一个“叠加”的例子,它接受两个表,并输出一个由空间裁剪或切割结果组成的新表。与上面演示的“空间连接”不同,该查询创建了新的几何。叠加就像涡轮增压的空间连接,对于更精确的分析工作非常有用:

CREATE TABLE pg_roads as
SELECT
  ST_Intersection(r.geom, m.geom) AS intersection_geom,
  ST_Length(r.geom) AS rd_orig_length,
  r.*
FROM bc_roads AS r
JOIN bc_municipality AS m
  ON ST_Intersects(r.geom, m.geom)
WHERE
  m.name = 'PRINCE GEORGE';

5.3.6 维多利亚的“道格拉斯街”以公里计有多长?

SELECT
  sum(ST_Length(r.geom))/1000 AS kilometers
FROM bc_roads r
JOIN bc_municipality m
  ON ST_Intersects(m.geom, r.geom
WHERE
  r.name = 'Douglas St'
  AND m.name = 'VICTORIA';

kilometers
------------------
4.89151904172838

5.3.7 有孔洞的最大市政多边形是什么?

SELECT gid, name, ST_Area(geom) AS area
FROM bc_municipality
WHERE ST_NRings(geom) > 1
ORDER BY area DESC LIMIT 1;

gid  | name         | area
-----+--------------+------------------
12   | SPALLUMCHEEN | 257374619.430216

6 应用开发

6.1 使用MapServer

Minnesota Mapserver 是一个互联网网络地图服务器,符合OpenGIS网络地图服务规范。

  • MapServer主页位于http://mapserver.org.

  • OpenGIS Web地图服务规范位于http://www.opengeospatial.org/standards/wms.

6.1.1 基本用法

要在MapServer中使用UDB-TS,您需要知道如何配置MapServer,这超出了本文档的范围。本节涵盖特定的UDB-TS问题和配置详细信息。

要在MapServer中使用UDB-TS,需要:

  • MapServer 3.5版或更高版本。

MapServer访问UDB-TS/UDB-TX数据就像任何其他UDB-TX客户端一样,使用libpq界面。这意味着MapServer可以安装在任何能够通过网络访问UDB-TS服务器的计算机上,并使用UDB-TS作为数据源。系统之间的连接越快越好。

  1. 编译并安装MapServer,使用您想要的任何选项,包括”- with-postgis “配置选项。

  2. 在MapServer地图文件中,添加PostGIS图层(兼容UDB-TS)。例如:

    LAYER
      CONNECTIONTYPE postgis
      NAME "widehighways"
      # Connect to a remote spatial database
      CONNECTION "user=dbuser dbname=gisdatabase host=bigserver"
      PROCESSING "CLOSE_CONNECTION=DEFER"
      # Get the lines from the 'geom' column of the 'roads' table
      DATA "geom from roads using srid=4326 using unique gid"
      STATUS ON
      TYPE LINE
      # Of the lines in the extents, only render the wide highways
      FILTER "type = 'highway' and numlanes >= 4"
      CLASS
        # Make the superhighways brighter and 2 pixels wide
        EXPRESSION ([numlanes] >= 6)
        STYLE
          COLOR 255 22 22
          WIDTH 2
        END
      END
      CLASS
        # All the rest are darker and only 1 pixel wide
        EXPRESSION ([numlanes] < 6)
        STYLE
          COLOR 205 92 82
        END
      END
    END
    

    在上面的示例中,特定于UDB-TS的指令如下:

    • 连接类型

      对于postgis图层,这始终是“PostGIS”。

    • 关系

      数据库连接由“连接字符串”控制,它是一组标准的键和值,如下所示(默认值在<>中):用户= <用户名>密码= <密码>数据库名= <用户名>主机名= <服务器>端口=<5678 >空连接字符串仍然有效,任何键/值对都可以省略。一般来说,您至少需要提供数据库名称和用户名来进行连接。

    • 数据

      此参数的形式为“<表名>中的< geocolumn >使用srid=使用唯一<主键>”,其中列是要渲染到地图的空间列,srid是该列使用的srid,主键是表主键(或任何其他具有索引的唯一值列)。您可以省略“使用srid”和“使用唯一”子句,MapServer将尽可能自动确定正确的值,但代价是每次绘制地图时都要在服务器上运行一些额外的查询。

    • 处理

      如果您有多个层,则输入CLOSE_CONNECTION=DEFER可以重用现有的连接,而不是关闭它们。这提高了速度。请参考MapServer PostGIS性能提示以获得更详细的解释。

    • 过滤器

      筛选器必须是有效的SQL字符串,对应于SQL查询中通常跟在“WHERE”关键字后面的逻辑。因此,例如,要仅渲染具有6条或更多车道的道路,请使用“车道数> = 6”过滤器。

  3. 在空间数据库中,确保为将要绘制的任何图层构建了空间(GiST)索引。

    CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );
    
  4. 如果要使用MapServer查询图层,还需要在数据语句中使用“使用唯一”子句。

    在进行查询时,MapServer需要每个空间记录的唯一标识符,MapServer的PostGIS模块使用您指定的唯一值来提供这些唯一标识符。使用表主键是最佳实践。

6.1.2 常见问题

6.1.2.1 当我使用EXPRESSION在我的地图文件中,条件从不返回true,即使我知道值存在于我的表中。

与形状文件不同,UDB-TS字段名称必须在表达式中使用小写字母

EXPRESSION ([numlanes] >= 6)
6.1.2.2 我用于Shapefiles的过滤器不适用于相同数据的UDB-TS表

形状文件不同,PostGIS图层的过滤器使用SQL语法(它们被附加到PostGIS连接器为MapServer中的绘图图层生成的SQL语句中)。

FILTER "type = 'highway' and numlanes >= 4"
6.1.2.3 我的PostGIS图层绘制速度比Shapefile图层慢很多,这正常吗?

通常,在给定地图中绘制的要素越多,UDB-TS就越有可能比Shapefiles慢。对于要素相对较少的地图(100个),UDB-TS通常会更快。对于具有高要素密度(1000s)的地图,UDB-TS总是较慢。如果您发现了大量的绘制性能问题,则可能是因为您还没有在表上建立空间索引。

unvdb# CREATE INDEX geotable_gix ON geotable USING GIST ( geocolumn );
unvdb# VACUUM ANALYZE;
6.1.2.4 我的PostGIS图层绘制得很好,但是查询非常慢。怎么了?

为了提高查询速度,您的空间表必须有一个唯一键,并且必须在该唯一键上有一个索引。您可以指定mapserver使用什么唯一键在DATA行中通过USING UNIQUE子句。

DATA "geom FROM geotable USING UNIQUE gid"
6.1.2.5 我可以使用**”geography”**列作为MapServer图层的来源吗?

当然!MapServer认为geography列与geometry列相同,但总是使用4326的SRID。请确保在DATA语句中包含“using srid=4326”子句。其他一切都与geometry完全一样。

6.1.3 高级用法

USING伪SQL子句用于添加一些信息,以帮助mapserver理解更复杂查询的结果。更具体地说,当视图或子选择用作源表时(在DATA定义)mapserver更难自动确定每行的唯一标识符以及表的SRID。这USING子句可以为mapserver提供如下两条信息:

DATA "geom FROM (
  SELECT
    table1.geom AS geom,
    table1.gid AS gid,
    table2.data AS data
  FROM table1
  LEFT JOIN table2
  ON table1.id = table2.id
) AS new_table USING UNIQUE gid USING SRID=4326"
  • USING UNIQUE

    MapServer要求每行都有一个唯一的id,以便在进行地图查询时识别该行。通常它从系统表中识别主键。但是,视图和子选择不会自动拥有已知的唯一列。如果您想使用MapServer的查询功能,您需要确保您的视图或子选择包含唯一值列,并使用USING UNIQUE去声明。

  • USING SRID=

    UDB-TS需要知道几何图形正在使用哪个空间参考系统,以便将正确的数据返回到MapServer。通常可以在PostGIS数据库的“geometry_columns”表中找到此信息,但是,对于动态创建的表(如子选择和视图)来说,这是不可能的。所以USING SRID=选项允许在DATA定义中指定正确的 SRID。

6.1.4 例子

让我们从一个简单的例子开始,一步步来。考虑以下MapServer图层定义:

LAYER
  CONNECTIONTYPE postgis
  NAME "roads"
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
  DATA "geom from roads"
  STATUS ON
  TYPE LINE
  CLASS
    STYLE
      COLOR 0 0 0
    END
  END
END

该图层将以黑线显示roads表中的所有道路几何图形。

现在,假设我们只想显示公路,直到我们放大到至少1:100000的比例,接下来的两个图层将达到这种效果:

LAYER
  CONNECTIONTYPE postgis
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
  PROCESSING "CLOSE_CONNECTION=DEFER"
  DATA "geom from roads"
  MINSCALE 100000
  STATUS ON
  TYPE LINE
  FILTER "road_type = 'highway'"
  CLASS
    COLOR 0 0 0
  END
END
LAYER
  CONNECTIONTYPE postgis
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
  PROCESSING "CLOSE_CONNECTION=DEFER"
  DATA "geom from roads"
  MAXSCALE 100000
  STATUS ON
  TYPE LINE
  CLASSITEM road_type
  CLASS
    EXPRESSION "highway"
    STYLE
      WIDTH 2
      COLOR 255 0 0
    END
  END
  CLASS
    STYLE
      COLOR 0 0 0
    END
  END
END

当比例大于1:100000时,使用第一个图层,仅将“公路”类型的道路显示为黑线。这FILTER选项导致只显示“公路”类型的道路。

第二层在比例小于1:100000时使用,将高速公路显示为双粗红线,其他道路显示为普通黑线。

所以,我们只用MapServer功能做了一些有趣的事情,但是我们的DATASQL语句保持简单。假设道路的名称存储在另一个表中(出于某种原因),我们需要执行一个连接来获取它并标记我们的道路。

LAYER
  CONNECTIONTYPE postgis
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
  DATA "geom FROM (SELECT roads.gid AS gid, roads.geom AS geom,
        road_names.name as name FROM roads LEFT JOIN road_names ON
        roads.road_name_id = road_names.road_name_id)
        AS named_roads USING UNIQUE gid USING SRID=4326"
  MAXSCALE 20000
  STATUS ON
  TYPE ANNOTATION
  LABELITEM name
  CLASS
    LABEL
      ANGLE auto
      SIZE 8
      COLOR 0 192 0
      TYPE truetype
      FONT arial
    END
  END
END

当比例降至1:20000或更低时,此注记图层会向所有道路添加绿色标签。它还演示了如何在DATA定义。

6.2 Java客户端(JDBC)

Java客户端可以访问UDB-TX数据库中的UDB-TS “geometry” 对象,可以直接作为文本表示,也可以使用与UDB-TS绑定在一起的JDBC扩展对象。为了使用扩展对象,“postgis.jar”文件必须与“PostgreSQL . jar”JDBC驱动程序包一起位于您的类路径中(UDB-TX 及 UDB-TS高度兼容)。

import java.sql.*;
import java.util.*;
import java.lang.*;
import org.postgis.*;

public class JavaGIS {

public static void main(String[] args) {

  java.sql.Connection conn;

  try {
    /*
    * Load the JDBC driver and establish a connection.
    */
    Class.forName("org.postgresql.Driver");
    String url = "jdbc:postgresql://localhost:5432/database";
    conn = DriverManager.getConnection(url, "postgres", "");
    /*
    * Add the geometry types to the connection. Note that you
    * must cast the connection to the pgsql-specific connection
    * implementation before calling the addDataType() method.
    */
    ((org.postgresql.PGConnection)conn).addDataType("geometry",Class.forName("org.postgis.PGgeometry"));
    ((org.postgresql.PGConnection)conn).addDataType("box3d",Class.forName("org.postgis.PGbox3d"));
    /*
    * Create a statement and execute a select query.
    */
    Statement s = conn.createStatement();
    ResultSet r = s.executeQuery("select geom,id from geomtable");
    while( r.next() ) {
      /*
      * Retrieve the geometry as an object then cast it to the geometry type.
      * Print things out.
      */
      PGgeometry geom = (PGgeometry)r.getObject(1);
      int id = r.getInt(2);
      System.out.println("Row " + id + ":");
      System.out.println(geom.toString());
    }
    s.close();
    conn.close();
  }
catch( Exception e ) {
  e.printStackTrace();
  }
}
}

“PGgeometry”对象是一个包装对象,它包含一个特定的拓扑几何对象(抽象类“geometry”的子类),具体取决于类型:点、线串、多边形、多点、多线串、多多边形。

PGgeometry geom = (PGgeometry)r.getObject(1);
if( geom.getType() == Geometry.POLYGON ) {
  Polygon pl = (Polygon)geom.getGeometry();
  for( int r = 0; r < pl.numRings(); r++) {
    LinearRing rng = pl.getRing(r);
    System.out.println("Ring: " + r);
    for( int p = 0; p < rng.numPoints(); p++ ) {
      Point pt = rng.getPoint(p);
      System.out.println("Point: " + p);
      System.out.println(pt.toString());
    }
  }
}

扩展对象的JavaDoc为几何对象中的各种数据访问器函数提供了参考。

7 GIS参考

下面给出的函数是UDB-TS用户可能需要的功能。还有其他一些函数是PostGIS对象所需的支持功能,但对一般用户没有用处。

7.1 UDB-TS Geometry/Geography/Box 数据类型

本节列出了由UDB-TS安装的用于表示空间数据的自定义UDB-TX数据类型。

每种数据类型描述其类型转换行为。type cast 将一种数据类型的值转换为另一种数据类型。UDB-TX允许定义自定义类型的转换行为,以及用于转换类型值的函数。Casts 可以有自动的行为,该行为允许将函数参数自动转换为该函数支持的类型。

有些casts 有明确的行为,这意味着强制转换必须使用语法指定CAST(myval As sometype)或者myval::sometype。显式强制转换避免了不明确的强制转换问题,这种问题在使用不支持给定类型的重载函数时会发生。例如,函数可以接受box2d或box3d,但不能接受geometry。由于geometry自动转换为两种box类型,因此会产生“ambiguous function”错误。为了防止该错误,请使用到所需box类型的显式强制转换。

所有数据类型都可以转换为text,所以不需要显式指定。

  • box2d-表示二维边界框的box类型。

  • box3d-表示三维边界框的box类型。

  • geometry-使用平面坐标系表示空间要素的类型。

  • geometry_dump-用于描述复杂几何零件的复合类型。

  • geography-使用大地(椭球)坐标系表示空间要素的类型。

7.2 表管理功能

这些函数有助于定义包含几何列的表。

  • AddGeometryColumn-将geometry列添加到现有表中。

  • DropGeometryColumn-从空间表中移除geometry列。

  • DropGeometryTable-删除表及其所有在geometry_columns中的引用。

  • Find_SRID-返回为geometry列定义的SRID。

  • Populate_Geometry_Columns-确保使用类型修饰符定义geometry列或具有适当的空间约束。

  • UpdateGeometrySRID-更新geometry列中所有要素的SRID和表元数据。

7.3 Geometry构造函数

  • ST_Collect-从一组几何图形创建几何集合或多重几何。

  • ST_LineFromMultiPoint-从多点geometry创建线串。

  • ST_MakeEnvelope-从最小和最大坐标创建矩形多边形。

  • ST_MakeLine-从点、多点或线段geometry创建线串。

  • ST_MakePoint-创建2D 、3DZ 或4D点。

  • ST_MakePointM-从X、Y和M值创建一个点。

  • ST_MakePolygon-从外壳和可选的孔洞列表创建多边形。

  • ST_Point-用X,Y与SRID值创建一个点。

  • ST_PointZ-用X,Y,Z和SRID值创建一个点。

  • ST_PointM-用X,Y,M和SRID值创建一个点。

  • ST_PointZM-用X,Y,Z,M和SRID值创建一个点。

  • ST_Polygon-根据具有指定SRID的线段创建多边形。

  • ST_TileEnvelope-使用XYZ分块系统在Web墨卡托(SRID:3857)中创建矩形多边形。

  • ST_HexagonGrid—返回一组完全覆盖几何参数边界的六边形和像元索引。

  • ST_Hexagon-使用六边形网格空间内提供的边大小和像元坐标返回单个六边形。

  • ST_SquareGrid—返回一组完全覆盖geometry参数边界的网格正方形和单元索引。

  • ST_Square—使用正方形网格空间内提供的边大小和单元坐标返回单个正方形。

  • ST_Letters-返回渲染为geometry的输入字母,默认起始位置在原点,默认文本高度为100。

7.4 Geometry访问器

  • GeometryType-以文本形式返回geometry的类型。

  • ST_Boundary-返回geometry的边界。

  • ST_boundingDiagonal-返回geometry边界框的对角线。

  • ST_CoordDim-返回geometry的坐标尺寸。

  • ST_Dimension-返回geometry的拓扑尺寸。

  • ST_Dump—返回一组geometry_dumpgeometry组件的行。

  • ST_DumpPoints—返回一组geometry_dumpgeometry中的坐标行。

  • ST_DumpSegments—返回一组geometry_dumpgeometry中线段的行。

  • ST_DumpRings—返回一组geometry_dump多边形外环和内环的行。

  • ST_EndPoint—返回线条或圆形线条的最后一点。

  • ST_Envelope-返回表示geometry边界框的geometry。

  • ST_ExteriorRing—返回表示多边形外环的线段。

  • ST_GeometryN-返回geometry集合的元素。

  • ST_GeometryType-以文本形式返回geometry的SQL-MM类型。

  • ST_HasArc-测试geometry是否包含圆弧

  • ST_InteriorRingN-返回多边形的第n个内环(孔)。

  • ST_IsClosed-测试线段的起点和终点是否重合。对于多面体表面,测试它是否闭合(体积)。

  • ST_IsCollection-测试geometry是否为geometry集合类型。

  • ST_IsEmpty-测试geometry是否为空。

  • ST_IsPolygonCCW-测试多边形是否具有逆时针方向的外环和顺时针方向的内环。

  • ST_IsPolygonCW-测试多边形是否有顺时针方向的外环和逆时针方向的内环。

  • ST_IsRing—测试线段是否闭合且简单。

  • ST_IsSimple-测试geometry是否没有自相交或自相切的点。

  • ST_M-返回点的M坐标。

  • ST_MemSize-返回geometry占用的内存空间量。

  • ST_NDims-返回geometry的坐标尺寸。

  • ST_NPoints-返回geometry中的点数(顶点)。

  • ST_NRings-返回多边形geometry中的环数。

  • ST_NumGeometries-返回geometry集合中的元素数量。

  • ST_NumInteriorRings-返回多边形内部环(孔)的数量。

  • ST_NumInteriorRing-返回多边形内部环(孔)的数量。ST _ NumInteriorRings的Aias

  • ST_NumPatches-返回多面体表面上的面数。对于非多面体geometry,将返回null。

  • ST_NumPoints—返回线段或圆串中的点数。

  • ST_PatchN-返回多面体表面的第n个geometry图形(面)。

  • ST_PointN-返回geometry中第一个线段或圆形线段中的第n个点。

  • ST_Points-返回包含geometry坐标的多点。

  • ST_StartPoint-返回线条的第一个点。

  • ST_Summary-返回geometry内容的文本抽象。

  • ST_X-返回点的X坐标。

  • ST_Y-返回点的Y坐标。

  • ST_Z-返回点的Z坐标。

  • ST_Zmflag-返回指示geometry的ZM坐标尺寸的代码。

7.5 Geometry编辑器

这些函数通过改变类型、结构或顶点来创建修改的几何图形。

  • ST_AddPoint-向线段添加一个点。

  • ST_CollectionExtract—给定几何集合,返回仅包含指定类型元素的多重几何。

  • ST_CollectionHomogenize-返回几何集合的最简单表示。

  • ST_CurveToLine-将包含曲线的几何转换为线性几何。

  • ST_Scroll—更改闭合线段的起点。

  • ST_FlipCoordinates-返回X轴和Y轴翻转的几何版本。

  • ST_Force2D-强制几何进入“二维模式”。

  • ST_Force3D-强制几何进入XYZ模式。这是ST_Force3DZ的别名。

  • ST_Force3DZ-强制几何进入XYZ模式。

  • ST_Force3DM-强制几何进入XYM模式。

  • ST_Force4D-强制几何进入XYZM模式。

  • ST_ForcePolygonCCW-逆时针定向所有外环,顺时针定向所有内环。

  • ST_ForceCollection-将几何转换为GEOMETRYCOLLECTION。

  • ST_ForcePolygonCW-顺时针定向所有外环,逆时针定向所有内环。

  • ST_ForceSFS-强制几何仅使用SFS 1.1几何类型。

  • ST_ForceRHR-强制多边形中的顶点方向遵循右手定则。

  • ST_ForceCurve-如果适用,将几何向上投影为其弯曲类型。

  • ST_LineToCurve-将线性几何转换为曲线几何。

  • ST_Multi-将几何作为多重*几何返回。

  • ST_Normalize-以标准形式返回几何。

  • ST_QuantizeCoordinates-将坐标的最低有效位设置为零

  • ST_RemovePoint—从线段中移除点。

  • ST_RemoveRepeatedPoints-返回删除了重复点的几何版本。

  • ST_Reverse-返回顶点顺序相反的几何。

  • ST_Segmentize-返回没有线段长于给定距离的修改后的几何/地理。

  • ST_SetPoint-用给定点替换线段的点。

  • ST_ShiftLongitude-在-180°之间移动几何的经度坐标..180和0..360.

  • ST_WrapX-将几何环绕在X值周围。

  • ST_SnapToGrid-将输入几何的所有点捕捉到规则格网。

  • ST_Snap-将输入几何的线段和顶点捕捉到参考几何的顶点。

  • ST_SwapOrdinates-返回交换了给定纵坐标值的给定几何的版本。

7.6 Geometry验证

这些函数根据OGC SFS标准测试几何图形是否有效。它们还提供关于病残性质和位置的信息。还有一个从无效几何图形创建有效几何图形的功能。

  • ST_IsValid-测试几何在2D中是否是格式良好的。

  • ST_IsValidDetail-返回一个valid_detail说明几何是否有效的行,以及无效的原因和位置。

  • ST_IsValidReason-返回说明几何是否有效或无效原因的文本。

  • ST_MakeValid-尝试在不丢失顶点的情况下使无效几何有效。

7.7 空间参考系统函数

这些函数用于定义在spatial_ref_sys表的几何空间参考系统。

  • ST_SetSRID-在几何上设置SRID。

  • ST_SRID-返回几何的空间参考标识符。

  • ST_Transform-返回坐标转换到不同空间参考系统的新几何。

7.8 Geometry输入

这些函数从各种文本或二进制格式创建几何对象。

7.8.1 Well-Known Text(WKT)

  • ST_BdPolyFromText—给定闭合线段的任意集合作为多线段众所周知的文本表示,构造一个多边形。

  • ST_BdMPolyFromText—在给定闭合线段的任意集合作为多线段文本表示众所周知的文本表示的情况下,构造一个多多边形。

  • ST_GeogFromText—从已知文本表示或扩展(WKT)中返回指定的地理值。

  • ST_GeographyFromText—从已知文本表示或扩展(WKT)中返回指定的地理值。

  • ST_GeomCollFromText-用给定的SRID从集合WKT创建集合几何。如果没有给出SRID,则默认为0。

  • ST_GeomFromEWKT-从扩展的已知文本表示(EWKT)返回指定的ST_Geometry值。

  • ST_GeomFromMARC21—将MARC21/XML地理数据作为输入,并返回PostGIS几何对象。

  • ST_GeometryFromText—从已知文本表示(WKT)中返回指定的ST_Geometry值。这是ST_GeomFromText的别名

  • ST_GeomFromText—从已知文本表示(WKT)中返回指定的ST_Geometry值。

  • ST_LineFromText文本-用给定的SRID从WKT表示创建几何。如果没有给出SRID,则默认为0。

  • ST_MLineFromText-从WKT制图表达中返回指定的ST_MultiLineString值。

  • ST_MPointFromText-用给定的SRID从WKT创建几何。如果没有给出SRID,则默认为0。

  • ST_MPolyFromText-根据给定的SRID从WKT创建多多边形几何。如果没有给出SRID,则默认为0。

  • ST_PointFromText-使用给定的SRID从WKT创建点几何。如果没有给出SRID,则默认为未知。

  • ST_PolygonFromText-用给定的SRID从WKT创建几何。如果没有给出SRID,则默认为0。

  • ST_WKTToSQL—从已知文本表示(WKT)中返回指定的ST_Geometry值。这是ST_GeomFromText的别名

7.8.2 Well-Known Binary(WKB)

  • ST_GeogFromWKB-从已知二进制几何表示(WKB)或扩展的已知二进制(EWKB)创建地理实例。

  • ST_GeomFromEWKB-从扩展的已知二进制表示(EWKB)返回指定的ST_Geometry值。

  • ST_GeomFromWKB-从已知的二元几何表示(WKB)和可选的SRID创建几何实例。

  • ST_LineFromWKB—生成一个LINESTRING从WKB与给定的SRID

  • ST_LinestringFromWKB-使用给定的SRID从WKB创建几何。

  • ST_PointFromWKB-使用给定的SRID从WKB创建几何

  • ST_WKBToSQL-从已知的二进制表示(WKB)中返回指定的ST_Geometry值。这是不采用srid的ST_GeomFromWKB的别名

7.8.3 其他格式

  • ST_Box2dFromGeoHash—从GeoHash字符串返回BOX2D。

  • ST_GeomFromGeoHash-从GeoHash字符串返回几何。

  • ST_GeomFromGML-将几何的GML表示作为输入,并输出PostGIS几何对象

  • ST_GeomFromGeoJSON-将几何的geojson表示作为输入,并输出PostGIS几何对象

  • ST_GeomFromKML-将几何的KML表示作为输入,并输出PostGIS几何对象

  • ST_GeomFromTWKB-从TWKB(“微小的已知二进制”)几何表示创建几何实例。

  • ST_GMLToSQL-从GML制图表达中返回指定的ST_Geometry值。这是ST_GeomFromGML的别名

  • ST_LineFromEncodedPolyline-从编码的折线创建线段。

  • ST_PointFromGeoHash-从GeoHash字符串返回一个点。

  • ST_FromFlatGeobufToTable-基于FlatGeobuf数据的结构创建表格。

  • ST_FromFlatGeobuf-读取FlatGeobuf数据。

7.9 Geometry输出

7.9.1 Well-Known Text(WKT)

  • ST_AsEWKT-返回带有SRID元数据的几何的已知文本(WKT)表示。

  • ST_AsText-返回几何/地理的已知文本(WKT)表示,不含SRID元数据。

7.9.2 Well-Known Binary(WKB)

  • ST_AsBinary—返回几何/地理的OGC/ISO已知二进制(WKB)表示,不含SRID元数据。

  • ST_AsEWKB-返回带有SRID元数据的几何的扩展已知二进制(EWKB)表示。

  • ST_AsHEXEWKB-使用小端(NDR)或大端(XDR)编码以HEXEWKB格式(作为文本)返回几何。

7.9.3 其他格式

  • ST_AsEncodedPolyline-从线段几何返回编码折线。

  • ST_AsFlatGeobuf—返回一组行的FlatGeobuf表示形式。

  • ST_AsGeobuf—返回一组行的Geobuf表示。

  • ST_AsGeoJSON-将几何作为GeoJSON元素返回。

  • ST_AsGML-将几何作为GML版本2或3元素返回。

  • ST_AsKML-将几何作为KML元素返回。

  • ST_AsLatLonText—返回给定点的度、分、秒表示。

  • ST_AsMARC21-以带有地理数据字段(034)的MARC21/XML记录的形式返回几何。

  • ST_AsMVTGeom-将几何变换到MVT瓦片的坐标空间中。

  • ST_AsMVT-返回一组行的MVT表示的聚合函数。

  • ST_AsSVG-返回几何的SVG路径数据。

  • ST_AsTWKB-以TWKB的形式返回几何,也称为“微小的已知二进制”

  • ST_AsX3D-以X3D xml节点元素格式返回几何图形:ISO-IEC-19776-1.2-X3D encodings-XML

  • ST_GeoHash-返回几何的GeoHash表示。

7.10 运算符

7.10.1 边界框运算符

  • &&—如果A的2D边界框与B的2D边界框相交,返回TRUE

  • &&(geometry,box2df)—如果几何的(缓存的)2D边界框与2D浮点精度边界框(BOX2DF)相交,返回TRUE

  • &&(box2df,geometry)—如果2D浮点精度边界框(BOX2DF)与几何的(缓存的)2D边界框相交,返回TRUE

  • &&(box2df,box2df)—如果两个2D浮点精度边界框(BOX2DF)彼此相交,返回TRUE

  • &&&—如果A的n-D边界框与B的n-D边界框相交,返回TRUE

  • &&&(geometry,gidx)—如果几何的(缓存的)n-D边界框与n-D浮点精度边界框(GIDX)相交,返回TRUE

  • &&&(gidx,geometry)—如果n-D浮点精度边界框(GIDX)与几何的(缓存的)n-D边界框相交,返回TRUE

  • &&&(gidx,gidx)—如果两个n-D浮点精度边界框(GIDX)彼此相交,返回TRUE

  • &<—如果A的边界框与B的重叠或者在B的左边,返回TRUE

  • &<|—如果A的边界框与B的重叠或者在B的下面,返回TRUE

  • &>—如果A的边界框与B的重叠或者在B的右边,返回TRUE

  • <<—如果A的边界框严格地在B的左边,返回TRUE

  • <<|—如果A的边界框严格低于B的边界框,返回TRUE

  • =—如果几何/地理A的坐标和坐标顺序与几何/地理b的坐标和坐标顺序相同,返回TRUE

  • >>’—如果A的边界框严格地在B的右边,返回TRUE

  • @—如果A的边界框包含在B的边界框中,返回TRUE

  • @(geometry,box2df)—如果几何的2D边界框包含在2D浮点精度边界框(BOX2DF)中,返回TRUE

  • @(box2df,geometry)—如果2D浮点精度边界框(BOX2DF)包含在几何的2D边界框中,返回TRUE

  • @(box2df,box2df)—如果一个2D浮点精度边界框(BOX2DF)包含在另一个2D浮点精度边界框中,返回TRUE

  • |&>—如果A的边界框与B的重叠或者在B的上面,返回TRUE

  • |>>—如果A的边界框严格地在B的上面,返回TRUE

  • ~—如果A的边界框包含B的,返回TRUE

  • ~(geometry,box2df)—如果几何的2D结合框包含2D浮点精度边界框(GIDX),返回TRUE

  • ~(box2df,geometry)—如果2D浮点精度边界框(BOX2DF)包含几何的2D结合框,返回TRUE

  • ~(box2df,box2df)—如果一个2D浮点精度边界框(BOX2DF)包含另一个2D浮点精度边界框(BOX2DF),返回TRUE

  • ~=—如果A的边界框和B的一样,返回TRUE

7.10.2 距离运算符

  • <->-返回A和b之间的2D距离

  • |=|-返回A和B轨迹在最接近点的距离。

  • <#>-返回A和B边界框之间的2D距离。

  • <<->>-返回A和B边界框的质心之间的n-D距离。

  • <<#>>-返回A和B边界框之间的n-D距离。

7.11 空间关系

7.11.1 拓扑关系

  • ST_3DIntersects-测试两个几何图形是否在3D空间相交-仅适用于点、线段、多边形、多面体表面(区域)。

  • ST_Contains-测试B的点是否都不在A的外部,并且A和B至少有一个共同的内部点。

  • ST_ContainsProperly-测试B是否与A的内部相交,但不与边界或外部相交。

  • ST_CoveredBy-测试A中是否没有点在B之外

  • ST_Covers-测试B中是否没有点在A之外

  • ST_Crosses-测试两个几何图形是否有一些(但不是全部)共同的内部点。

  • ST_Disjoint-测试两个几何图形是否不相交(它们没有共同点)。

  • ST_Equals-测试两个几何图形是否包含相同的点集。

  • ST_Intersects-测试两个几何图形是否相交(它们至少有一个共同点)。

  • ST_LineCrossingDirection-返回一个数字,指示两个线条的交叉行为。

  • ST_OrderingEquals-测试两个几何图形是否表示相同的几何并且具有相同方向顺序的点。

  • ST_Overlaps-测试两个几何图形是否相交并具有相同的尺寸,但彼此不完全包含。

  • ST_Relate-测试两个几何图形是否具有匹配相交矩阵模式的拓扑关系,或计算它们的相交矩阵

  • ST_RelateMatch-测试DE-9IM交集矩阵是否匹配交集矩阵模式

  • ST_Touches-测试两个几何图形是否至少有一个共同点,但它们的内部不相交。

  • ST_Within-测试A的所有点是否都不在B的外部,并且A和B至少有一个共同的内部点。

7.11.2 距离关系

  • ST_3DDWithin-测试两个3D几何是否在给定的3D距离内

  • ST_3DDFullyWithin-测试两个3D几何是否完全在给定的3D距离内

  • ST_DFullyWithin-测试两个几何是否完全在给定距离内

  • ST_DWithin-测试两个几何是否在给定距离内

  • ST_PointInsideCircle-测试点几何是否在由圆心和半径定义的圆内。

7.12 测量函数

这些函数计算距离、面积和角度。还有计算由测量确定的几何值的函数。

  • ST_Area-返回多边形几何的面积。

  • ST_Azimuth-返回两点之间直线的北向方位角。

  • ST_Angle-返回由3或4个点或2条线定义的两个向量之间的角度。

  • ST_ClosestPoint-返回g1上最接近g2的2D点。这是从一个几何图形到另一个几何图形的最短直线的第一点。

  • ST_3DClosestPoint-返回g1上最接近g2的3D点。这是3D最短直线的第一个点。

  • ST_Distance-返回两个几何或地理值之间的距离。

  • ST_3DDistance-以投影单位返回两个几何之间的3D笛卡尔最小距离(基于空间参考)。

  • ST_DistanceSphere-使用球形地球模型返回两个经度/纬度几何之间的最小距离(米)。

  • ST_DistanceSpheroid-使用椭球地球模型返回两个经度/纬度几何之间的最小距离。

  • ST_FrechetDistance-返回两个几何之间的弗雷歇距离。

  • ST_HausdorffDistance-返回两个几何之间的Hausdorff距离。

  • ST_Length-返回线性几何的2D长度。

  • ST_Length2D-返回线性几何的2D长度。ST_Length的别名

  • ST_3DLength-返回线性几何的3D长度。

  • ST_LengthSpheroid-返回椭球体上经度/纬度几何的2D或3D长度/周长。

  • ST_LongestLine-返回两个几何图形之间的2D最长线。

  • ST_3DLongestLine-返回两个几何之间的3D最长线

  • ST_MaxDistance-以投影单位返回两个几何之间的2D最大距离。

  • ST_3DMaxDistance-以投影单位返回两个几何之间的3D笛卡尔最大距离(基于空间参考)。

  • ST_MinimumClearance-返回几何的最小间隙,这是几何坚固性的一种度量。

  • ST_MinimumClearanceLine-返回跨越几何最小间隙的两点线段。

  • ST_Perimeter-返回多边形几何或地理的边界长度。

  • ST_Perimeter2D-返回多边形几何的2D周长。ST_Perimeter的别名.

  • ST_3DPerimeter-返回多边形几何的3D周长。

  • ST_Project-返回从起点投影一定距离和方位角(方位角)的点。

  • ST_ShortestLine-返回两个几何图形之间的2D最短直线

  • ST_3DShortestLine-返回两个几何之间的3D最短直线

7.13 叠加函数

这些函数计算两个几何图形叠加的结果。这些也被称为点集理论布尔运算。还提供了一些相关的功能。

  • ST_ClipByBox2D-计算几何落在矩形内的部分。

  • ST_Difference-计算表示不与几何b相交的几何A部分的几何。

  • ST_Intersectiion-计算代表几何A和b的共享部分的几何

  • ST_MemUnion-以内存高效但较慢的方式联合几何图形的聚合函数

  • ST_Node-将线的集合节点化。

  • ST_Split-返回通过将一个几何分割为另一个几何而创建的几何集合。

  • ST_Subdivide-计算几何的直线细分。

  • ST_SymDifference-计算表示几何A和B不相交部分的几何。

  • ST_UnaryUnion-计算单一几何元件的并集。

  • ST_Union-计算表示输入几何的点集并集的几何。

7.14 Geometry处理

这些函数计算几何构造,或改变几何尺寸或形状。

  • ST_Buffer-计算覆盖距离几何给定距离内所有点的几何。

  • ST_BuildArea-创建由几何线条形成的多边形几何。

  • ST_Centroid-返回几何的几何中心。

  • ST_ChaikinSmoothing-使用Chaikin算法返回几何的平滑版本

  • ST_ConcaveHuill-计算封闭所有输入几何顶点的可能凹几何

  • ST_ConvexHull-计算几何的凸包。

  • ST_DelaunayTriangles-返回几何顶点的Delaunay三角剖分。

  • ST_FilterByM-根据顶点的M值移除顶点

  • ST_GeneratePoints-生成包含在多边形或多重多边形中的随机点。

  • ST_GeometricMedian-返回多点的几何中值。

  • ST_LineMerge—返回通过将多线缝合在一起而形成的线。

  • ST_MaximumInscribedCircle-计算几何中包含的最大圆。

  • ST_MinimumBoundingCircle-返回包含几何的最小圆多边形。

  • ST_MinimumBoundingRadius-返回包含几何的最小圆的中心点和半径。

  • ST_OrientedEnvelope-返回包含几何图形的最小面积矩形。

  • ST_OffsetCurve-返回距输入线给定距离和侧边的偏移线。

  • ST_PointOnSurface-计算保证位于多边形或几何上的点。

  • ST_Polygonize-计算由一组几何的线条形成的多边形集合。

  • ST_ReducePrecision-返回一个有效的几何,其点被舍入到网格公差。

  • ST_SharedPaths-返回包含由两个输入线段/多线段共享的路径的集合。

  • ST_Simplify-使用道格拉斯-普克算法返回几何的简化版本。

  • ST_SimplifyPreserveTopology-使用道格拉斯-普克算法返回几何的简化有效版本。

  • ST_SimplifyPolygonHull-计算多边形几何的简化拓扑保留外壳或内壳。

  • ST_SimplifyVW-使用Visvalingam-Whyatt算法返回几何的简化版本

  • ST_SetEffectiveArea-使用Visvalingam-Whyatt算法设置每个顶点的有效面积。

  • ST_TriangulatePolygon-计算多边形的约束Delaunay三角剖分

  • ST_VoronoiLines-返回几何顶点的Voronoi图的边界。

  • ST_VoronoiPolygons-返回几何顶点的Voronoi图的像元。

7.15 仿射变换

这些函数使用以下方式更改几何图形的位置和形状仿射变换.

  • ST_Affine-对几何应用3D仿射变换。

  • ST_Rotate-围绕原点旋转几何。

  • ST_RotateX-绕X轴旋转几何。

  • ST_RotateY-绕Y轴旋转几何。

  • ST_RotateZ-绕Z轴旋转几何。

  • ST_Scale-按给定因子缩放几何。

  • ST_Translate-按给定的偏移平移几何。

  • ST_TransScale-根据给定的偏移和因子平移和缩放几何。

7.16 聚类函数

这些函数为几何图形集实现聚类算法。

  • ST_ClusterDBSCAN-使用DBSCAN算法返回每个输入几何的聚类id的窗口函数。

  • ST_ClusterIntersecting-将输入几何聚类为连通集的聚合函数。

  • ST_ClusterKMeans-使用K-means算法返回每个输入几何的聚类id的窗口函数。

  • ST_ClusterWithin-按分隔距离对输入几何进行聚类的聚合函数。

7.17 边界框函数

这些函数产生或操作边界框。它们还可以通过使用自动或显式强制转换来提供和接受几何值。

  • Box2D-返回一个表示几何的2D范围的BOX2D。

  • Box3D-返回一个表示几何的3D范围的BOX3D。

  • ST_EstimatedExtent—返回空间表的估计范围。

  • ST_Expand-返回从另一个边界框或几何展开的边界框。

  • ST_Extent-返回几何边界框的聚合函数。

  • ST_3DExtent-返回几何的3D边界框的聚合函数。

  • ST_MakeBox2D-创建由两个2D点几何定义的BOX2D。

  • ST_3DMakeBox-创建由两个3D点几何定义的BOX3D。

  • ST_XMax-返回2D或3D边界框或几何的X最大值。

  • ST_XMin-返回2D或3D边界框或几何的X最小值。

  • ST_YMax-返回2D或3D边界框或几何的Y最大值。

  • ST_YMin-返回2D或3D边界框或几何的Y最小值。

  • ST_ZMax-返回2D或3D边界框或几何的Z最大值。

  • ST_ZMin-返回2D或3D边界框或几何的Z最小值。

7.18 线性参考

  • ST_LineInterpolatePoint-返回在分数位置沿线内插的点。

  • ST_3DLineInterpolatePoint-返回在分数位置沿3D线插值的点。

  • ST_LineInterpolatePoints-返回以分数间隔沿直线插值的点。

  • ST_LineLocatePoint-返回直线上最接近一个点的点的分数位置。

  • ST_LineSubstring-返回两个分数位置之间的直线部分。

  • ST_LocateAlong-返回几何上与测量值匹配的点。

  • ST_LocateBetween-返回与测量范围匹配的几何部分。

  • ST_LocateBetweenElevations-返回位于高程(Z)范围内的几何部分。

  • ST_InterpolatePoint-返回最接近点的几何的插值测量。

  • ST_AddMeasure-沿线性几何插入测量。

7.19 轨迹函数

这些功能支持使用轨迹。轨迹是每个坐标上测量值(M值)不断增加的线性几何图形。时空数据可以通过使用相对时间(例如历元)作为测量值来建模。

  • ST_IsValidTrajectory-测试geometry是否是有效的轨迹。

  • ST_ClosestPointOfApproach-返回两个轨迹最接近点的测量值。

  • ST_DistanceCPA卡帕-返回两个轨迹的最近接近点之间的距离。

  • ST_CPAWithin-测试两个轨迹的最近接近点是否在指定距离内。

7.20 SFCGAL函数

SFCGAL是一个围绕CGAL的C++包装库,提供高级2D和3D空间功能。为了稳健,几何坐标具有精确的有理数表示。

  • postgis_sfcgal_version—返回正在使用的SFCGAL版本

  • postgis_sfcgal_full_version—返回正在使用的SFCGAL的完整版本,包括CGAL和Boost版本

  • ST_3DArea-计算3D曲面几何的面积。对于固体将返回0。

  • ST_3DConvexHull-计算几何的3D凸包。

  • ST_3DIntersection-执行3D相交

  • ST_3DDifference—执行3D差异

  • ST_3DUnion-执行3D联合。

  • ST_AlphaShape-使用CGAL Alpha Shapes算法计算可能的凹面几何。

  • ST_ApproximateMedialAxis-计算面几何的近似中轴。

  • ST_ConstrainedDelaunayTriangles-返回给定输入几何周围的约束Delaunay三角剖分。

  • ST_Extrude-将曲面拉伸到相关体积块

  • ST_ForceLHR—强制LHR方向

  • ST_IsPlanar-检查曲面是否为平面

  • ST_IsSolid-测试几何是否为实体。不执行有效性检查。

  • ST_MakeSolid-将几何铸造成实体。不执行任何检查。要获得有效的实体,输入几何必须是闭合的多面体表面或闭合的TIN。

  • ST_MinKowskiSum—执行Minkowski求和

  • ST_OptimalAlphaShape-计算“最佳”Alpha值后,使用CGAL Alpha Shapes算法计算可能的凹面几何。

  • ST_Orientation-确定曲面方向

  • ST_StraightSkeleton-从几何计算直骨架

  • ST_Tesselate-对多边形或多面体表面执行表面镶嵌,并以TIN或TIN集合的形式返回

  • ST_Volume-计算3D实体的体积。如果应用于表面(甚至封闭的)几何图形,将返回0。

7.21 长事务支持

这些函数实现了一种行锁定机制来支持长事务。它们主要是为实现 Web Feature Service

  • AddAuth—添加要在当前事务中使用的授权令牌。

  • CheckAuth—在表上创建触发器,以根据授权令牌阻止/允许更新和删除行。

  • DisableLongTransactions—禁用长事务支持。

  • EnableLongTransactions—启用长事务支持。

  • LockRow—为表中的行设置锁定/授权。

  • UnlockRow—删除授权令牌持有的所有锁。

8 栅格数据扩展udbgis_raster

导入数据

用 raster2pgsql 工具导入范例数据 hillshade.tif 数据(openGauss为例):

raster2pgsql -s 0 /data/hillshade.tif -t 256x256 | ud_sql -d test

导入成功后,再次登录数据库,刷新元数据信息:

# 连接到数据库
ud_sql
# 刷新元数据信息
select AddRasterConstraints('hillshade', 'rast');
# 查看信息
select * from raster_columns where r_table_name='hillshade';

使用栅格数据

提取指定像素的值

select ST_Value(rast, 1, 10, 10, true) from hillshade ;

10 mobilitydb 轨迹扩展使用

相关构造函数

set(base[]) 集合类型构造函数 用于创建一个没有相同值的参数。

span(lower base,upper base,leftInc bool=true,rightInc bool=false) 单位跨度类型构造函数 是一种特殊的数据类型,用于表示一个数值范围。这种类型的构造器需要四个参数:前两个参数分别代表区间的下限和上限,后两个参数是布尔值,分别表示下限和上限是否包含在区间内。如果后两个参数没有明确指定,则默认情况下下限是包含在内的,而上限是不包含在内的。

spanset(span[]) 跨度集合类型构造函数 接受一个单一参数,该参数是一个相同子类型跨度值的数组。跨度值可以表示连续的数值范围,如整数范围、浮点数范围或是时间范围等。


tbox 时间盒类型构造函数 主要用于处理同时具有数值范围(价值维度)和时间范围(时间维度)的数据。根据具体的应用场景,tbox 提供了多种构造函数,以便用户能够灵活地定义时间盒的属性。这些构造函数允许用户分别或同时指定数值范围和时间范围,从而创建不同类型的时间盒。

tbox({number,numspan}) tbox 使用数字和数值跨度构造 tbox,仅指定价值维度 tbox({timestamptz,tstzspan}) tbox 使用时间戳和时间跨度构造 tbox,仅指定时间维度。

tbox({number,numspan},{timestamptz,tstzspan}) tbox 同时使用数值跨度和时间跨度构造 tbox,同时指定价值维度和时间维度。


stbox 空间时间盒类型函数 是一种高级数据类型,用于描述在时间和空间上都有定义的区域。它能够处理二维或三维的空间坐标,这些坐标既可以是笛卡尔坐标也可以是大地测量坐标。stbox 支持通过最小和最大坐标值来指定空间范围,还可以通过几何体或地理信息来定义。此外,它也支持指定时间范围。下面详细介绍 stbox 的构造函数及应用示例。

stboxX(float,float,float,float,srid=0) stbox 仅使用X和Y坐标定义空间范围 其中前两个float参数表示X坐标的最小和最大值,接下来的两个float参数表示Y坐标的最小和最大值,最后一个参数srid是可选的,用于指定空间参考系统标识符,默认为0。

stboxZ(float,float,float,float,float,float,srid=0) stbox 使用x,y,z 坐标定义空间范围。前三个float参数表示X、Y、Z坐标的最小值,接下来的三个float参数表示X、Y、Z坐标的最大值,最后一个参数srid用于指定空间参考系统标识符,默认为0。

stboxT({timestamptz,tstzspan}) stbox 仅使用时间范围定义。

stboxXT(float,float,float,float,{timestamptz,tstzspan},srid=0) stbox 同时使用X、Y坐标和时间范围定义。

stboxZT(float,float,float,float,float,float,{timestamptz,tstzspan},srid=0) stbox 同时使用X、Y、z坐标和时间范围定义。

geodstboxZ(float,float,float,float,float,float,srid=4326) stbox 使用x、y、z和默认使用WGS84大地坐标系(SRID 4326)。

geodstboxT({timestamptz,tstzspan}) stbox 仅使用时间范围定义。

geodstboxZT(float,float,float,float,float,float,{timestamptz,tstzspan},srid=4326) stbox 同时使用x、y、z和时间范围以及默认使用WGS84大地坐标系(SRID 4326)。

stbox(geo) stbox 使用几何体或地理信息定义空间范围。

stbox(geo,{timestamptz,tstzspan}) stbox 同时使用几何体或地理信息以及时间来定义范围。


quadSplit 拆分函数

quadSplit(stbox) {stbox} 拆分函数 用于将给定的空间时间盒 (stbox) 分割成多个更小的部分,具体来说,是将其分割成四个象限(如果是二维空间)或八个八分之一空间(如果是三维空间)。此函数返回一个由分割后的小 stbox 组成的集合,因此它是一个多值返回函数(或称表函数),这意味着它可以返回多个结果。


ttype 具有常量值的时态类型构造函数

这些构造函数用于创建时态类型(即随时间变化的数据类型)的对象,它们接收两个主要参数:一个是基本类型的数据值,另一个是时间值。时间值可以是瞬时时间点、时间点集、时间跨度或时间跨度集,分别用于构建瞬时值、具有离散插值的序列、具有连续插值(线性或阶梯式)的序列,或序列集值。

对于具有连续基类型的序列或序列集值,构造函数还接受一个可选的第三个参数,用于指定时间值的插值方式——线性插值或阶梯式插值。若未指定,则默认使用线性插值。

ttype(base,timestamptz) ttypeInst 构造一个瞬时的时态类型值。

ttype(base,tstzset) ttypeDiscSeq 构造一个具有离散插值的序列时态类型值。

ttype(base,tstzspan,interp='linear') ttypeContSeq 构造一个具有连续插值(默认线性插值)的序列时态类型值。

ttype(base,tstzspanset,interp='linear') ttypeSeqSet 构造一个序列集时态类型值,具有连续插值(默认线性插值)。


ttypeSeq序列子类型时态类型的构造函数

ttypeSeq(ttypeInst[],interp={'step','linear'},leftInc bool=true,rightInc bool=true) ttypeSeq 序列子类型时态类型的构造函数 主要用于创建序列子类型的时态类型值。构造函数的第一个参数是一个必需的数组,其中包含对应的瞬时值。此外,还有几个可选参数。第二个参数用于指定插值方法,如果未提供,则默认情况下对于离散基类型(如整数)使用阶梯插值,对于连续基类型(如浮点数)使用线性插值。当为离散基类型的时态值声明线性插值时,将引发错误。对于连续序列,第三个和第四个参数是布尔值,分别表示左边界和右边界是否包含在内,默认情况下,如果未指定,这两个参数都假设为真(即边界包含在内)。


```ttypeSeqSet`` 序列集子类型时态类型的构造函数

ttypeSeqSet(ttypeContSeq[]) 序列集子类型时态类型的构造函数

ttypeSeqSetGaps 序列集子类型时态类型的构造函数

(ttypeInst[],maxt=NULL,maxdist=NULL,interp='linear') 序列集子类型时态类型的构造函数


存储桶函数

返回一组覆盖指定跨度的等大小或等持续时间的桶,桶与原点对齐

bucketList 函数用于创建一系列的“桶”(即时间间隔),这些桶覆盖了由 bounds 参数定义的时间跨度。所有的桶具有相同的大小或持续时间,并且这些桶的开始时间与 origin 参数所指定的时间点对齐。如果未指定 origin,则默认为 0 或者在第二个签名中默认为 '2000-01-03' 这一时间点。

bucketList(bounds unitspan,size number,origin number=0) {(index,span)} 时序数据集 bucketList(bounds tstzspan,duration interval,origin timestamptz='2000-01-03') →{(index,span)}时区感知的时间数据

返回包含输入数值的桶的起始值

valueBucket 函数用于确定一个特定数值所属的“桶”的起始值。这里的“桶”是指根据 sizeorigin 参数定义的一系列等间距的数值区间。每个桶覆盖了从某一起始值开始、长度为 size 的一段连续数值范围。

函数的工作原理是,它会计算出 value 所处的桶的起始值。例如,如果 origin 设定为 0size10,那么数值 15 将属于起始于 10 的桶,数值 -5 则属于起始于 -10 的桶。

valueBucket(value number,size number,origin number=0) number

返回包含输入数值的桶空间中的跨度

spanBucket 函数用于找出一个特定数值所属的“桶”(即一组预定义的、等间距的数值区间)的跨度。这个函数可以帮助确定数值所在的具体区间,这个区间是由 sizeorigin 参数定义的。

函数返回的是一个 span 类型的结果,表示包含 value 的桶的起始和结束值。例如,如果 origin0size10,那么数值 15 所属的桶跨度将是 [10, 20)

spanBucket(value number, size number, origin number=0) span

返回包含输入时间戳的桶的起始时间戳

timeBucket 函数用于确定一个特定时间戳所属的时间“桶”的起始时间戳。这里的“桶”指的是按照一定的持续时间(duration)和起始时间(origin)划分的一系列连续时间区间。

函数返回的是一个 timestamptz 类型的结果,表示包含输入时间戳的桶的起始时间。例如,如果 origin'2000-01-03'duration'1 week',那么 '2023-03-15 12:30:00' 这个时间戳将属于起始于 '2023-03-13 00:00:00' 的时间桶。

timeBucket(time timestamptz,duration interval,origin timestamptz='2000-01-03') →timestamptz

返回包含输入时间戳的桶空间中的周期

periodBucket 函数用于查找一个特定时间戳所属的时间“桶”周期。这里的“桶”是指按照预设的持续时间(duration)和起始时间(origin)划分的时间段。

函数返回的结果是一个 tstzspan 类型,表示包含输入时间戳的桶周期的开始和结束时间。例如,如果 origin'2000-01-03'duration'1 week',那么时间戳 '2023-03-15 12:30:00' 将属于周期 [2023-03-13 00:00:00, 2023-03-20 00:00:00) 的时间桶。

periodBucket(time timestamptz, duration interval, origin timestamptz='2000-01-03') tstzspan


瓷砖函数

返回覆盖指定边界框的多维瓷砖集

tileList 函数用于生成一组多维“瓷砖”,这些瓷砖覆盖了由 bounds 参数定义的边界框,且具有相同的大小和持续时间(在时空网格的情况下)。瓷砖是用于分割空间或时空数据的多维单元,常用于地理信息系统(GIS)和时空数据分析中,以加速数据检索和处理。

函数有三种不同的签名,分别针对不同的情况:

纯空间瓷砖列表(适用于多维空间数据)

tileList(bounds tbox, size float, duration interval, vorigin float=0,torigin timestamptz='2000-01-03') {(index, tile)}

纯空间瓷砖列表(适用于空间数据)

tileList(bounds stbox, xsize float, [ysize float, zsize float],sorigin geompoint='Point(0 0 0)', borderInc bool=true) {(index, tile)}

时空瓷砖列表(适用于时空数据)

tileList(bounds stbox, xsize float, [ysize float, zsize float], duration interval,sorigin geompoint='Point(0 0 0)', torigin timestamptz='2000-01-03',borderInc bool=true) {(index, tile)}

函数返回一个包含 (index, tile) 对的集合,其中 index 是瓷砖的索引或位置标识,tile 是实际的瓷砖数据。

多维网格中的瓷砖函数

tile 函数在地理信息系统和时空数据处理中,被设计用来确定一个多维网格中包含特定值及其时间戳的瓷砖。这个函数可以针对纯数值维度、纯时间维度或同时包含空间和时间维度的数据集进行操作。

数值和时间维度

tile(value float, time timestamp, size float, duration interval,vorigin float = 0.0, torigin timestamp = '2000-01-03')→ tbox

空间维度

tile(point geometry, xsize float, [ysize float, zsize float],sorigin geompoint = 'Point(0 0 0)') stbox

时空维度

tile(point geometry, time timestamp, xsize float, [ysize float, zsize float,] duration interval,sorigin geompoint = 'Point(0 0 0)', torigin timestamp = '2000-01-03')

如果值维度(数值)和/或时间维度的原点没有被明确指定,它们将分别默认设置为以下值:

  • 对于值维度,默认原点是 0

  • 对于时间维度,默认原点是 2000年1月3日,星期一

在处理空间-时间网格的情况下,ysizezsize 参数是可选的。如果某个空间维度的大小没有被指定,那么这个维度的大小将默认等于 xsize 的值。

瓷砖坐标系的 SRID(空间参考系统标识符)由输入的几何点决定。这意味着,瓷砖的尺寸将以该 SRID 的单位来给出。如果提供了空间坐标原点,这个原点必须是一个点,且其维度性和 SRID 必须与输入的空间边界框(stbox 类型)相匹配。如果不满足这一条件,将会抛出错误。


拆分函数

以下这些函数基于一系列的桶(参见“桶函数”章节)或瓷砖(参见“瓷砖函数”章节)对时间序列数据进行分段处理。

根据跨度桶拆分时态数值

valueSplit 函数用于将一个时态数值(即随时间变化的数值)按照预先定义的数值跨度桶进行拆分。函数会根据指定的 size 和可选的 origin 参数,将时态数值分割成一系列数值跨度内的片段,每个片段对应一个数值跨度桶。

valueSplit(tnumber, size number, origin number=0) {(number, tnumber)}

如果未指定 origin 参数,函数默认将其设置为 0

根据时间跨度桶拆分时态值

timeSplit 函数用于将一个时态值(即随时间变化的值)按照预定义的时间跨度桶进行拆分。该函数会根据指定的时间跨度 duration 和可选的起始时间点 origin,将时态值分割成一系列时间跨度内的片段,每个片段对应一个时间跨度桶。

timeSplit(ttype, duration interval, origin timestamptz='2000-01-03') {(time, temp)}

如果未指定 origin 参数,函数默认将其设置为 2000-01-03

根据价值-时间网格中的瓷砖拆分时态数字

valueTimeSplit 函数用于在一个价值-时间网格中,依据预定义的价值跨度和时间跨度,将时态数字(即随时间和价值变化的数值)进行拆分。此函数会根据指定的 size(价值跨度大小)、duration(时间跨度大小)以及可选的 vorigin(价值跨度起始点)和 torigin(时间跨度起始点),将时态数字分割成一系列价值-时间瓷砖内的片段,每个片段对应一个价值-时间瓷砖。

valueTimeSplit(tnumber, size number, duration interval, vorigin number=0, torigin timestamptz='2000-01-03') {(number, time, tnumber)}

如果未指定 vorigintorigin 参数,函数默认将它们设置为 02000-01-03

根据空间网格中的瓷砖拆分时态点

spaceSplit 函数用于在一个空间网格中,依据预定义的空间跨度,将时态点(即随时间变化的位置点)进行拆分。此函数会根据指定的 xsize(X轴跨度大小)、可选的 ysize(Y轴跨度大小)和 zsize(Z轴跨度大小),以及可选的 origin(空间跨度起始点)、bitmatrix(是否使用位矩阵加速计算)和 borderInc(是否包含边界)参数,将时态点分割成一系列空间瓷砖内的片段,每个片段对应一个空间瓷砖。

spaceSplit(tgeompoint, xsize float, [ysize float, zsize float,]origin geompoint='Point(0 0 0)', bitmatrix boolean=true, borderInc bool=true) {(point, tpoint)}

如果未指定 origin 参数,函数默认将其设置为 Point(0 0 0)。如果未指定 ysizezsize 参数,函数默认将它们设置为与 xsize 相同的值。

根据时空网格中的瓷砖拆分时态点

spaceTimeSplit 函数是在一个时空网格中,基于预定义的空间和时间跨度,将时态点(即随时间和空间变化的位置点)进行拆分。这个函数接受时态点 tgeompoint、空间跨度 xsize、可选的 ysizezsize(对于三维空间)、时间跨度 duration,以及可选的 sorigin(空间原点)、torigin(时间原点)、bitmatrix(是否使用位矩阵加速计算)和 borderInc(是否包含边界)作为参数。它会将时态点分割成一系列时空瓷砖内的片段,每个片段对应一个时空瓷砖。

spaceTimeSplit(tgeompoint, xsize float, [ysize float, zsize float,]  duration interval,sorigin geompoint='Point(0 0 0)',torigin timestamptz='2000-01-03', bitmatrix boolean=true, borderInc boolean=true) {(point, time, tpoint)}


构建具有恒定值的时态网络点

下面的函数用于构建时态网络点(TNP),这些点在网络环境中随时间变化,但具有恒定的属性值。时态网络点可以表示在不同时间点网络中节点的状态,例如交通网络中的交通流量、电力网络中的电力负荷等。

单个时刻的时态网络点构造函数

tnpointInst(npoint, timestamptz) tnpointInst

此函数用于构建一个在特定时刻具有固定属性值的时态网络点。npoint 是网络中的点,timestamptz 是时间戳,表示该点的有效时间。

离散序列的时态网络点构造函数

tnpointSeq(npoint, tstzset) tnpointDiscSeq

该函数用于构建一个离散序列的时态网络点,其中 npoint 是网络中的点,tstzset 是一个时间戳集合,表示该点在不同时间点的有效性。

连续序列的时态网络点构造函数

tnpointSeq(npoint, tstzspan, interp='linear') tnpointContSeq

此函数用于构建一个连续序列的时态网络点,其中 npoint 是网络中的点,tstzspan 是时间跨度,表示该点在一段时间内的有效性。interp 参数可选,用于指定在时间跨度内如何插值点的有效性,默认为线性插值。

序列集的时态网络点构造函数

tnpointSeqSet(npoint, tstzspanset, interp='linear') tnpointSeqSet

该函数用于构建一个序列集的时态网络点,其中 npoint 是网络中的点,tstzspanset 是时间跨度集合,表示该点在不同时间跨度内的有效性。interp 参数可选,用于指定在时间跨度内如何插值点的有效性,默认为线性插值。

构建时态网络点的序列子类型

tnpointSeq(tnpointInst[], interp={'step', 'linear'}, leftInc bool=true, rightInc bool=true) tnpointSeq

此函数用于构建时态网络点的序列子类型,即一系列有序的时态网络点,每个点在时间线上有一个或多个有效区间。

构建时态网络点的序列集子类型

通过时态网络点数组构建序列集

tnpointSeqset(tnpoint[]) tnpointSeqSet

此函数用于直接从一个时态网络点 (tnpoint) 的数组中构建一个时态网络点的序列集 (tnpointSeqSet)。这适用于将一系列已知的时态网络点整合成一个有序的集合,其中每个点在时间线上可能有多个有效区间。

通过时态网络点实例数组和参数构建序列集

tnpointSeqSetGaps(tnpointInst[], maxt=NULL, maxdist=NULL, interp='linear') tnpointSeqSet

此函数用于从时态网络点实例数组构建一个时态网络点的序列集,同时允许指定序列间的最大时间间隔 (maxt) 和最大距离 (maxdist),以及插值方法 (interp)。


MobilityDB 扩展的版本

mobilitydb_version() text

MobilityDB 扩展的版本及其依赖项

mobilitydb_full_version() text

11 pgrouting 扩展使用

此扩展包含了以下几种功能:

最短路径算法、双向算法、Dijkstra算法的多种应用、距离算法

前置知识

在开始实践之前,会先介绍一下关于图和图的算法前置知识,如果您对这些有一定了解可以忽略此部分。

图的定义

图是一些点(vertices)和边(edges)组成的.分为:(无向图,无向简单图)、(有向图,有向简单图)。

部分图的理论中包含权重概念,可以简单理解为两点之间的距离。

在 pgRouting 中有几种方式可以表示图:

包含权重的: id,source,target,cost 包含双向权重的 id,source,target,cost,reverse_cost

其中含义为:

标签 含义
id 边的标识符,要求是数据库中的一个数据
source 边起点的标识符
target 边终点的标识符
cost 从起点到终点的权重(当 cost 是负数时,表示这条边并不存在于图中,同时 cost 在一个查询中必须存在)
reverse_cost 从终点到起点的权重(当 reverse_cost 为负数时,表示这条边并不存在于图中)

图示例

#有向图(cost)

select * from (values(1,1,2,5),(2,1,3,-3)) as t(id,source,target,cost);

id | source | target | cost
----+--------+--------+------
1 |      1 |      2 |    5
2 |      1 |      3 |   -3

其中 id 2 的数值在 cost 为负数,所以在图中没有这个边。

img

#无向图(cost)
select * from (values (1,1,2,5),(2,1,3,-3)) as t(id,source,target,cost);

 id | source | target | cost
----+--------+--------+------
  1 |      1 |      2 |    5
  2 |      1 |      3 |   -3

与上面的图相比结点 1  节点 2 之间的连线时没有指向的。

https://yukon.supermap.io/2.1-Beta/_images/undirected_graph.png

#有向图(cost,reverse_cost)
select * from (values (1,1,2,5,2),(2,1,3,-3,4),(3,2,3,7,-1)) as t(id,source,target,cost,reverse_cost);

id | source | target | cost | reverse_cost
----+--------+--------+------+--------------
1 |      1 |      2 |    5 |            2
2 |      1 |      3 |   -3 |            4
3 |      2 |      3 |    7 |           -1

#在上面的示例中,id 为 2(1->3) 和 3(3->2) 的两条边就是不存在的,因为 cost 和 reverse_cost 是负数。

https://yukon.supermap.io/2.1-Beta/_images/directed__cr_graph.png

#无向图(cost,reverse_cost)
select * from (values (1,1,2,5,2),(2,1,3,-3,4),(3,2,3,7,-1)) as t(id,source,target,cost,reverse_cost);

id | source | target | cost | reverse_cost
----+--------+--------+------+--------------
1 |      1 |      2 |    5 |            2
2 |      1 |      3 |   -3 |            4
3 |      2 |      3 |    7 |           -1

在上面的示例中,id  2(1–3)  3(3–2) 的边是不存在的,因为 cost  revrese_cost 为负数。

https://yukon.supermap.io/2.1-Beta/_images/undirected__cr_graph.png

不使用 几何(geometry) 图

人际关系,基因,文件依赖等问题都可以通过 pgrouting 来解决,这些问题一般都不需要 geometry 数据。现在我们使用一个示例来进行说明:

https://yukon.supermap.io/2.1-Beta/_images/pgrouting-wiki-shortpath.drawio.png

其中:

找到从节点1到 5 的最短路径

是一个无向图

有六个节点,九条边

#1.创建表
create table test (id SERIAL,
                   source INTEGER,
                   target INTEGER,
                   cost   INTEGER);

#2.插入数据
insert into test (source,target,cost) 
values 
(1, 2, 7),
(1, 3, 9),
(1, 6, 14),
(2, 3, 10),
(2, 4, 15),
(3, 6, 2),
(3, 4, 11),
(4, 5, 6),
(5, 6, 9);

#3寻找最短路径
#这里使用了 Dijkstra 算法
select * from pgr_dijkstra('select id,source,target,cost from test', 1,5,false);

seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
   1 |        1 |    1 |    2 |    9 |        0
   2 |        2 |    3 |    6 |    2 |        9
   3 |        3 |    6 |    9 |    9 |       11
   4 |        4 |    5 |   -1 |    0 |       20
#即最短路径为 1->3->6->5
#查看边的信息
SELECT id, in_edges, out_edges
FROM pgr_extractVertices('SELECT id, source, target FROM test');

 id | in_edges | out_edges
----+----------+-----------
  3 | {2,4}    | {6,7}
  5 | {8}      | {9}
  4 | {5,7}    | {8}
  2 | {1}      | {4,5}
  1 |          | {1,2,3}
  6 | {3,6,9}  |

使用 几何(geometry) 图

12 OGR_FDW的使用