这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

OGC 空间定义

使用 Vertica 需要了解开放地理空间联盟 (OGC) 的概念和功能。有关详细信息,请参见 OGC 简易功能访问第 1 部分 - 通用架构规范。

1 - 空间类

Vertica 支持 OGC 标准中定义的多个对象类。

1.1 - Point

使用以下方法之一标识的二维空间中的位置:

  • X 和 Y 坐标

  • 经度和纬度值

点的维度为 0,并且没有边界。

示例

下面的示例使用 GEOMETRY 点:

=> CREATE TABLE point_geo (gid int, geom GEOMETRY(100));
CREATE TABLE
=> COPY point_geo(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1, POINT(3 5)
>>\.
=> SELECT gid, ST_AsText(geom) FROM point_geo;
 gid |  ST_AsText
-----+-------------
   1 | POINT (3 5)
(1 row)

下面的示例使用 GEOGRAPHY 点:

=> CREATE TABLE point_geog (gid int, geog geography(100));
CREATE TABLE
=> COPY point_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1, POINT(42 71)
>>\.
=> SELECT gid, ST_AsText(geog) FROM point_geog;
 gid |   ST_AsText
-----+---------------
   1 | POINT (42 71)
(1 row)

1.2 - Multipoint

一个或多个点的集合。点集合对象的维度为 0,并且没有边界。

示例

下面的示例使用 GEOMETRY 点集合:

=> CREATE TABLE mpoint_geo (gid int, geom GEOMETRY(1000));
CREATE TABLE
=> COPY mpoint_geo(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|MULTIPOINT(4 7, 8 10)
>>\.
=> SELECT gid, ST_AsText(geom) FROM mpoint_geo;
 gid |       st_astext
-----+-----------------------
   1 | MULTIPOINT (7 8, 6 9)
(1 row)

下面的示例使用 GEOGRAPHY 点集合:

=> CREATE TABLE mpoint_geog (gid int, geog GEOGRAPHY(1000));
CREATE TABLE
=> COPY mpoint_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|MULTIPOINT(42 71, 41.4 70)
>>\.
=> SELECT gid, ST_AsText(geom) FROM mpoint_geo;
 gid |       st_astext
-----+-----------------------
   1 | MULTIPOINT (42 71, 41.4 70)
(1 row)

1.3 - 线串

由连续点对标识的一个或多个连接的线。线串的维度为 1。线串边界是包含其起点和终点的点集合对象。

以下是线串的示例:

示例

下面的示例使用 GEOMETRY 类型创建表,使用复制将线串加载到表,然后查询表来查看线串:

=> CREATE TABLE linestring_geom (gid int, geom GEOMETRY(1000));
CREATE TABLE
=> COPY linestring_geom(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|LINESTRING(0 0, 1 1, 2 2, 3 4, 2 4, 1 5)
>>\.
=> SELECT gid, ST_AsText(geom) FROM linestring_geom;
 gid |                 ST_AsText
-----+-------------------------------------------
   1 | LINESTRING (0 0, 1 1, 2 2, 3 4, 2 4, 1 5)
(1 row)

下面的示例使用 GEOGRAPHY 类型创建表,使用 COPY 将线串加载到表,然后查询表以查看线串:

=> CREATE TABLE linestring_geog (gid int, geog GEOGRAPHY(1000));
CREATE TABLE
=> COPY linestring_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|LINESTRING(42.1 71, 41.4 70, 41.3 72.9, 42.99 71.46, 44.47 73.21)
>>\.
=> SELECT gid, ST_AsText(geog) FROM linestring_geog;
 gid |                             ST_AsText
-----+--------------------------------------------------------------------
   1 | LINESTRING (42.1 71, 41.4 70, 41.3 72.9, 42.99 71.46, 44.47 73.21)
(1 row)

1.4 - 线串集合

零个或多个线串的集合。线串集合没有维度。线串集合的边界是包含所有线串起点和终点的点集合对象。

以下是线串集合的示例:

示例

下面的示例使用 GEOMETRY 类型创建表,使用复制将线串集合加载到表,然后查询表来查看线串集合:

=> CREATE TABLE multilinestring_geom (gid int, geom GEOMETRY(1000));
CREATE TABLE
=> COPY multilinestring_geom(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|MULTILINESTRING((1 5, 2 4, 5 3, 6 6),(3 5, 3 7))
>>\.
=> SELECT gid, ST_AsText(geom) FROM multilinestring_geom;
 gid |                     ST_AsText
-----+----------------------------------------------------
   1 | MULTILINESTRING ((1 5, 2 4, 5 3, 6 6), (3 5, 3 7))
(1 row)

下面的示例使用 GEOGRAPHY 类型创建表,使用 COPY 将线串集合加载到表,然后查询表以查看线串集合:

=> CREATE TABLE multilinestring_geog (gid int, geog GEOGRAPHY(1000));
CREATE TABLE
=> COPY multilinestring_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|MULTILINESTRING((42.1 71, 41.4 70, 41.3 72.9), (42.99 71.46, 44.47 73.21))
>>\.
=> SELECT gid, ST_AsText(geog) FROM multilinestring_geog;
 gid |                                  ST_AsText
-----+----------------------------------------------------------------------------
   1 | MULTILINESTRING((42.1 71, 41.4 70, 41.3 72.9), (42.99 71.46, 44.47 73.21))
(1 row)

1.5 - 多边形

由一组封闭的线串标识的对象。多边形可能包含一个或多个由内部边界定义的孔,但所有点都必须保持连接状态。以下是两个多边形的示例:

包含性和独占性多边形

如果多边形以顺时针顺序将其点包括在内,则包含多边形边内的所有空间,排除边外的所有空间。如果多边形以逆时针顺序将其点包括在内,则排除多边形边内的所有空间,包含边外的所有空间。

示例

下面的示例使用 GEOMETRY 类型创建表,使用复制将多边形加载到表,然后查询表来查看多边形:

=> CREATE TABLE polygon_geom (gid int, geom GEOMETRY(1000));
CREATE TABLE
=> COPY polygon_geom(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|POLYGON(( 2 6, 2 9, 6 9, 7 7, 4 6, 2 6))
>>\.
=> SELECT gid, ST_AsText(geom) FROM polygon_geom;
 gid |                 ST_AsText
-----+------------------------------------------
   1 | POLYGON((2 6, 2 9, 6 9, 7 7, 4 6, 2 6))
(1 row)

下面的示例使用 GEOGRAPHY 类型创建表,使用 COPY 将多边形加载到表,然后查询表以查看多边形:

=> CREATE TABLE polygon_geog (gid int, geog GEOGRAPHY(1000));
CREATE TABLE
=> COPY polygon_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|POLYGON((42.1 71, 41.4 70, 41.3 72.9, 44.47 73.21, 42.99 71.46, 42.1 71))
>>\.
=> SELECT gid, ST_AsText(geog) FROM polygon_geog;
 gid |                                ST_AsText
-----+---------------------------------------------------------------------------
   1 | POLYGON((42.1 71, 41.4 70, 41.3 72.9, 44.47 73.21, 42.99 71.46, 42.1 71))
(1 row)

1.6 - 多边形集合

零个或多个未重叠的多边形的集合。

示例

下面的示例使用 GEOMETRY 类型创建表,使用 COPY 将多边形集合加载到表,然后查询表以查看多边形:

=> CREATE TABLE multipolygon_geom (gid int, geom GEOMETRY(1000));
CREATE TABLE
=> COPY multipolygon_geom(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>9|MULTIPOLYGON(((2 6, 2 9, 6 9, 7 7, 4 6, 2 6)),((0 0, 0 5, 1 0, 0 0)),((0 2, 2 5, 4 5, 0 2)))
>>\.
=> SELECT gid, ST_AsText(geom) FROM polygon_geom;
 gid |                                           ST_AsText
-----+----------------------------------------------------------------------------------------------
   9 | MULTIPOLYGON(((2 6, 2 9, 6 9, 7 7, 4 6, 2 6)),((0 0, 0 5, 1 0, 0 0)),((0 2, 2 5, 4 5, 0 2)))
(1 row)

下面的示例使用 GEOGRAPHY 类型创建表,使用 COPY 将多边形集合加载到表,然后查询表以查看多边形:

=> CREATE TABLE multipolygon_geog (gid int, geog GEOGRAPHY(1000));
CREATE TABLE
=> COPY polygon_geog(gid, gx filler LONG VARCHAR, geog AS ST_GeographyFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>1|POLYGON((42.1 71, 41.4 70, 41.3 72.9, 44.47 73.21, 42.99 71.46, 42.1 71))
>>\.
=> SELECT gid, ST_AsText(geog) FROM polygon_geog;
 gid |                                ST_AsText
-----+---------------------------------------------------------------------------
   1 | POLYGON(((42.1 71, 41.4 70, 41.3 72.9, 42.1 71)),((44.47 73.21, 42.99 71.46, 42.1 71, 44.47 73.21)))
(1 row)

2 - 空间对象表示方法

OGC 定义了两种表示空间对象的方法:

2.1 - 熟知文本 (WKT)

熟知文本 (WKT) 是空间对象的 ASCII 表示。

WKT 不区分大小写;Vertica 可识别小写字母和大写字母的任意组合。

以下是一些有效的 WKT 示例:

无效的 WKT:

  • POINT(1 NAN), POINT(1 INF)—坐标必须为数字。

  • POLYGON((1 2, 1 4, 3 4, 3 2))—多边形必须是封闭的。

  • POLYGON((1 4, 2 4))—线串不是有效的多边形。

2.2 - 熟知二进制 (WKB)

熟知二进制 (WKB) 是空间对象的二进制表示。此格式主要用于在应用程序之间移植空间数据。

3 - 空间定义

OGC 定义了描述以下内容的属性

  • 空间对象的特征

  • 对象之间可能存在的空间关系

Vertica 提供了用于测试和分析以下属性和关系的函数。

3.1 - 边界

定义空间对象限制的点集:

  • 点、点集合和 GeometryCollection 没有边界。

  • 线串的边界是点集合对象。此对象包含其起点和终点。

  • 线串集合的边界是点集合对象。此对象包含构成线串集合的所有线串的起点和终点。

  • 多边形的边界是在同一点开始和结束的线串。如果多边形包含一个或多个孔,则边界是包含外部多边形边界和任何内部多边形边界的线串集合。

  • 多边形集合的边界是包含构成多边形集合的所有多边形的边界的线串集合。

3.2 - 缓冲区

与空间对象边界的距离小于或等于指定距离的所有点的集合。该距离可能为正值或负值。

正缓冲区:

负缓冲区:

3.3 - 包含

如果一个空间对象的内部包括了另一个空间对象的所有点,则表示前者包含后者。如果某个对象(例如点或线串)仅沿多边形的边界存在,则多边形未包含该对象。如果某个点在线串上,则线串包含该点;线串的内部是指线串上除起点和终点以外的所有点。

Contains(a, b) 在空间上等同于 within(b, a)。

3.4 - 凸包

包含一个或多个空间对象的最小凸多边形。

在下图中,虚线表示一个线串和一个三角形的凸包。

3.5 - 交叉

如果以下两项均成立,则表示两个空间对象交叉:

  • 两个对象具有部分但非全部的公共内点。

  • 它们的相交结果的尺寸小于两个对象的最大尺寸。

3.6 - 非联接

没有任何公共点的两个空间对象;它们既不相交也不接触。

3.7 - 包络

包含空间对象的最小边界矩形。

以下多边形的包络表示为下图中的虚线。

3.8 - 相等

如果两个空间对象的坐标完全匹配,则二者相等。与在空间上等同同义。

在确定空间等价关系时点的顺序不重要:

  • LINESTRING(1 2, 4 3) 等于 LINESTRING(4 3, 1 2)。

  • POLYGON ((0 0, 1 1, 1 2, 2 2, 2 1, 3 0, 1.5 -1.5, 0 0)) 等于 POLYGON((1 1 , 1 2, 2 2, 2 1, 3 0, 1.5 -1.5, 0 0, 1 1))。

  • MULTILINESTRING((1 2, 4 3),(0 0, -1 -4)) 等于 MULTILINESTRING((0 0, -1 -4),(1 2, 4 3))。

3.9 - 外部

空间对象或其边界均未包含的点集。

3.10 - GeometryCollection

任何支持的空间对象类的零个或更多个对象的集合。

3.11 - 内部

空间对象中包含的点集,不包括其边界。

3.12 - 交集

两个或更多个空间对象的公共点集。

3.13 - 重叠

如果某个空间对象与另一个对象共享空间,但没有包含在该对象内,则表示这两个对象重叠。对象必须在其内部重叠;如果两个对象在单个点接触,或仅仅沿边界相交,则它们没有重叠。

3.14 - 相关

按照 DE-9IM 模式矩阵字符串的定义,某个空间对象与另一个对象在空间上相关。

DE-9IM 模式矩阵字符标识了两个空间对象彼此在空间上的相关性。有关 DE-9IM 标准的详细信息,请参见了解空间关系

3.15 - 简单

对于点、点集合、线串或线串集合,如果未与自身相交也没有自切点,则为简单空间对象。

多边形、多边形集合和 GeometryCollection 始终为简单空间对象。

3.16 - 余集

一对空间对象中没有彼此相交的所有点的集合。此差集在空间上等同于两个对象的并集减去其交集。余集包含交集的边界。

在下图中,阴影区域表示这两个矩形的余集。

下图显示了两个重叠的线串的余集。

3.17 - 并集

所有对象中的所有点的集合(针对两个或更多个空间对象)。

3.18 - 有效性

对于多边形或多边形集合,如果以下所有项均成立:

  • 它是封闭的;其起点与终点相同。

  • 其边界是一组线串。

  • 边界中没有任何两个交叉的线串。边界中的线串可能在某个点接触,但它们不能交叉。

  • 内部的任何多边形都必须完全包含在其中;这些多边形不能接触外部多边形边界除顶点以外的任何位置。

有效的多边形:

无效的多边形:

3.19 - 范围内

当一个空间对象的所有点都在另一个对象的内部时,前者被视为在后者范围内。因此,如果某个点或线串仅沿多边形的边界存在,则不被视为在该多边形范围内。多边形边界不属于其内部。

如果某个点在线串上,则被视为在该线串范围内。线串的内部是线串上除起点和终点以外的所有点。

Within(a, b) 在空间上等同于 Contains(b, a)。