• 产品与解决方案
  • 行业解决方案
  • 服务
  • 支持
  • 合作伙伴
  • 关于我们

H3C SeaSQL EDW 高级特性使用指导-5W101

01-正文

本章节下载  (1.92 MB)

01-正文

  录

1 文档阅读说明

1.1 关于该文档

1.2 阅读建议

2 高级预测分析

2.1 数据准备

2.1.1 均衡数据

2.1.2 检测异常值

2.1.3 编码分类列

2.1.4 输入缺失值

2.1.5 归一化数据

2.1.6 采样数据

2.1.7 SVD(奇异值分解)

2.1.8 PCA(主成分分析)

2.2 回归算法

2.2.1 线性回归(预测线性关系中的连续数值结果)

2.2.2 回归随机森林

2.2.3 用于回归的SVM(支持向量机)

2.2.4 自回归算法

2.2.5 XGBoost回归算法

2.3 分类算法

2.3.1 逻辑回归算法

2.3.2 朴素贝叶斯

2.3.3 分类随机森林算法

2.3.4 分类算法-SVM(支持向量机)

2.3.5 XGBoost分类算法

2.4 聚类算法

2.4.1 K-means

2.4.2 二分K-means

2.5 时间序列预测算法

2.5.1 自回归算法

2.5.2 Moving-average算法

2.6 模型管理

2.6.1 修改模型

2.6.2 删除模型

2.6.3 模型安全管理

2.6.4 模型查看

3 时序数据处理

3.1 概述

3.1.1 什么是时序数据

3.1.2 什么时序分析

3.2 时序数据处理常用函数

3.2.1 TIMESERIES

3.2.2 TS_FIRST_VALUE

3.2.3 TS_LAST_VALUE

3.2.4 TIME_SLICE

3.2.5 INTERPOLATE

3.3 时序数据处理操作

3.3.1 间隔填充和插值

3.3.2 基于时间间隔的聚合操作

3.3.3 事件序列关联

3.3.4 模式匹配

4 地理空间分析

4.1 地理空间分析功能概述

4.2 地理空间分析最佳实践

4.2.1 性能优化

4.2.2 点和多边形的空间连接

4.2.3 空间索引

4.2.4 检查多边形有效性

4.3 空间对象

4.3.1 支持的空间对象

4.3.2 空间参考标识符(SRID)

4.4 地理空间函数概述

4.4.1 命令约定

4.4.2 验证空间对象的有效性

4.5 属性函数

4.5.1 ST_GeometryN

4.5.2 ST_GeometryType

4.5.3 ST_NumGeometries

4.5.4 ST_NumPoints

4.5.5 ST_PointN

4.5.6 ST_SRID

4.5.7 ST_X

4.5.8 ST_XMax

4.5.9 ST_XMin

4.5.10 ST_Y

4.5.11 ST_YMax

4.5.12 ST_YMin

4.5.13 STV_IsValidReason

4.5.14 STV_LineStringPoint

4.5.15 STV_PolygonPoint

4.6 I/O函数

4.6.1 ST_AsBinary

4.6.2 ST_AsText

4.6.3 ST_GeographyFromText

4.6.4 ST_GeographyFromWKB

4.6.5 ST_GeomFromGeoJSON

4.6.6 ST_GeomFromText

4.6.7 ST_GeomFromWKB

4.6.8 STV_AsGeoJSON

4.6.9 STV_Geography

4.6.10 STV_Geometry

4.6.11 STV_MemSize

4.7 测量函数

4.7.1 ST_Area

4.7.2 ST_Distance

4.7.3 ST_Length

4.8 运算符函数

4.8.1 ST_Boundary

4.8.2 ST_Buffer

4.8.3 ST_Centroid

4.8.4 ST_ConvexHull

4.8.5 ST_Difference

4.8.6 ST_Envelope

4.8.7 ST_Intersection

4.8.8 ST_SymDifference

4.8.9 ST_Transform

4.8.10 ST_Union

4.8.11 STV_ForceLHR

4.8.12 STV_GeographyPoint

4.8.13 STV_GeometryPoint

4.8.14 STV_NN

4.8.15 STV_Reverse

4.9 Geo hash函数

4.9.1 ST_GeoHash

4.9.2 ST_GeomFromGeoHash

4.9.3 ST_PointFromGeoHash

4.10 断言函数

4.10.1 ST_Contains

4.10.2 ST_Crosses

4.10.3 ST_Disjoint

4.10.4 ST_Intersects

4.10.5 ST_IsEmpty

4.10.6 ST_IsSimple

4.10.7 ST_IsValid

4.10.8 ST_Overlaps

4.10.9 ST_Relate

4.10.10 ST_Touches

4.10.11 STV_Extent

4.10.12 ST_Within

4.10.13 STV_DWithin

4.11 Shapefile 函数

4.11.1 STV_Export2Shapefile

4.11.2 STV_GetExportShapefileDirectory

4.11.3 STV_SetExportShapefileDirectory

4.11.4 STV_ShpCreateTable

4.11.5 STV_ShpSource 和 STV_ShpParser

4.12 空间索引函数

4.12.1 STV_Create_Index

4.12.2 STV_Describe_Index

4.12.3 STV_Drop_Index

4.12.4 STV_Refresh_Index

4.12.5 STV_Rename_Index

4.13 空间连接函数

4.13.1 STV_Intersect Scalar Function

4.13.2 STV_Intersect Transform Function

4.14 按数据类型划分空间函数

4.14.1 几何函数

4.14.2 地理(理想球体)函数

4.14.3 地理 (WGS84) 函数

4.15 处理表中的空间对象

4.15.1 定义空间数据的空间对象

4.15.2 从表中导出空间数据

4.15.3 识别 Null 空间对象

4.15.4 从 Shapefile 中加载空间数据

4.15.5 支持的 Shapefile 图形类型

4.15.6 使用 COPY 将空间数据加载到表中

4.15.7 从表中检索作为熟知文本 (WKT) 的空间数据

4.15.8 使用GeoHash数据

4.15.9 在创建或刷新索引之前确保多边形有效性

4.15.10 STV_Intersect:标量函数与转换函数

4.15.11 使用 STV_Intersect 函数执行空间关联

4.15.12 何时使用ST_Intersects与 STV_ Intersect

4.16 使用客户端应用程序中的空间对象

4.16.1 将 LONG VARCHAR 和 LONGVARBINARY 数据类型与 ODBC 配合使用

4.16.2 将 LONG VARCHAR 和 LONGVARBINARY 数据类型与 JDBC 配合使用

4.16.3 将 GEOMETRY 和 GEOGRAPHY 数据类型用于 ODBC

4.16.4 将 GEOMETRY 和 GEOGRAPHY 数据类型用于 JDBC

4.16.5 将 GEOMETRY 和 GEOGRAPHY 数据类型用于 ADO.NET

4.17 空间类

4.17.1 Point

4.17.2 Multipoint

4.17.3 Linestring

4.17.4 Multilinestring

4.17.5 Polygon

4.17.6 Multipolygon

4.18 空间对象表示方法

4.18.1 熟知文本 (WKT)

4.18.2 熟知二进制 (WKB)

4.19 空间定义

4.20 地理空间使用限制

4.20.1 空间数据类型支持限制

 

                                                        


1 文档阅读说明

1.1  关于该文档

本文档是H3C SeaSQL EDW数据库高级特性使用手册,该手册包含SeaSQL EDW主要的高级特性。

该文档主要包含以下章节内容:

·     第一章《文档阅读说明》包含文档介绍以及阅读建议等内容。

·     第二章《高级预测分析》主要介绍了SeaSQL EDW的库内机器学习算法以及一些常用的函数。

·     第三章《时序数据处理》主要介绍了SeaSQL EDW库内时序数据处理功能。

·     第四章《地理空间分析》主要介绍了SeaSQL EDW地理空间使用理论、函数使用及实践示例。

1.2  阅读建议

我们假定本文档阅读者已经对SeaSQL EDW有一定了解,现在需要了解SeaSQL EDW的机器学习,时序分析,地理空间分析等高级特性。对于SeaSQL EDW的一些基本介绍及基础功能使用,请参考《H3C SeaSQL EDW用户手册》。


2 高级预测分析

随着数据可用性和计算能力的快速增长,机器学习现在在技术和业务中发挥着至关重要的作用。传统预测分析系统采用“分析需求、提取数据、建模训练和验证、模型部署和应用开发、预测分析”操作流程。大数据的到来,因为性能不足变得让人无法忍受,不得不大幅降低数据采样,但太小的训练数据集合意味着预测结果欠准确。购买和实施单独的机器学习平台,这意味着增加成本。将数据从一个平台移动到另一个平台并进行数据整合,需要较长时间才能完成。

SeaSQL EDW集成常用机器学习模块,不用专门搭建预测分析环境节约资源,而且大大缩减了开发迭代时间。同时,SeaSQL EDW还内置基于SQL的“线性回归”、“逻辑回归”、“K-Means聚类”、“朴素贝叶斯分类”等常用机器学习算法,借助SeaSQL EDW强大的并行计算能力,直接在库内基于海量数据进行模型训练、验证、部署和评分,支持更准确的模型训练和投产、模型快速演进。

除了内置机器学习算法外,SeaSQL EDW还支持java、C++、Python、R语言作为分析功能扩展语言,可以轻松把R社区丰富的分析算法注册到SeaSQL EDW中,作为SQL分析函数直接使用。

说明

本章节数据样例来自 https://github.com/vertica/Machine-Learning-Examples可根据需求进行下载及入库。

 

2.1  数据准备

2.1.1  均衡数据

当数据按照不同类型分布不均衡时,就会产生不均衡的数据,此时可以使用balance函数进行均衡数据分布。

语句语法

BALANCE ( 'outputview', 'inputrelation', 'responsecolumn', 'balancemethod'

            [ USING PARAMETERS sampling_ratio=ratio ] )

参数解析

参数

说明

outputview

SeaSQL EDW从输入关系中保存平衡数据的视图名称。

【注意】此函数产生的视图使用随机函数。每次在查询中使用它时,它的内容都可能不同。要使视图上的操作可预测,请将其存储在常规表中

inputrelation

包含函数用于创建更平衡数据集的数据的表或视图。如果在配置单元中定义了输入关系,请使用SYNC_WITH_HCATALOG_SCHEMA 同步 HCATALOG SCHEMA,然后运行机器学习功能

responsecolumn

因变量:输入列的名称,类型为VARCHARINTEGER

balancemethod

指定从少数类和多数类中选择数据的方法,如下所示:

·     hybrid_sampling::在不同的类上执行过采样和欠采样直到每个类均衡分布

·     over_sampling::在所有类上执行过采样以达到多数类的基数(多数类除外)

·     under_sampling::在所有类上执行欠采样以达到少数类的基数(少数类除外)

·     weighted_sampling:欠抽样的别名

Ratio

多数类与少数类之间的理想比例。默认为1.0

 

2.1.2  检测异常值

根据DETECT_OUTLIERS返回数据集中的异常值。对数据进行深度分析前首先从数据中删除异常值。异常值是与其他类似数据点有很大不同的数据点。

语句语法

DETECT_OUTLIERS ( 'outputtable', 'inputrelation','inputcolumns', 'detectionmethod'

                  [ USING PARAMETERS [outlier_threshold=threshold]

                                     [, exclude_columns='excludedcolumns']

                                     [, partition_columns='partitioncolumns'] ] )

参数解析

参数

说明

outputtable

MPP保存所选输入列的异常值行的表。此表中包含所有列

inputrelation

包含异常数据的表或视图。如果在hive中定义了输入关系,请使用SYNC_WITH_HCATALOG_SCHEMA去同步hcatalog schema,然后运行机器学习功能

inputcolumns

从输入表/视图中使用逗号分隔的列列表,或使用星号(*)选择所有列

detectionmethod

要使用的异常值检测方法,设置为robust_zscore

outlier_threshold

用于将该行标识为异常值得行中的最小标准值。默认为3.0

exclude_columns

以逗号分割的输入列列名列表,以便从处理中删除

partition_columns

以逗号分割的列名称,用于定义分区的输入表或者视图。分别检测每个分区之间的异常值。默认是空列表

 

2.1.3  编码分类列

很多机器学习算法不能用于分类数据,必须在训练前将分类数据转换为数字数据。ONE_HOT_ENCODER_FIT函数为要编码的每个要素生成每个类别级别的排序列表,并存储模型。

语句语法

ONE_HOT_ENCODER_FIT ( 'modelname', 'inputrelation','inputcolumns'

                  [ USING PARAMETERS [exclude_columns='excludedcolumns']

                                     [, output_view='outputview']

                                     [, extra_levels='categorylevels'] ] )

参数解析

参数

说明

modelname

标识要创建的模型,其中模型名称符合标识符中描述的约定。在同一模式中的序列、表、projection、视图和模型的所有名称中,也必须是唯一的

inputrelation

包含一个热编码的表或视图。如果在hive中定义了输入关系,请使用SYNC_WITH_HCATALOG_SCHEMA去同步hcatalog schema,然后运行机器学习功能

inputcolumns

从输入表/视图中使用逗号分隔列,或使用星号(*)选择所有列

exclude_columns

输入要从处理中排除的列,列名以逗号分隔

output_view

存储输入关系和热编码的视图的名称。列按它们在输入关系中出现的顺序返回,在原始列之后追加一个热编码列

extra_levels

输入关系中不存在的每个类别中的其他级别。此参数应作为JSON字符串传递,类别名称作为键,每个类别中的额外级别列表作为值。

【注意】根据JSON标准引用超参数名称和字符串值

 

2.1.4  输入缺失值

使用impute函数替换最常用值或同一列中的平均值的缺失数据。

Impute函数:根据每列中变量的观察值,使用均值或模式来估算数据集中的缺失值。此函数支持数字和分类数据类型。

语句语法

IMPUTE( 'outputview', 'inputrelation', 'inputcolumns', 'method'

            [ USING PARAMETERS [exclude_columns='excludedcolumns']

                               [, partition_columns='partitioncolumns'] ] )

参数解析

参数

说明

outputview

显示输入表的视图的名称,该表使用插补值代替缺少的值。在此视图中,不缺少值的行保持不变,而缺少值的行则根据指定的方法进行修改

inputrelation

包含缺失值插补数据的表或视图。如果在hive中定义了输入关系,请使用SYNC_WITH_HCATALOG_SCHEMA去同步hcatalog schema,然后运行机器学习功能

inputcolumns

输入关系中以逗号分隔的列列表,其中缺少的值将被替换,或用星号(*)指定所有列

method

用于计算缺失值替换的方法,包括以下方法之一:

平均值:每列中缺失的值将替换为该列的平均值。这种方法只能用于数值数据。

模式:每列中缺少的值将替换为该列中最常用的值。此方法只能用于分类数据

exclude_columns

在处理过程中排除inputcolumns中的列名,列名以逗号分隔

partition_columns

在处理过程中排除inputrelation中的列名,列名以逗号分隔

 

示例

=> SELECT impute('output_view','small_input_impute', 'pid, x1,x2,x3,x4','mean'

USING PARAMETERS exclude_columns='pid');

impute

--------------------------

Finished in 1 iteration

(1 row)

2.1.5  归一化数据

对输入关系运行归一化算法。输出是具有规范化数据的视图。

语句语法

NORMALIZE ( 'outputview', 'inputrelation', 'inputcolumns', 'normalizationmethod'

           [ USING PARAMETERS [exclude_columns='excludedcolumns'] ] )

参数解析

参数

说明

outputview

显示输入关系的视图的名称,其中使用规范化数据替换指定的输入列

inputrelation

包含要规范化的数据的表或视图。如果在hive中定义了输入关系,请使用SYNC_WITH_HCATALOG_SCHEMA去同步hcatalog schema,然后运行机器学习功能

inputcolumns

输入关系中以逗号分隔的数字列列表,其中包含要规格化的值,或使用星号(*)选择所有列

normalizationmethod

要使用的规范化方法,请执行以下操作之一:

·     minmax

·     zscore

·     robust_zscore

如果表中出现无穷多个值,则该方法将忽略这些值

exclude_columns

在处理过程中排除inputcolumns中的列,列名以逗号分隔

 

示例

=> SELECT NORMALIZE('mtcars_norm', 'mtcars',

                    'wt, hp', 'minmax');

        NORMALIZE

--------------------------

 Finished in 1 iteration

 (1 row)

2.1.6  采样数据

数据采样的目标是大的数据集中获取更小、更易于管理的数据样本。使用样本数据集,用户可以生成预测模型或使用它来帮助用户调整数据库。使用TABLESAMPLE字句创建数据样本。

示例

使用baseball表,创建一个名为baseball_sample包含25%样本的新表baseball。TABLESAMPLE无法返回该字句中定义的记录的确切百分比。

CREATE TABLE baseball_sample AS SELECT * FROM baseball TABLESAMPLE(25);

2.1.7  SVD(奇异值分解)

奇异值分解(SVD)是一种矩阵分解方法,允许用户将维数为n-by-p的矩阵X近似为3个矩阵的乘积:X(n-by-p)=U(n-by-k).S(k-by-k).VT(k-by-p),其中k是从1到p的整数,S是对角矩阵。它的对角线有非负值,称为奇异值,从左上角的最大值到右下角的最小值排序。S的所有其他元素均为零。

可以使用以下功能来训练和应用SVD模型:

APPLY_INVERSE_SVD

将数据转换回原始域。通过乘以三个矩阵来计算原始数据的近似版本:矩阵U(此函数的输入),矩阵S和V(存储在模型中)。

APPLY_SVD

使用SVD转换数据。这计算了SVD分解的矩阵。

SVD

计算输入关系的SVD分解的奇异值(S矩阵的对角线)和右奇异向量(V矩阵)。结果保存在SVD模型。SVD中的奇异向量的所有元素的符号可以在不同的运行中一起翻转。

语句语法

SVD ( 'modelname', 'inputrelation', 'inputcolumns'

     [ USING PARAMETERS [exclude_columns=['excludedcolumns']

                        [, num_components=numc omponents]

                        [, method='method'] ] )

参数解析

参数

说明

modelname

显示输入关系的视图的名称,其中使用规范化数据替换指定的输入列

inputrelation

包含要规范化的数据的表或视图

inputcolumns

输入关系中以逗号分隔的数字列列表,其中包含要规格化的值,或使用星号(*)选择所有列

exclude_columns

在处理过程中排除inputcolumns中的列名,列名以逗号分隔

num_components

要保留在模型中的零部件数量。组件的最大数量是计算的非零奇异值的数量,它小于或等于min(列数、行数)。如果省略此参数,将保留所有组件

method

用于计算SVD的方法,可以设置为LAPACK

 

示例

=> SELECT SVD ('svdmodel', 'small_svd', 'x1,x2,x3,x4');

SVD

--------------------------------------------------------------

Finished in 1 iterations.

Accepted Rows: 8  Rejected Rows: 0

(1 row)

2.1.8  PCA(主成分分析)

主成分分析(PCA)是一种降低数据维数同时保留数据变化的算法。

语句语法

PCA ( 'model‑name', 'input‑relation', 'input‑columns'

        [ USING PARAMETERS

              [exclude_columns = 'excluded‑columns']

              [, num_components = num‑components]

              [, scale = is‑scaled]

              [, method = 'method'] ] )

 

参数解析

参数

说明

modelname

显示要创建的模型名称

inputrelation

包含要PCA处理的表或视图

inputcolumns

输入关系中以逗号分隔的数字列,或使用星号(*)选择所有列。所有输入列必须都是数字类型

exclude_columns

在处理过程中排除inputcolumns中的列名,列名以逗号分隔

num_components

要保留在模型中的零部件数量。组件的最大数量是计算的非零奇异值的数量,它小于或等于min(列数、行数)。如果省略此参数,将保留所有组件

scale

布尔值,指定是否在准备步骤中标准化列:

·     True: 使用相关矩阵而不是协方差矩阵

·     False (default)

method

用于计算PCA的方法,可以设置为LAPACK

 

示例

=> SELECT PCA ('pcamodel', 'world','country,HDI,em1970,em1971,em1972,em1973,em1974,em1975,em1976,em1977,

em1978,em1979,em1980,em1981,em1982,em1983,em1984 ,em1985,em1986,em1987,em1988,em1989,em1990,em1991,em1992,

em1993,em1994,em1995,em1996,em1997,em1998,em1999,em2000,em2001,em2002,em2003,em2004,em2005,em2006,em2007,

em2008,em2009,em2010,gdp1970,gdp1971,gdp1972,gdp1973,gdp1974,gdp1975,gdp1976,gdp1977,gdp1978,gdp1979,gdp1980,

gdp1981,gdp1982,gdp1983,gdp1984,gdp1985,gdp1986,gdp1987,gdp1988,gdp1989,gdp1990,gdp1991,gdp1992,gdp1993,

gdp1994,gdp1995,gdp1996,gdp1997,gdp1998,gdp1999,gdp2000,gdp2001,gdp2002,gdp2003,gdp2004,gdp2005,gdp2006,

gdp2007,gdp2008,gdp2009,gdp2010' USING PARAMETERS exclude_columns='HDI,country');

PCA

---------------------------------------------------------------

Finished in 1 iterations.

Accepted Rows: 96  Rejected Rows: 0

(1 row)

2.2  回归算法

回归是一种流行的机器学习工具,它通过学习数据的某些特征与观察值响应之间的关系来进行预测。

2.2.1  线性回归(预测线性关系中的连续数值结果)

使用线性回归来模拟自变量或者特征与因变量或者结果之间的线性关系。构建线性回归模型:将预测模型拟合到自变量和一些因变量的训练数据集。或者使用特征变量值来预测结果。确定自变量和某个结果变量之间关系强度。

1. LINEAR_REG

对输入关系执行线性回归,并返回线性回归模型。

语法语句

LINEAR_REG ( 'model-name','input-relation','response-column','predictor-columns'

[ USING PARAMETERS

[exclude_columns='excluded-columns']

[, optimizer='optimizer-method']

[,regularization='regularization-method']

 [, epsilon=epsilon-value]

 [, max_iterations=iterations]

 [, lambda=lamda-value]

[, alpha=alpha-value] ] )

示例

使用faithful_training训练数据创建名为linear_reg_faithful的线性回归模型。

SELECT LINEAR_REG('linear_reg_faithful', 'faithful_training', 'eruptions', 'waiting' USING PARAMETERS optimizer='BFGS');

 

2.2.2  回归随机森林

随机森林回归算法创建了一个回归树的集合模型。在随机选择的训练数据子集上训练每棵树。该算法预测的值是各树的平均预测值。

1. RF_REGRESSOR函数

训练随机森林模型以对输入关系进行回归。

语法语句

RF_REGRESSOR ( 'model-name', input-relation, 'response-column', 'predictor-columns'

[ USING PARAMETERS

[exclude_columns='excluded-columns']

[, ntree=num-trees]

[, mtry=num-features]

[, sampling_size=sampling-size]

[, max_depth=depth]

[, max_breadth=breadth]

[, min_leaf_size=leaf_size]

[, min_info_gain=threshold]

[, nbins=num-bins] ] )

 

示例

(1)     使用'mtcars'训练数据创建名为myRFRegressorModel的随机森林模型。

SELECT RF_REGRESSOR ('myRFRegressorModel', 'mtcars', 'carb', 'mpg, cyl, hp, drat, wt' USING PARAMETERS ntree=100, sampling_size=0.3);

(2)     查看模型摘要输出。

SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='myRFRegressorModel');

 

2.2.3  用于回归的SVM(支持向量机)

用于回归的支持向量机(SVM)基于训练数据预测连续有序变量。

与用于确认二元分类结果的logistic回归不同,回归的SVM主要用于预测连续数值结果。

1. SVM_REGRESSOR

在输入关系上训练SVM模型。

语法语句

SVM_REGRESSOR ( 'model‑name', input‑relation, 'response‑column', 'predictor‑columns'

        [ USING PARAMETERS

              [exclude_columns = 'excluded‑columns']

              [, error_tolerance = error-tolerance]

              [, C = cost]

              [, epsilon = epsilon‑value]

              [, max_iterations = max‑iterations]

              [, intercept_mode = 'mode']

              [, intercept_scaling = 'scale'] ] )

示例

使用faithful_training训练数据创建名为svm_faithful的SVM模型。

 

2.2.4  自回归算法

自回归模型根据先前的时间序列值预测未来的值。可针对具有一致时间步长的平稳时间序列创建自回归模型。

由于其输入数据必须按时间戳排序,因此该算法是单线程的。

语句语法

AUTOREGRESSOR ('model‑name', 'input‑relation', 'data‑column', 'timestamp‑column'

        [ USING PARAMETERS

              [ p = lags ]

              [, missing = "imputation‑method" ]

              [, regularization = "regularization‑method" ]

              [, lambda = regularization‑value ]

              [, compute_mse = boolean ]

        ] )

示例

使用temp_data训练数据创建名为AR_temperatur的自回归模型。

 

SELECT AUTOREGRESSOR('AR_temperature', 'temp_data', 'Temperature', 'time' USING PARAMETERS p=3);

                    AUTOREGRESSOR

---------------------------------------------------------

 Finished. 3650 elements accepted, 0 elements rejected.

(1 row)

2.2.5  XGBoost回归算法

XGBoost (eXtreme Gradient Boosting)是一种监督学习算法,用于对大型数据集进行回归和分类的算法,它使用顺序构建的浅层决策树来提供准确的结果和高度可扩展的训练方法,以避免过度拟合。

语句语法

XGB_REGRESSOR ('model-name', 'input-relation', 'response-column', 'predictor-columns'

        [ USING PARAMETERS

              [ exclude_columns = 'excluded-columns' ]

              [, max_ntree = max-trees ]

              [, max_depth = max-depth ]

              [, objective = 'optimization-strategy' ]

              [, learning_rate = learning-rate ]

              [, min_split_loss = minimum ]

              [, weight_reg = regularization ]

              [, nbins = num-bins ]

              [, sampling_size = fraction-of-rows ]

              [, col_sample_by_tree = sample-ratio-per-tree ]

              [, col_sample_by_node = sample-ratio-per-node ]

        ] )

示例

使用mtcars训练数据创建名为xgb_cars的XGBoost回归模型。

=> SELECT XGB_REGRESSOR ('xgb_cars', 'mtcars', 'carb', 'mpg, cyl, hp, drat, wt'

    USING PARAMETERS learning_rate=0.5);

 XGB_REGRESSOR

---------------

 Finished

(1 row)

2.3  分类算法

分类是一种重要的机器学习工具,可将数据集中的项目分配给不同的类别。分类用于预测随间推移的风险,欺诈检测,文本分类等。分类函数以已知不同类别的数据集开始。

2.3.1  逻辑回归算法

使用逻辑回归,模拟自变量或者特征与某些因变量或结果之间的关系。逻辑回归总是二进制值。构建逻辑回归模型用以将预测模型拟合到自变量和一些二元因变量的训练数据集。确定自变量和某些二元结果变量之间关系的强度。

1. LOGISTIC_REG

对输入关系执行逻辑回归。结果是逻辑回归模型。

语句语法

LOGISTIC_REG ( 'model‑name', 'input‑relation', 'response‑column', 'predictor‑columns'

        [ USING PARAMETERS [exclude_columns = 'excluded‑columns']

              [, optimizer = 'optimizer‑method']

              [, regularization = 'regularization‑method']

              [, epsilon = epsilon‑value]

              [, max_iterations = iterations]

              [, lambda = lamda‑value]

              [, alpha = alpha‑value] ] )

示例

使用mtcars_train训练数据创建名为logistic_reg_mtcars的逻辑回归模型。

SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt' USING PARAMETERS exclude_columns='hp');

 

2.3.2  朴素贝叶斯

当特征独立时,可以使用朴素贝叶斯算法对数据进行分类。该算法使用独立特征来计算特定类的概率。多用于文本分类,(例如预测垃圾邮件的概率)。

1. NAIVE_BAYES

在输入关系上执行朴素贝叶斯算法。结果是朴素贝叶斯模型。

根据数据类型处理列:

·     FLOAT:假设值遵循一些高斯分布。

·     INTEGER:假定值属于一个多项分布。

·     CHAR/VARCHAR:假定值遵循某些分类分布。存储在这些列中的字符串值不超过128个字符。

·     BOOLEAN:值被视为具有两个值的分类。

语法语句

NAIVE_BAYES ( 'model-name', 'input-relation', 'response-column', 'predictor-columns' [ USING PARAMETERS[exclude_columns='excluded-columns'] [, alpha=alpha-value] ] )

示例

使用house84_train训练数据创建名为naive_house84_model的NAIVE_BAYES模型。

SELECT NAIVE_BAYES('naive_house84_model', 'house84_train', 'party', '*' USING PARAMETERS exclude_columns='party, id');

 

2.3.3  分类随机森林算法

随机森林算法创建决策树的集合模型。在随机选择的训练数据子集上训练每棵树。

1. RF_CLASSIFIER

训练随机森林模型以对输入关系进行分类。

语法语句

RF_CLASSIFIER ( 'model‑name', input‑relation, 'response‑column', 'predictor‑columns' 

        [ USING PARAMETERS

              [exclude_columns = 'excluded‑columns']   

              [, ntree = num‑trees]

              [, mtry = num‑features]

              [, sampling_size = sampling‑size]

              [, max_depth = depth]

              [, max_breadth = breadth]

              [, min_leaf_size = leaf-size]

              [, min_info_gain = threshold]

              [, nbins = num‑bins] ] )

示例

使用iris数据创建名为myRFModel的随机森林模型,查看模型的摘要输出。

 

2.3.4  分类算法-SVM(支持向量机)

支持向量机(SVM)是一种分类算法,他根据训练数据将数据分配给一个类别或另一个类别。

SeaSQL EDW中SVM算法的实现基于规则化logistic回归的分布式牛顿方法。

1. SVM_CLASSIFIER

语法语句

SVM_CLASSIFIER ( 'model‑name', input‑relation, 'response‑column', 'predictor‑columns'

        [ USING PARAMETERS

              [exclude_columns = 'excluded‑columns']

              [, C = 'cost']

              [, epsilon = 'epsilon‑value']

              [, max_iterations = 'max‑iterations']

              [, class_weights = 'weight']

              [, intercept_mode = 'intercept‑mode']

              [, intercept_scaling = 'scale'] ] )

示例

使用mtcars_train训练数据创建名为svm_class1的SVM模型。

SELECT SVM_CLASSIFIER('svm_class1', 'mtcars_train', 'am', 'cyl, mpg, wt, hp, gear' USING PARAMETERS exclude_columns='gear');

 

2.3.5  XGBoost分类算法

对数据集使用XGBoost算法进行分类训练。

语法语句

XGB_CLASSIFIER ('model-name', 'input-relation', 'response-column', 'predictor-columns'

        [ USING PARAMETERS

              [ exclude_columns = 'excluded-columns' ]

              [, max_ntree = max-trees ]

              [, max_depth = max-depth ]

              [, objective = 'optimization-strategy' ]

              [, learning_rate = learning-rate ]

              [, min_split_loss = minimum ]

              [, weight_reg = regularization ]

              [, nbins = num-bins ]

              [, sampling_size = fraction-of-rows ]

              [, col_sample_by_tree = sample-ratio-per-tree ]

              [, col_sample_by_node = sample-ratio-per-node ]

        ] )

示例

使用iris训练数据创建名为xgb_iris的XGBoost模型。

=> SELECT XGB_CLASSIFIER ('xgb_iris', 'iris', 'Species', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width'

    USING PARAMETERS max_ntree=10, max_depth=5, weight_reg=0.1, learning_rate=1);

 XGB_CLASSIFIER

----------------

 Finished

(1 row)

2.4  聚类算法

Clustering Algorithms

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。与分类类似,聚类对数据进行分段。但是在集群中,未定义分类组。聚类可用于查找数据中的异常并查找自然数据组。例如,可以使用聚类来分析区域并确认该区域的哪些区域最有可能被地震击中。

在SeaSQL EDW中,基于欧几里得距离计算聚类。通过该计算,数据点被分配给具有最近平均值的聚类。

2.4.1  K-means

使用k-means算法根据数据点之间的相似性将数据点聚类到k个不同的组中。k-means将每个观察值分配给具有最近平均值的聚类。最接近的平均值也成为聚类中心。

语法语句

KMEANS ( 'model‑name', 'input‑relation', 'input‑columns', 'num‑clusters'

        [ USING PARAMETERS

           [exclude_columns = 'excluded‑columns']

           [, max_iterations = max‑iterations]

           [, epsilon = epsilon‑value]

           [, { init_method = 'init‑method' } | { initial_centers_table = 'init‑table' } ]

           [, output_view = 'output‑view']

           [, key_columns = 'key‑columns'] ] )

示例

使用agar_dish_1表数据创建名为agar_dish_kmeans的k-means模型。

SELECT KMEANS('agar_dish_kmeans', 'agar_dish_1', '*', 5 USING PARAMETERS exclude_columns ='id', max_iterations=20, output_view='agar_1_view', key_columns='id');

 

2.4.2  二分K-means

二分k-means聚类算法将k-means聚类与分裂层次聚类相结合。使用二分k-means可以获得数据点击群的层次结构。

语法语句

BISECTING_KMEANS('model-name', 'input-relation', 'input-columns', 'num-clusters'

           [ USING PARAMETERS

                 [exclude_columns = 'exclude-columns']

                 [, bisection_iterations = bisection-iterations] 

                 [, split_method = 'split-method'] 

                 [, min_divisible_cluster_size = min-cluster-size]

                 [, kmeans_max_iterations = kmeans-max-iterations]

                 [, kmeans_epsilon = kmeans-epsilon]

                 [, kmeans_center_init_method = 'kmeans-init-method']

                 [, distance_method = 'distance-method']

                 [, output_view = 'output-view']  

                 [, key_columns = 'key-columns'] ] )

示例

使用agar_dish_1表数据创建名为agar_dish_bkmeans的二分k-means模型。

 SELECT BISECTING_KMEANS('agar_dish_bkmeans', 'agar_dish_training', '*', 5 USING PARAMETERS exclude_columns='id', key_columns='id', output_view='agar_1_view');

 BISECTING_KMEANS

------------------

 Finished.

(1 row)

2.5  时间序列预测算法

时间序列模型是在具有一致时间步长的平稳时间序列(即平均值不随时间变化的时间序列)上进行训练。这些算法通过分析一些先时间步长的值来预测未来值。

2.5.1  自回归算法

自回归模型根据先前的时间序列值预测未来的值。可针对具有一致时间步长的平稳时间序列创建自回归模型。

由于其输入数据必须按时间戳排序,因此该算法是单线程的。

语句语法

AUTOREGRESSOR ('model‑name', 'input‑relation', 'data‑column', 'timestamp‑column'

        [ USING PARAMETERS

              [ p = lags ]

              [, missing = "imputation‑method" ]

              [, regularization = "regularization‑method" ]

              [, lambda = regularization‑value ]

              [, compute_mse = boolean ]

        ] )

示例

使用temp_data训练数据创建名为AR_temperatur的自回归模型。

SELECT AUTOREGRESSOR('AR_temperature', 'temp_data', 'Temperature', 'time' USING PARAMETERS p=3);

                    AUTOREGRESSOR

---------------------------------------------------------

 Finished. 3650 elements accepted, 0 elements rejected.

(1 row)

2.5.2  Moving-average算法

移动平均(Moving-average)算法使用先前预测的误差来进行未来预测。

语法语句

MOVING_AVERAGE ('model‑name', 'input‑relation', 'data‑column', 'timestamp‑column'

        [ USING PARAMETERS

              [ q = lags ]

              [, missing = "imputation‑method" ]

              [, regularization = "regularization‑method" ]

              [, lambda = regularization‑value ]

              [, compute_mse = boolean ]

        ] )

示例

使用temp_data表数据创建名为MA_temperature的移动平均模型。

=> SELECT MOVING_AVERAGE('MA_temperature', 'temp_data', 'temperature', 'time' USING PARAMETERS q=3, missing='linear_interpolation', regularization='none', lambda=1);

                    MOVING_AVERAGE

---------------------------------------------------------

 Finished. 3650 elements accepted, 0 elements rejected.               

(1 row)

2.6  模型管理

本节介绍如何管理模型。

2.6.1  修改模型

使用alter model可修改已存在的模型的所属用户及schema及名称等。

语法语句

ALTER MODEL [[database.]schema.]model

   { OWNER TO owner

     | RENAME TO new‑name

     | SET SCHEMA schema

 }

1. 改变模型所有权

作为超级用户或者模型所有者,用户可以alter model 按如下方式重新分配模型所有权:

ALTER MODEL MODEL-NAME OWNER TO OWNER-NAME;

示例

(1)     查看模型的基础信息,模型所有者为dbadmin。

SELECT * FROM V_CATALOG.MODELS where model_name ='svm_class1';

 

(2)     修改模型svm_class1的所有者为testsvm用户

alter model svm_class1 owner to testsvm;

SELECT * FROM V_CATALOG.MODELS where model_name ='svm_class1';

 

2. 将模型移动到另一个模式

示例

将模型svm_class1移动到testzhao模式下。

alter model svm_class1 set schema testzhao;

SELECT * FROM V_CATALOG.MODELS where model_name ='svm_class1';

 

3. 模型重命名

示例

将模型svm_class1重命名为svm_classtest。

alter model testzhao.svm_class1 rename to svm_classtest;

 

2.6.2  删除模型

删除数据库中一个或者多个已存在模型。

语法语句

DROP MODEL [ IF EXISTS ] [[database.]schema.]model[,…]

示例

删除svm_classtest;模型

drop model svm_classtest;

 

2.6.3  模型安全管理

使用Grant/revoke语句对模型进行权限管理。

语法语句

·     Grant语法:

GRANT { privilege[,…] | ALL [ PRIVILEGES ] [ EXTEND ] }

   ON MODEL [[database.]schema.]model‑name[,…]

   TO grantee[,…]

   [ WITH GRANT OPTION ]

·     revoke语法:

REVOKE [ GRANT OPTION FOR ] { privilege[,…] | ALL [ PRIVILEGES ] }

   ON MODEL [[database.]schema.]model‑name [,…]

   FROM grantee[,…]

   [ CASCADE ]

示例

(1)     将表faithful 的select权限授予testsvm用户

grant select on faithful to testsvm;

(2)     将在public模式 的create权限授予testsvm用户

grant create on schema public to testsvm;

(3)     切换到testsvm用户下,使用LINEAR_REG创建linearfaithful模型。

dbadmin=> \c - testsvm

SELECT LINEAR_REG('linearfaithful', 'faithful', 'eruptions', 'waiting' USING PARAMETERS optimizer='BFGS');

        LINEAR_REG

---------------------------

 Finished in 3 iterations

 

(1 row)

(4)     向testsvm用户授予模型'linearfaithful'的useage权限

(5)     用testsvm用户连接数据库,运行GET_MODEL_SUMMARY函数确认testsvm用户具有模型usage权限的用户可以在该模型上运行GET_MODEL_SUMMARY。

 

(6)     撤销testsvm用户对模型'linearfaithful'的usage权限,然后使用testsvm用户连接数据库并运行GET_MODEL_SUMMARY函数。

 

2.6.4  模型查看

数据库将所有模型的信息存储在models系统表中。

可使用以下语句进行查看:

SELECT * FROM V_CATALOG.MODELS;


3 时序数据处理

3.1  概述

3.1.1  什么是时序数据

时间序列数据(时序数据)是一个用于描述在时间上变化的变量的二维对象。时序数据组成元素包括:

·     变量值

·     时间坐标轴

如下图所指示:

时间序列在科学、经济、工程等领域很常见:

·     股票报价

·     温度

·     国内生产总值

·     唯一身份访问者数量

3.1.2  什么时序分析

时序分析是以分析时序数据的发展过程、方向和趋势,预测将来时域可能达到的目标的方法。

常见业务场景:

·     监控软件系统:虚拟机、容器、服务、应用

·     监控物理系统:水文监控、制造业工厂中的设备监控、国家安全相关的数据监控、通讯监控、传感器数据、血糖仪、血压变化、心率等

·     资产跟踪应用:汽车、卡车、物理容器、运货托盘

·     金融交易系统:传统证券、新兴的加密数字货币

·     事件应用程序:跟踪用户、客户的交互数据

·     商业智能工具:跟踪关键指标和业务的总体健康情况

3.2  时序数据处理常用函数

3.2.1  TIMESERIES

功能:提供间隙填充和插值(GFI)计算,这是时间序列分析计算的重要组成部分。它执行间隙填充和内插,以生成输入记录中缺少的时间片,句法如下:

TIMESERIES slice_time AS 'length_and_time_unit_expression'

OVER ( ... [ window-partition-clause[ , ... ] ] 

... ORDER BY time_expression )

... [ ORDER BY table_column [ , ... ] ]

参数

说明

slice_time

TIMESERIES子句产生的时间列,用于存储由间隙填充生成的时间片开始时间。

length_and_time_unit_expression

指定时间片计算的时间单位的长度

如:TIMESERIES slice_time AS '3 seconds' ...

over()

指定分区和排序的窗口函数

PARTITION BY (columnexpr[,] )

对指定的数据列进行分区

ORDER BY timeexpr

对指定的数据列进行排序

 

3.2.2  TS_FIRST_VALUE

功能:处理属于每个时间片的数据。时间序列聚合函数TS_FIRST_VALUE在时间片的开始处返回值,如果缺少时间片,则应用插值方法。在这种情况下,该值由对应前一个(或者下一个)值确定时间片。

语法如下:

TS_FIRST_VALUE ( expression [ IGNORE NULLS ] [, { 'CONST' | 'LINEAR' } ] )

参数

说明

expression

列表达式,需为int或float类型

IGNORE NULLS

插值时是否忽略空值

'CONST' | 'LINEAR'

常量(默认)或线性插值

 

3.2.3  TS_LAST_VALUE

功能:处理属于每个时间片的数据。时间序列聚合函数TS_LAST_VALUE在时间片的末尾返回值,如果缺少时间片,则在其中应用插值方案。

TS_LAST_VALUE 如果指定了分区表达式,则每个时间片返回一个输出行,或者每个时间片每个分区返回一个输出行。

语法如下:

TS_LAST_VALUE ( expression [ IGNORE NULLS ] [, { 'CONST' | 'LINEAR' } ] )

参数

说明

expression

列表达式,需为int或float类型

IGNORE NULLS

插值时是否忽略空值

'CONST' | 'LINEAR'

常量(默认)或线性插值

 

3.2.4  TIME_SLICE

功能:按不同的固定时间间隔聚合数据,并将上舍入后的输入TIMESTAMP值返回为与时间片间隔的开始或结束相对应的值。

给定一个输入TIMESTAMP值,例如2000-10-28 00:00:01,3秒时间片间隔,开始时间为2000-10-28 00:00:00,同一时间片的结束时间为2000-10-28 00:00:03。

语法如下:

TIME_SLICE( expression, slice-length [, 'timeunit' [, 'startorend' ] ] )

参数

说明

expression

需为timestamp字段类型或可以解析为timestamp的字段类型

slice-length

一个正整数,指定切片长度

timeunit

切片的时间单位,以下之一:

HOUR

MINUTE

SECOND (默认)

MILLISECOND

MICROSECOND

startorend

使用以下字符串之一指定返回值是对应于开始时间还是结束时间:

START (默认)

END

注意:仅当用户还提供非空时间单位参数时,才可以包含此参数。

 

Null值处理:

·     当slice-length,timeunit,startorend参数中任意一个为null时,函数返回错误。

·     若expression为null,且slice-length,timeunit,startorend为合理值时,函数返回null。

示例:

(1)     返回一个3s时间片的起始时间

SELECT TIME_SLICE('2009-09-19 00:00:01', 3);

     TIME_SLICE

---------------------

 2009-09-19 00:00:00

(1 row)

(2)     返回一个3s时间片的结束时间

SELECT TIME_SLICE('2009-09-19 00:00:01', 3, 'SECOND', 'END');

     TIME_SLICE

---------------------

 2009-09-19 00:00:03

3.2.5  INTERPOLATE

INTERPOLATE是一个谓词

作用:用户事件序列关联

语法如下:

expression1 INTERPOLATE PREVIOUS VALUE expression2

参数

说明

expression1

expression2

从from子句中指定的表的列,通常数据类型为timestamp

PREVIOUS VALUE

当不匹配时,用关系中的先前值填充非保留值。输入行按连接列的升序排列

 

描述:

·     事件序列联接是常规外部联接的扩展。事件序列联接使用表中的先前值填充非保留侧,而不是在不存在匹配时将非保留侧填充为空值。

·     表示常规外部联接和事件序列联接的区别在于INTERPOLATE谓词,该谓词用于ON子句。

·     内插值来自包含空值的表,而不来自另一个表。

·     SeaSQL EDW不保证输出中不会有空值。如果不匹配的行没有先前的值,则该行将填充为空。

·     事件序列联接要求两个表都以相等谓词的顺序在任何列上排序,然后是INTERPOLATED列。如果已经按此顺序对数据进行了排序,则可以避免显式排序,从而可以提高查询性能。

3.3  时序数据处理操作

3.3.1  间隔填充和插值

由于时间和时间序列中的数据状态都是连续的,因此随着时间的推移评估SQL查询可能会很困难。输入记录通常以不均匀的间隔出现,这可能会造成间隔。为了解决此问题,SeaSQL EDW提供了如下两种解决办法:

·     间隙填充功能,可填充缺失的数据点。

·     插值方案,它在一组离散的已知数据点范围内构造新的数据点。

SeaSQL EDW对数据中的非时间序列列进行插值(例如在时间片上计算的分析函数结果),并将缺少的数据点添加到输出中。

示例:

CREATE TABLE public.tseries ( ts, value ) AS /* +direct */

    SELECT '2015-05-21 23:08:02'::TIMESTAMP(0), 27 UNION ALL

    SELECT '2015-05-21 23:08:11'::TIMESTAMP(0), 26 UNION ALL

    SELECT '2015-05-21 23:08:20'::TIMESTAMP(0), 30 UNION ALL

    SELECT '2015-05-21 23:08:53'::TIMESTAMP(0), 28 UNION ALL

    SELECT '2015-05-21 23:09:03'::TIMESTAMP(0), 27 UNION ALL

    SELECT '2015-05-21 23:11:18'::TIMESTAMP(0), 20 UNION ALL

    SELECT '2015-05-21 23:16:38'::TIMESTAMP(0), 13 UNION ALL

    SELECT '2015-05-21 23:16:49'::TIMESTAMP(0),12

;

查看表中数据如下:

 

表中缺少23:10:00,23:12:00,23:13:00,23:14:00,23:15:00等数据。那如何根据前后值,确定缺失时间点的数据呢?我们可以使用TIMESERIES语句,以1分钟为时间间隔,获取缺失的时间片,同时,对于每个时间片,只取一个值。对于value列,可以通过常量插值或线性插值的方式,来进行补全。

使用TIMESERIES语句,以1分钟为时间间隔,获取缺失的时间片,语句如下:

dbadmin=> SELECT tm FROM public.ts1 TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

(1)     常量插值

常量插值:(为获取当前时间片的值)用当前时间片的前值或最后值,作为当前时间片的值。对应的函数分别为TS_FIRST_VALUE和TS_LAST_VALUE。

·     取前值

使用当前时间片的前值,作为当前时间片的值。

dbadmin=> SELECT tm, TS_FIRST_VALUE(value) AS int_value FROM tseries TIMESERIES tm as '1 minute' OVER ( ORDER BY ts ) ;

 

如上所示:由于23:08:00没有前值,所以其值为null。23:09:00取距其最近的前值(2015-05-21 23:08:53),同理23:11:00取距其最近的前值(23:10:00)……

·     取后值

使用当前时间片的最后值,作为当前时间片的值。

dbadmin=> SELECT tm, TS_LAST_VALUE(value) AS int_value FROM tseries TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

如上所示:23:08:00时间片的最后值为23:08:52的值,23:09:00时间片的最后值为23:09:03,23:10:00由于原始数据中没有当前时间片的值,所以只能取23:09:00的值……

 

(2)     线性插值

线性插值,利用需要获取的时间片的最近的前后两个值,获取其斜率,进而根据该斜率,推算出当前值。同样,也是使用函数TS_FIRST_VALUE和TS_LAST_VALUE。

·     前向线性插值

dbadmin=> SELECT tm, TS_FIRST_VALUE(value, 'LINEAR') AS int_value FROM tseries TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

如上所示:由于23:08:00没有前值,所以其值为null。23:09:00取距其最近的前两个值(23:08:52和23:09:03,对应value分别为28和27),则23:09:00的值为27+3/11=27.3。同理23:10:00的值为20+78*7/135=24.0444444444444  ……

·     后向线性插值

结果如下:

dbadmin=> SELECT tm, TS_LAST_VALUE(value, 'LINEAR') AS int_value FROM tseries TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

可以看出,此时该值是前向线性插值的结果,向前移动一个时间片。

(3)     Null值处理

空值不是间隙填充和插值(GFI)计算的常用输入,但是如果确实存在空值,则可以将时间序列聚合函数(TS_FIRST_VALUE / TS_LAST_VALUE)与IGNORE NULLS参数一起使用,以影响插值的输出。

创建表tsvnull:

CREATE TABLE public.tsvnull ( ts, value ) AS /* +direct */

    SELECT '2015-05-21 23:08:02'::TIMESTAMP(0), null  UNION ALL

    SELECT '2015-05-21 23:08:11'::TIMESTAMP(0), 26 UNION ALL

    SELECT '2015-05-21 23:08:20'::TIMESTAMP(0), 30 UNION ALL

    SELECT '2015-05-21 23:08:53'::TIMESTAMP(0), 28 UNION ALL

    SELECT '2015-05-21 23:09:03'::TIMESTAMP(0), null  UNION ALL

    SELECT '2015-05-21 23:11:18'::TIMESTAMP(0), 20 UNION ALL

    SELECT '2015-05-21 23:16:38'::TIMESTAMP(0), 13 UNION ALL

    SELECT '2015-05-21 23:16:49'::TIMESTAMP(0),12

;

·     带Null值的常量插值

dbadmin=>  SELECT * FROM public.tsvnull order by ts;

 

若不忽略null值,其插值结果为:

dbadmin=>  SELECT tm, TS_LAST_VALUE(value) AS int_value FROM public.tsvnull TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

若忽略null值,其插值结果为:

dbadmin=> SELECT tm, TS_LAST_VALUE(value IGNORE NULLS) AS int_value FROM public.tsvnull TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

如上所示:23:09:00将使用最后一个已知的前值,即23:08:00的值。

·     带Null值的线性插值

线性插值要求在某一时间片至少存在两个值,如果其中一个为null,则插值结果为null。

原始数据为:dbadmin=>  SELECT * FROM public.tsvnull order by ts;

 

若不忽略null值,其插值结果为:

dbadmin=>  SELECT tm, TS_LAST_VALUE(value,'linear') AS int_value FROM public.tsvnull TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

若忽略null值,SeaSQL EDW将跳过null值,使用离null值最近的值来进行插值:

dbadmin=>  SELECT tm, TS_LAST_VALUE(value IGNORE NULLS,'linear') AS int_value FROM public.tsvnull TIMESERIES tm AS '1 minute' OVER ( ORDER BY ts ) ;

 

3.3.2  基于时间间隔的聚合操作

基于时间间隔的聚合操作是很常见的操作 ,比如你具有一些离散的时间数据(物品购买,网页访问),你想通过这些数据,做一些聚合运算,比如获取最大、最小值,每个小时的平均访客量等等。

在SeaSQL EDW中,可以使用time_slice()函数来完成这些操作。

现我们想统计每分钟事件发生次数和事件值:

dbadmin=> SELECT TIME_SLICE(ts, 1, 'minute'), COUNT(*) AS num, SUM(value) FROM public.tseries GROUP BY 1 ORDER BY 1 ;

 

3.3.3  事件序列关联

事件序列关联是一个MPP SQL扩展,它可以在两个序列的测量间隔不精确对齐时进行分析,例如时间戳不匹配。 可以直接比较两个序列的值,而不必将序列规范化为相同的测量间隔。

示例:

有两个时间序列,分别如下:

dbadmin=>  SELECT * FROM tseries;

         ts          | value

---------------------+-------

 2015-05-21 23:08:02 |    27

 2015-05-21 23:08:11 |    26

 2015-05-21 23:08:20 |    30

 2015-05-21 23:08:53 |    28

 2015-05-21 23:09:03 |    27

 2015-05-21 23:11:18 |    20

 2015-05-21 23:16:38 |    13

 2015-05-21 23:16:49 |    12

(8 rows)

 

dbadmin=>  SELECT * FROM tseries2;

         ts          | value

---------------------+-------

 2015-05-21 23:08:20 |    40

 2015-05-21 23:08:52 |    38

 2015-05-21 23:16:49 |    22

 2015-05-21 23:08:13 |    36

 2015-05-21 23:16:38 |    23

 2015-05-21 23:08:02 |    37

 2015-05-21 23:09:14 |    37

 2015-05-21 23:11:18 |    30

(8 rows)

tseries2中,标红的数据tseries1中并不存在。

 

如果单纯的使用full outer join,这些不匹配的时间点对应的值将为null值。

dbadmin=>  SELECT tseries.*, tseries2.*

     FROM tseries FULL OUTER JOIN tseries2 USING(ts) ;

 

可以在join时,使用实践序列关联,从而将不匹配时间点的值由null值替换为插值(前值)。

dbadmin=>  SELECT a.*, b.* FROM public.tseries a

      FULL OUTER JOIN public.tseries2 b

      ON ( a.ts INTERPOLATE PREVIOUS VALUE b.ts ) ;

 

3.3.4  模式匹配

SQL MATCH子句语法允许用户在搜索事件模式时筛选大量历史数据。 用户将模式指定为正则表达式,然后可以在输入事件序列中搜索模式。 MATCH提供了分析数据分区和排序的子语句,模式匹配发生在一组连续的行上。主要用于用户行为分析和市场营销。

SQL MATCH子句语法允许用户在搜索事件模式时筛选大量历史数据。

MATCH ( [ PARTITION BY table_column ] ORDER BY table_colum
 ... DEFINE event_name AS boolean_expr [,…]
 ... PATTERN pattern_name AS ( regexp )
 ... [ ROWS MATCH { ALL EVENTS | FIRST EVENT } ] )

其中,DEFINE用于定义模式匹配的规则。

PATTERN用于定义模式名。

示例:

如下表所示:有两个信号,分别为信号1和信号2,信号是按时间采集的,如果前一时刻的信号值大于后一时刻值,则将其标记为down;否则,标记为UP,用于寻找该序列的上升点。

dbadmin=>  SELECT * FROM public.ts1 ORDER BY signal, ts;

 

执行模式匹配:

dbadmin=> SELECT

dbadmin->     ts, signal, value, EVENT_NAME()

dbadmin-> FROM

dbadmin->     ( SELECT

dbadmin(>         ts, signal, value,

dbadmin(>         LAG(value) OVER(PARTITION BY signal ORDER BY ts) AS pvalue

dbadmin(>       FROM

dbadmin(>         public.ts1 ) a

dbadmin->     MATCH (

dbadmin(>         PARTITION BY signal

dbadmin(>         ORDER BY ts

dbadmin(>         DEFINE

dbadmin(>             Up      AS pvalue IS NOT NULL AND value > pvalue ,

dbadmin(>             Down    AS pvalue IS NOT NULL AND value < pvalue

dbadmin(>         PATTERN

dbadmin(>             V_shape AS ( Down Down+ Up )

dbadmin(>         ROWS MATCH ALL EVENTS

dbadmin(>     )

dbadmin-> ORDER BY signal, ts

dbadmin-> ;

 


4 地理空间分析

4.1  地理空间分析功能概述

H3C SeaSQL EDW自带的库内空间地理分析数据结构及函数,可以帮助用户进行:

·     地理空间分析

SeaSQL EDW提供的功能使用户可以操纵复杂的二维和三维空间对象。这些功能遵循开放地理空间联盟(OGC)标准。SeaSQL EDW还提供了数据类型和SQL函数,使用户可以根据OGC标准在数据库中指定和存储空间对象。

·     转换熟知文本(WKT)和熟知二进制(WKB)

转换WKT和WKB

·     优化空间关联业务

使用ST_Intersects和STV_Intersects执行快速空间关联查询。

·     通过Shapefile加载和导出空间数据

轻松地加载和导出shapefile。

·     存储和检索对象

¡     对象是否包含自交点或自切点。

¡     一个对象是否完全在另一个对象范围内,例如多边形范围内的点。

·     测试对象之间的关系

例如,它们是否相交或接触:

¡     确定对象的边界。

¡     确定对象的顶点。

·     计算

¡     两个对象之间的最短距离。

¡     对象的大小(长度、面积)。

¡     一个或多个对象的质心。

¡     一个或多个对象周围的缓冲区。

·     其他

SeaSQL EDW与shapefile数据格式兼容,shapefile数据格式是用于地理信息系统(GIS)软件的一种流行的地理空间矢量数据格式。用户可以轻松地以shapefile格式将位置数据加载到SeaSQL EDW数据库,然后使用该数据执行空间分析。还可以将结果导出到shapefile,然后可以将其加载到其他数据分析工具以进行可视化或进一步分析。

4.2  地理空间分析最佳实践

在SeaSQL EDW中执行地理空间分析时,SeaSQL EDW建议以下最佳做法。

4.2.1  性能优化

建议

细节

对空间数据使用最小列大小

分析性能随着列宽的增加而降低。为空间数据创建列时,请使用可容纳用户数据的最小尺寸的列。例如对于点数据使用GEOMETRY(85)

尽可能使用GEOMETRY类型

GEOGRAPHY类型的函数处理性能比GEOMETRY类型的函数处理性能要慢。所以尽可能使用GEOMETRY类型

为了提高函数处理性能,请对projections中以下空间列进行排序:

·     STV_Intersect标量函数

·     ST_Distance

·     ST_Area

·     ST_Length

用户可以通过对projections中的GEOMETRY列上进行排序来提高这些功能的过滤效率。但是,在较大的GEOMETRY列上排序可能会减慢数据加载速度

 

4.2.2  点和多边形的空间连接

SeaSQL EDW提供了两种方法来识别一组点是否与一组多边形相交。根据数据集的大小,可选择提供最佳性能的方法。

建议

细节

仅当使用STV_Intersect执行空间连接时,才创建空间索引

空间索引只能与STV_Intersect一起使用。创建空间索引,然后使用ST_Intersects执行空间连接不会提高性能

当用户将一组点与一组多边形相交时,请使用STV_Intersect函数

确定在中型到大型数据集中一组点是否与一组多边形相交。首先,使用STV_Create_Index创建空间索引。然后,使用STV_Intersect函数之一返回相交的线对集合。

空间索引为访问大量多边形提供了最佳性能

使用STV_Intersect转换函数时,请对数据使用OVER(PARTITION BEST)子句进行分区

该STV_Intersect转换功能对分区数据不作处理。但是,用户可以通过对数据进行分区并使用OVER(PARTITION BEST)子句来提高性能

 

4.2.3  空间索引

STV_Create_Index函数会消耗大量的处理时间和内存。首次索引新数据时,请监视内存使用情况,以确保其处于安全范围内。内存使用情况取决于:

·     多边形数

·     顶点数

·     多边形之间的重叠量

建议

细节

当表包含大量多边形时,对多边形数据进行分段

对数据进行分段(segment)可以使索引创建过程并行运行。这是有优势的,因为有时在创建索引之前未对大型表进行分段时,STV_Create_Index任务有时无法完成

根据分配内存和使用CPU调整STV_Create_Index参数

max_mem_mb参数会影响STV_Create_Index的资源使用情况。max_mem_mb为STV_Create_Index可以分配的内存量分配一个限制。

·     默认值:256

·     有效值:小于或等于GENERAL资源池中的内存值。分配较更改的值会导致错误

如果STV_Create_Index无法分配300 MB内存,请进行更改

在STV_Create_Index开始创建索引之前,它会尝试分配大约300 MB的内存。如果没有足够的内存,该功能将失败。如果收到失败消息,请尝试以下解决方案:

·     在较少系统负载时创建索引

·     避免并发索引创建

·     向系统添加更多内存

如果需要,再次创建索引

备份SeaSQL EDW数据库时,不包括空间索引文件。如果发现没有了索引,请使用STV_Create_Index重新创建它

使用STV_Refresh_Index将新的或更新的多边形添加到现有索引

不必每次将新的或更新的多边形添加到表中时都重新构建空间索引,而是可以使用STV_Refresh_Index将多边形附加到现有空间索引中

 

4.2.4  检查多边形有效性

建议

细节

运行ST_IsValid以检查多边形是否有效

许多空间函数无法检查多边形的有效性。

·     在所有多边形上运行ST_IsValid,以确定它们是否有效。

·     如果用户的对象无效,请运行STV_IsValidReason以获取有关无效多边形位置的信息。

 

4.3  空间对象

SeaSQL EDW实施了多种新数据类型,用于存储空间对象、熟知文本 (WKT)字符串和熟知二进制(WKB)表示。这些数据类型包括:

·     支持的空间对象

·     空间引用标识符(SRID)

4.3.1  支持的空间对象

SeaSQL EDW支持两种空间数据类型。这些数据类型在表列中存储二维和三维空间对象:

·     GEOMETRY:在笛卡尔平面中定义的坐标为(x,y)对的空间对象。所有计算均使用笛卡尔坐标。

·     GEOGRAPHY:定义为完美球体表面上的空间对象,或WGS84坐标系中的空间对象。坐标以经度/纬度角值表示,以度为单位。所有计算均以米为单位。对于完美的球体计算,该球体的半径为6371公里,它近似于地球的形状。

说明

某些空间程序使用椭圆体对地球建模,从而导致数据略有不同。

 

GEOMETRY或GEOGRAPHY数据类型的最大大小为10,000,000字节(10 MB)。用户不能将任何一种数据类型用作表的主键。

4.3.2  空间参考标识符(SRID

SRID是表示在平面上投射坐标的方法的整数值。SRID是定义空间对象坐标系的元数据。

使用Geometry参数的地理空间函数必须包含相同的SRID。如果函数不包含相同的SRID,则查询将返回错误。

例如,在下面的查询中,两点具有不同的SRID。结果,查询返回错误:

SELECT ST_Distance(ST_GeomFromText('POINT(34 9)',2749), ST_GeomFromText('POINT(70 12)', 3359));

ERROR 5861:  Error calling processBlock() in User Function ST_Distance at [/data/jenkins/workspace/RE-ReleaseBuilds/RE-Jackhammer/server/udx/supported/place/PlaceFactory.h:115], error code: 0, message: Geometries with different SRIDs found: 2749, 3359

1. 支持的SRID

SeaSQL EDW支持源自EPSG标准的SRID。使用Geometry参数的地理空间函数在执行计算时必须使用受支持的SRID。SRID值0到2 32-1有效。SRID值超出此范围的查询将返回错误。

4.4  地理空间函数概述

4.4.1  命令约定

地理空间函数使用以下命名约定:

·     所述ST_<FUNCTION_NAME >函数是符合最新的开放地理空间联盟标准OGC SFA-SQL版本1.2.1(参考号是OGC 06-104r4,日期:2010-08-04)。当前,某些ST_<function_name>函数可能不支持所有数据类型。每个函数功能页面均包含有关支持的数据类型的详细信息。

说明

某些功能(例如)ST_GeomFromText基于标准的早期版本。

 

·     STV_<FUNCTION_NAME>类型的函数是SeaSQL EDW独有的,而不是与OGC标准相符合的。每个函数功能页面均详细说明其功能。

4.4.2  验证空间对象的有效性

注意

如果将有效的多边形传递给STV_IsValidReason,则它将返回NULL。

 

许多空间功能无法验证参数的有效性。如果将无效的空间对象传递给ST_或STV_函数,则该函数可能会返回错误或产生不正确的结果。

为避免此问题,建议用户首先在所有空间对象上运行ST_IsValid以验证其有效性。如果用户的对象无效,请运行STV_IsValidReason以获取有关无效位置的信息。

4.5  属性函数

计算并返回有关空间参数的信息。

4.5.1  ST_GeometryN

返回几何图形对象内的第 n 个几何图形。如果 n 超出索引范围, 则返回 NULL。

1. 行为类型

不可变

2. 语法

ST_GeometryN( g , n )

3. 参数

参数

说明

g

GEOMETRY 类型的空间对象

n

几何图形的索引号,从 1 开始

 

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

示例

以下示例显示了 ST_GeometryN 的用法。返回多边形集合中的第二个几何图形:

=> 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(ST_GeometryN(geom, 2)) FROM multipolygon_geom;

gid |    ST_AsText

-----+--------------------------------

9 | POLYGON ((0 0, 0 5, 1 0, 0 0))

(1 row)

返回多边形集合内的所有几何图形:

=> 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)))

>>\.

=> CREATE TABLE series_numbers (numbs int);

CREATE TABLE

=> COPY series_numbers FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 1

>> 2

>> 3

>> 4

>> 5

>> \.

=> SELECT numbs, ST_AsText(ST_GeometryN(geom, numbs)) FROM multipolygon_geom, series_numbers

WHERE ST_AsText(ST_GeometryN(geom, numbs)) IS NOT NULL ORDER BY numbs ASC;

numbs |     ST_AsText

-------+------------------------------------------

1 | POLYGON ((2 6, 2 9, 6 9, 7 7, 4 6, 2 6))

2 | POLYGON ((0 0, 0 5, 1 0, 0 0))

3 | POLYGON ((0 2, 2 5, 4 5, 0 2))

(3 rows)

4.5.2  ST_GeometryType

确定空间对象的类。

1. 行为类型

不可变

2. 语法

ST_GeometryType( g )

3. 参数

g:需要确定类的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

VARCHAR

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_GeometryType 的用法。

返回空间类:

=> SELECT ST_GeometryType(ST_GeomFromText('GEOMETRYCOLLECTION(LINESTRING(1 1, 2 2), POLYGON((1 3,4 5,2 2,1 3)))'));

ST_GeometryType

-----------------------

ST_GeometryCollection (1 row)

4.5.3  ST_NumGeometries

返回空间对象内包含的几何图形数量。单个 GEOMETRY 或 GEOGRAPHY 对象将返回 1, 空对象将返回 NULL。

1. 行为类型

不可变

2. 语法

ST_NumGeometries( g )

3. 参数

g:GEOMETRY 或 GEOGRAPHY 类型的空间对象。

4. 返回

INTEGER

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_NumGeometries 的用法。返回几何图形的数量:

=> SELECT ST_NumGeometries(ST_GeomFromText('MULTILINESTRING ((1 5, 2 4, 5 3, 6 6), (3 5, 3 7))'));

ST_NumGeometries

------------------

2

(1 row)

4.5.4  ST_NumPoints

计算空间对象的顶点数, 空对象则返回 NULL。

多边形和多边形集合的第一个顶点和最后一个顶点单独计数。

1. 行为类型

不可变

2. 语法

ST_NumPoints( g )

3. 参数

g:需要计数顶点的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

INTEGER

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_NumPoints 的用法。返回线串中的顶点数:

=> SELECT ST_NumPoints(ST_GeomFromText('LINESTRING(1.33 1.56,2.31 3.4,2.78 5.82,

3.76 3.9,4.11 3.27,5.85 4.34,6.9 4.231,7.61 5.77)'));

ST_NumPoints

--------------

8

(1 row)

使用 ST_Boundary 和 ST_NumPoints 返回多边形的顶点数:

=> SELECT ST_NumPoints(ST_Boundary(ST_GeomFromText('POLYGON((1 2,1 4,

2 5,3 6,4 6,5 5,4 4,3 3,1 2))')));

ST_NumPoints

--------------

9

(1 row)

4.5.5  ST_PointN

查找空间对象的第 n 个点。如果传递负数、零或大于线串上的总点数的数字,

ST_PointN 将返回 NULL。

顶点顺序基于空间对象的熟知文本 (WKT) 表示。

1. 行为类型

不可变

2. 语法

ST_PointN( g, n )

3. 参数

·     g:要搜索的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

·     n:将要返回的空间对象中的点。索引从一开始, 类型为 INTEGER。

4. 返回

GEOMETRY 或 GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_PointN 的用法。返回第 5 个点:

=> SELECT ST_AsText(ST_PointN(ST_GeomFromText('

POLYGON(( 2 6, 2 9, 6 9, 7 7, 4 6, 2 6))'), 5));

ST_AsText

-------------

POINT (4 6)

(1 row)

返回第 2 个点:

=> SELECT ST_AsText(ST_PointN(ST_GeographyFromText(' LINESTRING(23.41 24.93,34.2 32.98,40.7 41.19)'), 2));

ST_AsText

--------------------

POINT (34.2 32.98)

(1 row)

4.5.6  ST_SRID

确定随空间对象存储的空间参照系标识符 (SRID)。

将SRID 传递给 ST_GeomFromText 或 ST_GeomFromWKB 后才能确定GEOMETRY 对象的 SRID。ST_SRID 将返回此存储值。SRID 值为 0 至 232-1 是有效的。

1. 行为类型

不可变

2. 语法

ST_SRID( g )

3. 参数

g:需要 SRID 的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

INTEGER

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_SRID 的用法。

GEOMETRY 对象的默认 SRID 为 0:

=> SELECT ST_SRID(ST_GeomFromText( 'POLYGON((-1 -1,2 2,0 1,-1 -1))'));

ST_SRID

---------

0

(1 row)

 

GEOGRAPHY 对象的默认 SRID 为 4326:

=> SELECT ST_SRID(ST_GeographyFromText( 'POLYGON((22 35,24 35,26 32,22 35))'));

ST_SRID

4326

(1 row)

4.5.7  ST_X

确定 GEOMETRY 点的 x 坐标或 GEOGRAPHY 点的经度值。

1. 行为类型

不可变

2. 语法

ST_X( g )

3. 参数

g:类型为 GEOMETRY 或 GEOGRAPHY 的点。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_X 的用法。返回 x 坐标:

=> SELECT ST_X(ST_GeomFromText('POINT(3.4 1.25)'));

ST_X

-----

3.4

(1 row)

返回经度值:

=> SELECT ST_X(ST_GeographyFromText('POINT(25.34 45.67)'));

ST_X

-------

25.34

(1 row)

4.5.8  ST_XMax

返回 GEOMETRY 或 GEOGRAPHY 对象的最小边界矩形的最大 x 坐标。

对于 GEOGRAPHY 类型, SeaSQL EDW将通过计算从 (MAX(longitude), ST_YMin

(GEOGRAPHY)) 到 (MAX(longitude), ST_YMax(GEOGRAPHY)) 的大圆弧的最大经度来计算最大坐标。这种情况下, MAX(longitude) 是地理对象的最大经度值。

如果纬度或经度超出范围, ST_XMax 将返回地理对象的最大普通值。

1. 行为类型

不可变

2. 语法

ST_XMax( g )

3. 参数

g:需要求取最大 x 坐标的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_XMax 的用法。

返回矩形范围内的最大 x 坐标:

=> SELECT ST_XMax(ST_GeomFromText('POLYGON((0 1,0 2,1 2,1 1,0 1))'));

ST_XMax

-----------

1

(1 row)

返回矩形范围内的最大经度值:

=> SELECT ST_XMax(ST_GeographyFromText(

'POLYGON((-71.50 42.35, -71.00 42.35, -71.00 42.38, -71.50 42.38, -71.50 42.35))'));

ST_XMax

---------

-71

(1 row)

4.5.9  ST_XMin

返回 GEOMETRY 或 GEOGRAPHY 对象的最小边界矩形的最小 x 坐标。

对于 GEOGRAPHY 类型, SeaSQL EDW将通过计算从 (MIN(longitude), ST_YMin

(GEOGRAPHY)) 到 (MIN(longitude), ST_YMax(GEOGRAPHY)) 的大圆弧的最小经度来计算最小坐标。这种情况下,MIN(longitude) 表示地理对象的最小经度值。

如果纬度或经度超出范围,ST_XMin 将返回地理对象的最小普通值。

1. 行为类型

不可变

2. 语法

ST_XMin( g )

3. 参数

g:需要求取最小 x 坐标的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_XMin 的用法。

返回矩形范围内的最小 x 坐标:

=> SELECT ST_XMin(ST_GeomFromText('POLYGON((0 1,0 2,1 2,1 1,0 1))'));

ST_XMin

----------

0

(1 row)

返回矩形范围内的最小经度值:

=> SELECT ST_XMin(ST_GeographyFromText(

'POLYGON((-71.50 42.35, -71.00 42.35, -71.00 42.38, -71.50 42.38, -71.50 42.35))'));

ST_XMin

----------

-71.5

(1 row)

4.5.10  ST_Y

确定 GEOMETRY 点的 y 坐标或 GEOGRAPHY 点的纬度值。

1. 行为类型

不可变

2. 语法

ST_Y( g )

3. 参数

g:类型为 GEOMETRY 或 GEOGRAPHY 的点。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY

(Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Y 的用法。

返回 y 坐标:

=> SELECT ST_Y(ST_GeomFromText('POINT(3 5.25)'));

ST_Y

------

5.25

(1 row)

返回纬度值:

=> SELECT ST_Y(ST_GeographyFromText('POINT(35.44 51.04)'));

ST_Y

-------

 51.04

(1 row)

4.5.11  ST_YMax

返回 GEOMETRY 或 GEOGRAPHY 对象的最小边界矩形的最大 y 坐标。

对于 GEOGRAPHY 类型,SeaSQL EDW将通过计算从 (ST_XMin(GEOGRAPHY),

MAX(latitude)) 到 (ST_XMax(GEOGRAPHY), MAX(latitude)) 的大圆弧的最大纬度来计算最大坐标。这种情况下, MAX(latitude) 是地理对象的最大纬度值。

如果纬度或经度超出范围,ST_YMax 将返回地理对象的最大普通值。

1. 行为类型

不可变

2. 语法

ST_YMax( g )

3. 参数

g:需要求取最大 y 坐标的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_YMax 的用法。

返回矩形范围内的最大 y 坐标:

=> SELECT ST_YMax(ST_GeomFromText('POLYGON((0 1,0 4,1 4,1 1,0 1))'));

ST_YMax

-----------

4

(1 row)

返回矩形范围内的最大纬度值:

=> SELECT ST_YMax(ST_GeographyFromText(

'POLYGON((-7

1.50 42.35, -71.00 42.35, -71.00 42.38, -71.50 42.38, -71.50 42.35))'));

ST_YMax

------------------

42.3802715689979

(1 row)

4.5.12  ST_YMin

返回 GEOMETRY 或 GEOGRAPHY 对象的最小边界矩形的最小 y 坐标。

对于 GEOGRAPHY 类型, SeaSQL EDW将通过计算从 (ST_XMin(GEOGRAPHY),

MIN(latitude)) 到 (ST_XMax(GEOGRAPHY), MIN(latitude)) 的大圆弧的最小纬度来计算最小坐标。这种情况下, MIN(latitude) 表示地理对象的最小纬度值。

如果纬度或经度超出范围, ST_YMin 将返回地理对象的最小普通值。

1. 行为类型

不可变

2. 语法

ST_YMin( g )

3. 参数

g:需要求取最小 y 坐标的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_YMin 的用法。

返回矩形范围内的最小 y 坐标:

=> SELECT ST_YMin(ST_GeomFromText('POLYGON((0 1,0 4,1 4,1 1,0 1))'));

ST_YMin

-----------

1

(1 row)

返回矩形范围内的最小纬度值:

=> SELECT ST_YMin(ST_GeographyFromText(

'POLYGON((-71.50 42.35, -71.00 42.35, -71.00 42.38, -71.50 42.38, -71.50 42.35))'));

ST_YMin

------------------

42.35

(1 row)

4.5.13  STV_IsValidReason

确定多边形或多边形集合的格式是否正确或其是否有效。如果对象无效, STV_IsValidReason 将返回说明无效性原因的字符串。

空间有效性仅适用于多边形和多边形集合。如果以下所有项均成立,则多边形或多边形集合是有效的:

·     多边形是封闭的;其起点与终点相同。

·     其边界是一组线串。

·     边界不触及或穿越本身。

·     与外部多边形边界的接触点不超过一个的任何内部多边形。

如果将无效的对象传递给地理空间函数, 函数将会失败或返回错误的结果。要确定多边形是否有效,请先运行 ST_IsValid。如果多边形有效,ST_IsValid 将返回 TRUE,否则将返回 FALSE。

说明

STV_IsValidReason 仅支持多边形和多边形集合 GEOMETRY 数据类型。

 

1. 行为类型

不可变

2. 语法

STV_IsValidReason( g )

3. 参数

g:需要测试有效性的多边形或多边形集合, GEOMETRY 类型的值。

4. 返回

LONG VARCHAR

5. 示例

以下示例显示了 STV_IsValidReason 的用法。

返回描述多边形无效位置的字符串:

=> SELECT STV_IsValidReason(ST_GeomFromText('POLYGON((1 3,3 2,1 1,

3 0,1 0,1 3))'));

STV_IsValidReason

-----------------------------------------------

Ring Self-intersection at or near POINT (1 1)

(1 row)

4.5.14  STV_LineStringPoint

检索线串或线串集合的顶点。根据输入对象的类型, 返回的值为 GEOMETRY或 GEOGRAPHY 类型的点。GEOMETRY 点将继承输入对象的 SRID。

1. 行为类型

不可变

2. 语法

STV_LineStringPoint( g ) OVER( [PARTITION NODES] ) AS

3. 参数

g:线串或线串集合, GEOMETRY 或 GEOGRAPHY 类型的值。

4. 返回

GEOMETRY 或 GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_LineStringPoint 的用法。

返回几何线串的顶点及其 SRID:

SELECT ST_AsText(Point), ST_SRID(Point)

FROM (SELECT STV_LineStringPoint( ST_GeomFromText('MULTILINESTRING((1 2, 2 3, 3 1, 4 2),

(10 20, 20 30, 30 10, 40 20))', 4269)) OVER () AS Point) AS foo;

ST_AsText | ST_SRID

POINT (1 2)     |      4269

POINT (2 3)     |      4269

POINT (3 1)     |      4269

POINT (4 2)     |      4269

POINT (10 20) |      4269

POINT (20 30) |      4269

POINT (30 10) |      4269

POINT (40 20) |      4269

4.5.15  STV_PolygonPoint

以个别点的方式检索多边形的顶点。根据输入对象的类型,返回的值为GEOMETRY 或 GEOGRAPHY 类型的点。GEOMETRY 点将继承输入对象的SRID。

1. 行为类型

不可变

2. 语法

STV_PolygonPoint( g ) OVER( [PARTITION NODES] ) AS

3. 参数

g:需要测试有效性的多边形或多边形集合, GEOMETRY 类型的值。

4. 返回

GEOMETRY 或 GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_PolygonPoint 的用法。

返回几何多边形的顶点:

=> SELECT ST_AsText(g) FROM (SELECT STV_PolygonPoint(ST_GeomFromText('POLYGON((1 2, 2 3, 3 1, 1 2)) '))

OVER (PARTITION NODES) AS g) AS poly_points;

 ST_AsText

-------------

POINT (1 2)

POINT (2 3)

POINT (3 1)

POINT (1 2)

(4 rows)

返回地理多边形的顶点:

=> SELECT ST_AsText(g) FROM (SELECT STV_PolygonPoint(ST_GeographyFromText(' POLYGON((25.5 28.76, 28.83 29.13, 27.2 30.99, 25.5 28.76))'))

OVER (PARTITION NODES) AS g) AS poly_points; ST_AsText

--------------------- POINT (25.5 28.76)

POINT (28.83 29.13)

POINT (27.2 30.99)

POINT (25.5 28.76)

(4 rows)

4.6  I/O函数

操作 GEOMETRY 或 GEOGRAPHY 数据类型或者 WKT 或 WKB 数据。将空间对象从一种格式转换为另一种格式。

4.6.1  ST_AsBinary

创建空间对象的熟知二进制 (WKB) 表示。当需要将对象转换为二进制格式以便与其他应用程序移植空间数据时,可使用此函数。

1. 行为类型

不可变

2. 语法

ST_AsBinary( g )

3. 参数

g:需要获取 WKB 的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY.

4. 返回

LONG VARBINARY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_AsBinary 的用法。

检索 WKB 和 WKT 表示:

=> CREATE TABLE locations (id INTEGER, name VARCHAR(100), geom1 GEOMETRY(800), geom2 GEOGRAPHY);

CREATE TABLE

=> COPY locations

(id, geom1x FILLER LONG VARCHAR(800), geom1 AS ST_GeomFromText(geom1x), geom2x FILLER LONG VARCHAR (800),geom2 AS ST_GeographyFromText(geom2x)) FROM stdin;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 1|POINT(2 3)|

>> 2|LINESTRING(2 4,1 5)|

>> 3||POLYGON((-70.96 43.27,-70.67 42.95,-66.90 44.74,-67.81 46.08,-67.81 47.20,-69.22 47.43,-71.09 45.25,-70.96 43.27))

>> \.

=> SELECT id, ST_AsText(geom1),ST_AsText(geom2) FROM locations ORDER BY id ASC;

 id |     ST_AsText    |      ST_AsText

----+-----------------------+---------------------------------------------

1 | POINT (2 3)       |

2 | LINESTRING (2 4, 1 5) |

3 |       | POLYGON ((-70.96 43.27, -70.67 42.95, -66.9 44.74, -67.81 46.08, -67.81 47.2, -69.22 47.43, -71.09 45.25, -70.96 43.27))

使用函数 LENGTH 计算 WKB 的长度:

=> SELECT LENGTH(ST_AsBinary(St_GeomFromText('POLYGON ((-1 2, 0 3, 1 2,0 1, -1 2))')));

LENGTH

--------

93

(1 row)

4.6.2  ST_AsText

空间对象的熟知文本 (WKT) 表示。当需要指定 ASCII 形式的空间对象时可使用此函数。

开放地理空间联盟 (OGC) 在 OGC 简易功能访问第 1 部分 - 通用架构规范定义了WKT 字符串的格式。

1. 行为类型

不可变

2. 语法

ST_AsText( g )

3. 参数

g:需要获取 WKT 字符串的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

LONG VARCHAR

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_AsText 的用法。

检索 WKB 和 WKT 表示:

=> CREATE TABLE locations (id INTEGER, name VARCHAR(100), geom1 GEOMETRY(800), geom2 GEOGRAPHY);

CREATE TABLE

=> COPY locations

(id, geom1x FILLER LONG VARCHAR(800), geom1 AS ST_GeomFromText(geom1x), geom2x FILLER LONG VARCHAR (800),

geom2 AS ST_GeographyFromText(geom2x)) FROM stdin;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 1|POINT(2 3)|

>> 2|LINESTRING(2 4,1 5)|

>> 3||POLYGON((-70.96 43.27,-70.67 42.95,-66.90 44.74,-67.81 46.08,-67.81 47.20,-69.22 47.43,-71.09 45.25,-70.96 43.27))

>> \.

=> SELECT id, ST_AsText(geom1),ST_AsText(geom2) FROM locations ORDER BY id ASC;

id |      ST_AsText    |      ST_AsText

----+-----------------------+---------------------------------------------

1 | POINT (2 3)       |

2 | LINESTRING (2 4, 1 5) |

3 |       | POLYGON ((-70.96 43.27, -70.67 42.95, -66.9 44.74, -67.81 46.08, -67.81 47.2, -69.22 47.43, -71.09 45.25, -70.96 43.27))

(3 rows)

使用函数 LENGTH 计算 WKT 的长度:

=> SELECT LENGTH(ST_AsText(St_GeomFromText('POLYGON ((-1 2, 0 3, 1 2,0 1, -1 2))')));

LENGTH

--------

37

(1 row)

4.6.3  ST_GeographyFromText

将已知文本 (WKT) 字符串转换为其对应的 GEOGRAPHY 对象。使用此函数可将WKT 字符串转换为 SeaSQL EDW 地理空间函数所需的格式。

GEOGRAPHY 对象是在地球表面使用坐标 (longitude, latitude) 定义的空间对象。坐标使用划分地球的参考平面的度数(经度、纬度)表示。

GEOGRAPHY 对象的最大大小为 10 MB。如果将 WKT 传递给 ST_GeographyFromText 并且生成大小超过 10 MB 的空间对象, ST_GeographyFromText 将会返回错误。

开放地理空间联盟 (OGC) 在 OGC 简易功能访问第 1 部分 - 通用架构规范的第 7节定义了 WKT 字符串的格式。

1. 行为类型

不可变

2. 语法

ST_GeographyFromText( wkt [ USING PARAMETERS ignore_errors={'y'|'n'} ] )

3. 参数

参数

说明

wkt

GEOGRAPHY 对象的熟知文本 (WKT) 字符串, 类型为 LONG VARCHAR

ignore_errors

(可选)ST_GeographyFromText 将基于提供的参数返回以下结果:

·     NULL—如果 wkt 无效并且 ignore_errors='y'。

·     Error—如果 wkt 无效并且 ignore_errors='n' 或未指定。

 

4. 返回

GEOGRAPHY

5. 支持的数据类型

数据类型

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_GeographyFromText 的用法。

将 WKT 转换为 GEOGRAPHY 对象:

=> CREATE TABLE wkt_ex (g GEOGRAPHY);

 CREATE TABLE

=> INSERT INTO wkt_ex VALUES(ST_GeographyFromText('POLYGON((1 2,3 4,2 3,1 2))')); OUTPUT

--------

1

(1 row)

4.6.4  ST_GeographyFromWKB

将熟知二进制 (WKB) 值转换为其对应的 GEOGRAPHY 对象。使用此函数可将WKB 转换为 SeaSQL EDW 地理空间函数所需的格式。

GEOGRAPHY 对象是在地球表面定义的空间对象。坐标使用划分地球的参考平面的度数(经度、纬度)表示。所有的计算都以米为单位。

GEOGRAPHY 对象的最大为 10 MB。如果将 WKB 传递给 ST_GeographyFromWKB 并且生成超过 10 MB 的空间对象, ST_GeographyFromWKB 将会返回错误。

1. 行为类型

不可变

2. 语法

ST_GeographyFromWKB( wkb [ USING PARAMETERS ignore_errors={'y'|'n'} ] )

3. 参数

参数

说明

wkb

GEOGRAPHY 对象的已知二进制 (WKB) 值, 类型为 LONG VARBINARY

ignore_errors

(可选)ST_GeographyFromWKB 基于提供的参数返回以下结果:

·     NULL—如果 wkb 无效并且 ignore_errors='y'。

·     Error—如果 wkb 无效并且 ignore_errors='n' 或未指定。

 

4. 返回

GEOGRAPHY

5. 支持的数据类型

数据类型

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_GeographyFromWKB 的用法。

将 WKB 转换为 GEOGRAPHY 对象:

=> CREATE TABLE wkb_ex (g GEOGRAPHY);

CREATE TABLE

=> INSERT INTO wkb_ex VALUES(ST_GeographyFromWKB(X'0103000000010000000 ... ); OUTPUT

--------

1

(1 row)

4.6.5  ST_GeomFromGeoJSON

将标准格式的GeoJson记录的几何部分转换为GEOMETRY对象。当用户提供GeoJSON Feture或FeatureCollection对象时,此函数将会返回错误。

1. 行为类型

不可变

2. 语法

ST_GeomFromGeoJSON( geojson [, srid] [USING PARAMETERS ignore_3d={ true | false }] );

3. 参数

参数

说明

geojson

包含GeoJSON GEOMETRY 对象的字符串, 类型为 LONG VARCHAR。

接受以下GeoJSON键值:

·     type

·     coordinates

·     geometries

其他键值被忽略。

srid

(未执行操作时为可选参数)

GEOMETRY 对象的空间参照系标识符(SRID),类型为 INTEGER。

SRID 将存储在 GEOMETRY 对象中, 但不影响空间计算的结果

ignore_3d

(可选) ST_GeomFromGeoJSON是从返回的GEOMETRY对象中删除3D和更高维数据还是返回错误:

·     true—从返回的GEOMETRY对象中删除3D和更高维数据

·     false(默认):当GeoJson中包含3D和更高维数据时返回错误

 

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

下示例显示了 ST_GeomFromGeoJSON的用法。用ST_IsValid 验证ST_GeomFromGeoJSON语句:

=> SELECT ST_IsValid(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[35.3606, 138.7274, 29032]}', 4326 USING PARAMETERS ignore_3d=true));

 ST_IsValid

------------

 t

(1 row)

4.6.6   ST_GeomFromText

将熟知文本 (WKT) 字符串转换为其对应的 GEOMETRY 对象。使用此函数可将WKT 字符串转换为 SeaSQL EDW 地理空间函数所需的格式。

GEOMETRY 对象是按平面坐标定义的空间对象。坐标表示为笛卡尔平面上的点(x,y)。SRID 值为 0 至 2^32-1 是有效的。超出此范围的 SRID 值将会生成错误。

GEOMETRY 对象的最大为 10 MB。如果将 WKT 传递给 ST_GeomFromText,并且生成超过 10 MB 的空间对象,ST_GeomFromText 将会返回错误。

1. 行为类型

不可变

2. 语法

ST_GeomFromText( wkt [, srid] [ USING PARAMETERS ignore_errors={'y'|'n'} ])

3. 参数

参数

说明

wkt

GEOMETRY 对象的熟知文本 (WKT) 字符串, 类型为 LONG VARCHAR

srid

(未执行操作时为可选参数)

GEOMETRY 对象的空间参照系标识符(SRID), 类型为 INTEGER。

SRID 将存储在 GEOMETRY 对象中, 但不影响空间计算的结果。

ignore_errors

(可选)ST_GeomFromText 将基于提供的参数返回以下结果:

·     NULL—如果 wkt 无效并且 ignore_errors='y'。

·     Error—如果 wkt 无效并且 ignore_errors='n' 或未指定。

 

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

下示例显示了 ST_GeomFromText 的用法。将 WKT 转换为 GEOMETRY 对象:

=> SELECT ST_Area(ST_GeomFromText('POLYGON((1 1,2 3,3 5,0 5,1 -2,0 0,1 1))'));

ST_Area

---------

6

(1 row)

4.6.7  ST_GeomFromWKB

将熟知二进制 (WKB) 值转换为其对应的 GEOMETRY 对象。使用此函数可将WKB 转换为许多 SeaSQL EDW 地理空间函数所需的格式。

GEOMETRY 对象是在笛卡尔平面中定义的使用 (x,y) 坐标的空间对象。

GEOMETRY 对象的最大为 10 MB。如果将 WKB 传递给 ST_GeomFromWKB 并且生成超过 10 MB 的空间对象,ST_GeomFromWKB 将会返回错误。

1. 行为类型

不可变

2. 语法

ST_GeomFromWKB( wkb[, srid]

[ USING PARAMETERS ignore_errors={'y'|'n'} ])

3. 参数

参数

说明

wkb

GEOMETRY 对象的熟知二进制 (WKB) 值, 类型为 LONG VARBINARY

srid

(可选)GEOMETRY 对象的空间参照系标识符 (SRID), 类型为INTEGER。

SRID 将存储在 GEOMETRY 对象中,但不影响空间计算的结果。

ignore_errors

(可选)ST_GeomFromWKB 将基于提供的参数返回以下结果:

·     NULL—如果 wkb 无效并且 ignore_errors='y'。

·     Error—如果 wkb 无效并且 ignore_errors='n' 或未指定。

 

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_GeomFromWKB 的用法。

将 GEOMETRY 转换为 WKT:

=> CREATE TABLE t(g GEOMETRY);

CREATE TABLE

=> INSERT INTO t VALUES( ST_GeomFromWKB(X'0103000000010000000400000000000000000000000000000000000000000000000000f03f0000000000000000f64ae1c7022db544000000000000f03f00000000000000000000000000000000'));

 OUTPUT

--------

1

(1 row)

=> SELECT ST_AsText(g) from t;

ST_AsText

------------------------------------

POLYGON ((0 0, 1 0, 1e+23 1, 0 0))

(1 row)

4.6.8  STV_AsGeoJSON

返回 Javascript 几何对象表示法 (GeoJSON) 对象形式的几何或地理参数。

1. 行为类型

不可变

2. 语法

STV_AsGeoJSON( g, [USING PARAMETERS maxdecimals=[dec_value]])

3. 参数

参数

说明

g

GEOMETRY 或 GEOGRAPHY 类型的空间对象

maxdecimals

(可选)整型值。确定浮点坐标小数点后输出的最大位数

·     有效值: 介于 0 和 15 之间。

·     默认值: 6

 

4. 返回

LONG VARCHAR

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_AsGeoJSON 的用法。

将几何多边形转换为 GeoJSON:

=> SELECT STV_AsGeoJSON(ST_GeomFromText('POLYGON((3 2, 4 3, 5 1, 3 2), (3.5 2, 4 2.5, 4.5 1.5, 3.5 2))'));

STV_AsGeoJSON

--------------------------------------------------------------------------------------------------

{"type":"Polygon","coordinates":[[[3,2],[4,3],[5,1],[3,2]],[[3.5,2],[4,2.5],[4.5,1.5],[3.5,2]]]}

(1 row)

将地理点转换为 GeoJSON:

=> SELECT STV_AsGeoJSON(ST_GeographyFromText('POINT(42.36011 71.05899)') USING PARAMETERS maxdecimals=4);

STV_AsGeoJSON

-------------------------------------------------

{"type":"Point","coordinates":[42.3601,71.059]}

 (1 row)

4.6.9  STV_Geography

将 GEOMETRY 对象转换为 GEOGRAPHY 对象。SRID 值不影响 SeaSQL EDW 地理空间查询的结果。

STV_Geography 在将 GEOMETRY 对象转换为 GEOGRAPHY 对象时, 会将其SRID 设为 4326。

1. 行为类型

不可变

2. 语法

STV_Geography( geom )

3. 参数

g:要转换为 GEOGRAPHY 对象的空间对象, 类型为 GEOMETRY。

4. 返回

GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_Geography 的用法。

要计算 GEOGRAPHY 对象的质心,请将其转换为 GEOMETRY 对象,然后转换回 GEOGRAPHY 对象:

=> CREATE TABLE geogs(g GEOGRAPHY);

CREATE TABLE

=> COPY geogs(gx filler LONG VARCHAR, g 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.

>> MULTIPOINT(-108.619726 45.000284,-107.866813 45.00107,-106.363711 44.994223,-70.847746 41.205814)

>> \.

=> SELECT ST_AsText(STV_Geography(ST_Centroid(STV_Geometry(g)))) FROM geogs; ST_AsText

--------------------------------

POINT (-98.424499 44.05034775)

(1 row)

4.6.10  STV_Geometry

将 GEOGRAPHY 对象转换为 GEOMETRY 对象。

SRID 值不影响 SeaSQL EDW 地理空间查询的结果。

1. 行为类型

不可变

2. 语法

STV_Geometry( geog )

3. 参数

g:要转换为 GEOMETRY 对象的空间对象,类型为 GEOGRAPHY。

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_Geometry 的用法。

将 GEOGRAPHY 值转换为GEOMETRY值,然后将结果转换回GEOGRAPHY类型:

=> CREATE TABLE geogs(g GEOGRAPHY); CREATE TABLE

=> COPY geogs(gx filler LONG VARCHAR, g 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.

>> MULTIPOINT(-108.619726 45.000284,-107.866813 45.00107,-106.363711 44.994223,-70.847746 41.205814)

>> \.

=> SELECT ST_AsText(STV_Geography(ST_Centroid(STV_Geometry(g)))) FROM geogs; ST_AsText

--------------------------------

POINT (-98.424499 44.05034775)

4.6.11  STV_MemSize

返回 INTEGER 类型的空间对象长度(以字节为单位)。使用此函数确定空间数据的最优列宽。

1. 行为类型

不可变

2. 语法

STV_MemSize( g )

3. 参数

g:空间对象, 类型为 GEOMETRY 或 GEOGRAPHY 的值。

4. 返回

INTEGER

5. 示例

以下示例显示了如何通过将 GEOMETRY 或 GEOGRAPHY 列大小调整为 STV_MemSize 所返回的最大值来对表进行优化:

=> CREATE TABLE mem_size_table (id int, geom geometry(800));

CREATE TABLE

=> COPY mem_size_table (id, 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)

>>2|MULTILINESTRING((1 5, 2 4, 5 3, 6 6),(3 5, 3 7))

>>3|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 max(STV_MemSize(geom)) FROM mem_size_table;

max

-----

336

(1 row)

 

=> CREATE TABLE production_table(id int, geom geometry(336));

CREATE TABLE

=> INSERT INTO production_table SELECT * FROM mem_size_table;

OUTPUT

--------

3

(1 row)

=> DROP table mem_size_table;

DROP TABLE

4.7  测量函数

计算空间参数的测量值, 并返回一个 FLOAT 值。

4.7.1  ST_Area

计算空间对象的面积。单位为:

l GEOMETRY 对象:空间参照系标识符 (SRID) 单位

l GEOGRAPHY 对象:平方米

1. 行为类型

不可变

2. 语法

ST_Area( g )

3. 参数

g:需要计算面积的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Area 的用法。计算多边形的面积:

=> SELECT ST_Area(ST_GeomFromText('POLYGON((0 0,1 0,1 1,0 1,0 0))'));

ST_Area

---------

1

(1 row)

计算多边形集合的面积:

=> SELECT ST_Area(ST_GeomFromText('MultiPolygon(((0 0,1 0,1 1,0 1,0 0)),

((2 2,2 3,4 6,3 3,2 2)))'));

ST_Area

--------- 3

(1 row)

如下图所示, 假定多边形包含一个孔。

 

计算不包括孔面积在内的面积:

=> SELECT ST_Area(ST_GeomFromText('POLYGON((2 2,5 5,8 2,2 2),

(4 3,5 4,6 3,4 3))'));

ST_Area

---------

8

(1 row)

计算几何图形集合的面积:

=> SELECT ST_Area(ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((20.5  20.45, 20.51 20.52,20.69 20.32,20.5 20.45)),POLYGON((10 20,30 40,25 50,10 20)))'));

ST_Area

----------

150.0073

(1 row)

计算地理对象的面积:

=> SELECT ST_Area(ST_GeographyFromText('POLYGON((20.5 20.45,20.51 20.52,

20.69 20.32,20.5 20.45))'));

ST_Area

------------------

84627437.1305155

(1 row)

4.7.2  ST_Distance

计算两个空间对象之间的最短距离。对于 GEOMETRY 对象,距离使用笛卡尔坐标单位测量。对于 GEOGRAPHY 对象,距离以米为单位测量。

g1 和 g2 参数必须都是 GEOMETRY 对象或都是 GEOGRAPHY 对象。

1. 行为类型

不可变

2. 语法

ST_Distance( g1, g2[USING PARAMETERS spheroid={ true | false } ] )

3. 参数

参数

说明

g1

空间对象, 类型为 GEOMETRY 或 GEOGRAPHY

g2

空间对象, 类型为 GEOMETRY 或 GEOGRAPHY

spheroid

(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值: False

 

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 兼容的 GEOGRAPHY 对

数据类型

GEOGRAPHY(Perfect Sphere)

GEOGRAPHY (WGS84)

Point-Point

Linestring- Point

Polygon- Point

Multipolygon- Point

 

7. 建议

建议在使用 ST_Distance 之前裁剪无效的数据。无效的地理值可能返回无保证的结果。

8. 示例

以下示例显示了 ST_Distance 的用法。

两个多边形之间的距离:

=> SELECT ST_Distance(ST_GeomFromText('POLYGON((-1 -1,2 2,0 1,-1 -1))'),

ST_GeomFromText('POLYGON((5 2,7 4,5 5,5 2))'));

ST_Distance

-------------

3

(1 row)

点和线串之间的距离(以米为单位):

=> SELECT ST_Distance(ST_GeographyFromText('POINT(31.75 31.25)'), ST_GeographyFromText('LINESTRING(32 32,32 35,40.5 35,32 35,32 32)'));

ST_Distance

------------------

86690.3950562969

(1 row)

4.7.3  ST_Length

注意

ST_Length 不计算 WKT 或 WKB 的长度。要计算这些对象的长度, 请将 SeaSQL EDW LENGTH SQL 函数与 ST_AsBinary 或 ST_AsText 配合使用。

 

计算空间对象的长度。对于GEOMETRY对象,长度使用笛卡尔坐标单位测量。对于GEOGRAPHY对象,长度以米为单位测量。

按以下方法计算长度:

·     点或点集合对象的长度为0。

·     线串的长度是每个线段的长度之和;而线段的长度是起点到终点的距离。

·     多边形的长度是外部边界和任何内部边界的长度之和。

·     线串集合、多边形集合或geometrycollection 的长度是它所包含的所有对象的长度之和。

1. 行为类型

不可变

2. 语法

ST_Length( g )

3. 参数

g:需要计算长度的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY。

4. 返回

FLOAT

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Length 的用法。

返回以笛卡尔坐标单位为单位的长度:

=> SELECT ST_Length(ST_GeomFromText('LINESTRING(-1 -1,2 2,4 5,6 7)'));

ST_Length

------------------

10.6766190873295

(1 row)

返回以米为单位的长度:

=> SELECT ST_Length(ST_GeographyFromText('LINESTRING(-56.12 38.26,-57.51 39.78,

-56.37 45.24)'));

ST_Length

------------------

821580.025733461

(1 row)

4.8  运算符函数

根据参数计算空间关系。返回以下二者之一:

·     空间对象

·     包含空间对象的表中的行

4.8.1  ST_Boundary

计算指定GEOMETRY对象的边界。对象边界是指定义对象限制的点集。

对于线串,边界是起点和终点。对于多边形,边界是在同一点开始和结束的线串。

1. 行为类型

不可变

2. 语法

ST_Boundary(g)

3. 参数

g:需要计算边界的空间对象,类型为 GEOMETRY。

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Boundary 的用法。

返回表示边界的线串:

=> SELECT ST_AsText(ST_Boundary(ST_GeomFromText('POLYGON((-1 -1,2 2,

0 1,-1 -1))')));

ST_AsText

--------------

LINESTRING(-1 -1, 2 2, 0 1, -1 -1)

(1 row)

返回包含两个多边形边界的线串集合:

=> SELECT ST_AsText(ST_Boundary(ST_GeomFromText('POLYGON((2 2,5 5,8 2,2 2),

(4 3,5 4,6 3,4 3))')));

ST_AsText

------------------------------------------------------------------

MULTILINESTRING ((2 2, 5 5, 8 2, 2 2), (4 3, 5 4, 6 3, 4 3))

(1 row)

线串的边界是其起点和终点:

=> SELECT ST_AsText(ST_Boundary(ST_GeomFromText( 'LINESTRING(1 1,2 2,3 3,4 4)')));

ST_AsText

-----------------------

MULTIPOINT (1 1, 4 4)

(1 row)

 

=> SELECT ST_AsText(ST_Boundary(ST_GeomFromText( 'LINESTRING(1 1,2 2,3 3,4 4,1 1)')));

ST_AsText

------------------

MULTIPOINT EMPTY

(1 row)

4.8.2  ST_Buffer

创建与某个空间对象边界的距离大于或等于指定距离的 GEOMETRY 对象。该距离使用笛卡尔坐标单位测量。ST_Buffer不接受大于 +1e15 或小于–1e15 的距离大小。

1. 行为类型

不可变

2. 语法

ST_Buffer( g, d )

3. 参数

·     g:需要计算缓冲区的空间对象, 类型为 GEOMETRY

·     d:以笛卡尔坐标单位与对象的距离, 类型为 FLOAT

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 使用提示

·     如果指定正距离,则ST_Buffer将返回表示对象外部距离小于或等于指定距离的点的多边形。

·     如果指定负距离,则 ST_Buffer 将返回表示对象内部距离小于或等于指定距离的点的多边形。

对于点、点集合、线串和线串集合,如果指定负距离,ST_Buffer将返回空多边形。ST_Buffer 将返回多边形形式的缓冲区,因此缓冲区对象在其顶点处包含拐角。它不包含圆角。

7. 示例

以下示例显示了 ST_Buffer 的用法。

返回 GEOMETRY 对象:

=> SELECT ST_AsText(ST_Buffer(ST_GeomFromText('POLYGON((0 1,1 4,4 3,0 1))'),1));

ST_AsText

------------------------------------------------------------------------------

POLYGON ((-0.188847498856 -0.159920845081, -1.12155598386 0.649012935089, 0.290814745534

4.76344136152,

0.814758063466 5.02541302048, 4.95372324225 3.68665254814, 5.04124517538 2.45512549204, -

0.188847498856 -0.159920845081))

(1 row)

4.8.3  ST_Centroid

计算空间对象的几何中心(即质心)。如果几何图形除多边形外还存在点、线串或同时存在此二者, 则质心计算仅考虑多边形。类似地,如果除线串外还存在点, 则质心计算不考虑点。

要计算 GEOGRAPHY 对象的质心,请参见STV_GeographySTV_Geometry的示例。

1. 行为类型

不可变

2. 语法

ST_Centroid( g )

3. 参数

g:需要计算质心的空间对象, 类型为 GEOMETRY。

4. 返回

GEOMETRY(仅 POINT)

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Centroid 的用法。计算多边形的质心:

=> SELECT ST_AsText(ST_Centroid(ST_GeomFromText('POLYGON((-1 -1,2 2,-1 2,

-1 -1))')));

ST_AsText

------------

POINT (-0 1)

(1 row)

计算多边形集合的质心:

=> SELECT ST_AsText(ST_Centroid(ST_GeomFromText('MULTIPOLYGON(((1 0,2 1,2 0,

1 0)),((-1 -1,2 2,-1 2,-1 -1)))')));

ST_AsText

--------------------------------------

POINT (0.166666666667 0.933333333333)

(1 row)

此图显示了多边形集合的质心。

 

4.8.4  ST_ConvexHull

计算包含 GEOMETRY 对象的最小凸 GEOMETRY 对象。

1. 行为类型

不可变

2. 语法

ST_ConvexHull( g )

3. 参数

g:需要求取凸包的空间对象, 类型为 GEOMETRY。

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_ConvexHull 的用法。

对于几何图形集合中的点对:

=>SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText('GEOMETRYCOLLECTION( POINT(1 1),POINT(0 0))')));

ST_AsText

-----------------------

LINESTRING (1 1, 0 0)

(1 row)

对于几何图形集合:

=>SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText('GEOMETRYCOLLECTION( LINESTRING(2.5 3,-2 1.5), POLYGON((0 1,1 3,1 -2,0 1)))')));

ST_AsText

---------------------------------------------

POLYGON ((1 -2, -2 1.5, 1 3, 2.5 3, 1 -2))

(1 row)

实线表示原始几何图形集合,虚线表示凸包。

 

4.8.5  ST_Difference

计算空间对象没有与另一个空间对象相交的部分。

1. 行为类型

不可变

2. 语法

ST_Difference( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Difference 的用法。

两个重叠的线串:

=> SELECT ST_AsText(ST_Difference(ST_GeomFromText('LINESTRING(0 0,0 2)'),

ST_GeomFromText('LINESTRING(0 1,0 2)')));

ST_AsText

-----------------------

LINESTRING (0 0, 0 1)

(1 row)

=> SELECT ST_AsText(ST_Difference(ST_GeomFromText('LINESTRING(0 0,0 3)'),

ST_GeomFromText('LINESTRING(0 1,0 2)')));

ST_AsText

------------------------------------------

MULTILINESTRING ((0 0, 0 1), (0 2, 0 3))

(1 row)

两个重叠的多边形:

 

=> SELECT ST_AsText(ST_Difference(ST_GeomFromText('POLYGON((0 1,0 3,2 3,2 1,0 1))'),

ST_GeomFromText('POLYGON((0 0,0 2,2 2,2 0,0 0))')));

ST_AsText

-------------------------------------

POLYGON ((0 2, 0 3, 2 3, 2 2, 0 2))

(1 row)

两个未相交的多边形:

=> SELECT ST_AsText(ST_Difference(ST_GeomFromText('POLYGON((1 1,1 3,3 3,3 1,

1 1))'),ST_GeomFromText('POLYGON((1 5,1 7,-1 7,-1 5,1 5))')));

ST_AsText

-------------------------------------

POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))

(1 row)

4.8.6  ST_Envelope

计算包含指定的 GEOMETRY 对象的最小边界矩形。

1. 行为类型

不可变

2. 语法

ST_Envelope( g )

3. 参数

g:需要求取最小边界矩形的空间对象,类型为 GEOMETRY。

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了ST_Envelope 的用法。返回最小边界矩形:

=> SELECT ST_AsText(ST_Envelope(ST_GeomFromText('POLYGON((0 0,1 1,1 2,2 2,

2 1,3 0,1.5 -1.5,0 0))')));

ST_AsText

-------------------------------------------

POLYGON ((0 -1.5, 3 -1.5, 3 2, 0 2, 0 -1.5))

(1 row)

 

4.8.7  ST_Intersection

计算两个 GEOMETRY 对象共有的点集。

1. 行为类型

不可变

2. 语法

ST_Intersection( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Intersection 的用法。两个多边形相交于一个点:

 

=> SELECT ST_AsText(ST_Intersection(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,

0 2))'),ST_GeomFromText('POLYGON((-1 2,0 0,-2 0,-1 2))')));

ST_AsText

-----------------

POINT(0 0)

(1 row)

两个多边形:

 

=> SELECT ST_AsText(ST_Intersection(ST_GeomFromText('POLYGON((1 2,1 5,4 5,

4 2,1 2))'), ST_GeomFromText('POLYGON((3 1,3 3,5 3,5 1,3 1))')));

ST_AsText

------------------

POLYGON ((4 3, 4 2, 3 2, 3 3, 4 3))

(1 row)

两个未相交的线串:

 

=> SELECT ST_AsText(ST_Intersection(ST_GeomFromText('LINESTRING(1 1,1 3,3 3)'),

ST_GeomFromText('LINESTRING(1 5,1 7,-1 7)')));

ST_AsText

--------------------------

GEOMETRYCOLLECTION EMPTY

(1 row)

4.8.8  ST_SymDifference

计算两个GEOMETRY 对象中除它们共有的点之外的其他所有点, 包括这两个对象的边界。

此结果被称为余对称差。以数学方式表示为:Closure (g1 – g2) È  Closure (g2 – g1)

1. 行为类型

不可变

2. 语法

ST_SymDifference( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_SymDifference 的用法。返回两个线串:

 

SELECT ST_AsText(ST_SymDifference(ST_GeomFromText('LINESTRING(30 40, 30 55)'),ST_GeomFromText('LINESTRING(30 32.5,30 47.5)')));

ST_AsText

-----------------

MULTILINESTRING ((30 47.5, 30 55),(30 32.5,30 40))

(1 row)

返回四个正方形:

 

=> SELECT ST_AsText(ST_SymDifference(ST_GeomFromText('POLYGON((2 1,2 4,3 4,

3 1,2 1))'),ST_GeomFromText('POLYGON((1 2,1 3,4 3,4 2,1 2))')));

ST_AsText

-------------------------------------------------------------------------

MULTIPOLYGON (((2 1, 2 2, 3 2, 3 1, 2 1)), ((1 2, 1 3, 2 3, 2 2, 1 2)),

((2 3, 2 4, 3 4, 3 3, 2 3)), ((3 2, 3 3, 4 3, 4 2, 3 2)))

(1 row)

4.8.9  ST_Transform

返回一个新的GEOMETRY,其坐标转换为该srid参数使用的空间参考系统标识符(SRID)。

此函数支持以下转换:

·     EPSG 4326(WGS84)至EPSG 3857(Web Mercator)

·     EPSG 3857(Web Mercator)至EPSG 4326(WGS84)

对于EPSG 4326(WGS84),除非坐标落在以下范围内,否则转换将导致失败:

·     经度限制:-572至+572

·     纬度限制:-89.9999999至+89.9999999

1. 行为类型

不变的

2. 语法

ST_Transform(g1,srid)

·     g1:类型为GEOMETRY的空间对象。

·     srid:用户要将空间对象转换为INTEGER类型的空间参考系统标识符(SRID)。

3. 返回值

GEOMETRY

4. 支持的数据类型

数据类型

几何

地理(完美球形)

地理(WGS84)

多点

线串

多线串

多边形

多多边形

几何集合

 

5. 示例

以下示例显示如何将数据从Web Mercator(3857)转换为WGS84(4326):

=> SELECT ST_AsText(ST_Transform(STV_GeometryPoint(7910240.56433, 5215074.23966, 3857), 4326));

        ST_AsText

-------------------------

 POINT (71.0589 42.3601)

(1 row)

 

以下示例显示如何将表格中的线串数据从WGS84(4326)转换为Web Mercator(3857):

=> CREATE TABLE transform_line_example (g GEOMETRY);

CREATE TABLE

=> COPY transform_line_example (gx FILLER LONG VARCHAR, g AS ST_GeomFromText(gx, 4326)) FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> LINESTRING(0 0, 1 1, 2 2, 3 4)

>> \.

=> SELECT ST_AsText(ST_Transform(g, 3857)) FROM transform_line_example;

                                                        ST_AsText

-------------------------------------------------------------------------------------------------------------------------

 LINESTRING (0 -7.08115455161e-10, 111319.490793 111325.142866, 222638.981587 222684.208506, 333958.47238 445640.109656)

(1 row)

 

以下示例显示如何将表中的点数据从WGS84(4326)转换为Web Mercator(3857):

=> CREATE TABLE transform_example (x FLOAT, y FLOAT, srid INT);

CREATE TABLE

=> COPY transform_example FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 42.3601|71.0589|4326

>> 122.4194|37.7749|4326

>> 94.5786|39.0997|4326

>> \.

=> SELECT ST_AsText(ST_Transform(STV_GeometryPoint(x, y, srid), 3857)) FROM transform_example;

              ST_AsText

-------------------------------------

 POINT (4715504.76195 11422441.5961)

 POINT (13627665.2712 4547675.35434)

 POINT (10528441.5919 4735962.8206)

(3 rows)

4.8.10  ST_Union

计算两个空间对象中所有点的并集。此结果以数学方式表示为: g1 È g2

1. 行为类型

不可变

2. 语法

ST_Union( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Union 的用法。

返回表示这两个多边形中包含的所有点的多边形:

 

=> SELECT ST_AsText(ST_Union(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,-1 1,0 2))'),

ST_GeomFromText('POLYGON((-1 2, 0 0, -2 0, -1 2))')));

ST_AsText

------------------------------------------------------------------------------

POLYGON ((0 2, 1 1, 0 -1, -0.5 0, -2 0, -1 2, -0.666666666667 1.33333333333, 0 2))

(1 row)

4.8.11  STV_ForceLHR

更改空间对象的顶点顺序, 使其遵循左手规则。

1. 行为类型

不可变

2. 语法

STV_ForceLHR( g, [USING PARAMETERS skip_nonreorientable_polygons={true | false} ])

3. 参数

参数

说明

g

空间对象, 类型为 GEOGRAPHY。

skip_nonreorientable_polygons = [ true | false ]

(可选)Boolean

·     当设为 False 时, 不可定向的多边形将会生成错误。例如, 如果将 STV_ ForceLHR 或 STV_Reverse 与设为False 的 skip_nonorientable_ polygons 配合使用, 则包含孔的地理多边形将会生成错误。

·     当设为 True时, 返回的结果将是传递给 API 的未经更改的多边形。

此参数可帮助从包含无法重新定向的多边形的表创建索引。

SeaSQL EDW 地理空间将以下多边形视为不可定向:

·     包含孔的多边形

·     多边形集合

·     包含孔的多边形集合默认值: False

 

4. 返回

GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY  (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_ForceLHR 的用法。将地理多边形的方向调整为左手方向:

=> SELECT ST_AsText(STV_ForceLHR(ST_GeographyFromText('Polygon((1 1, 3 1, 2 2, 1 1))'))); ST_AsText

--------------------------------

POLYGON ((1 1, 3 1, 2 2, 1 1))

(1 row)

通过强制执行左手方向来反转地理多边形的方向:

=> SELECT ST_AsText(STV_ForceLHR(ST_GeographyFromText('Polygon((1 1, 2 2, 3 1, 1 1))'))); ST_AsText

--------------------------------

POLYGON ((1 1, 3 1, 2 2, 1 1))

(1 row)

4.8.12  STV_GeographyPoint

基于输入值, 返回 GEOGRAPHY 点。

这是将原始坐标转换为 GEOGRAPHY 点的最佳方法。

1. 行为类型

不可变

2. 语法

STV_GeographyPoint( x, y )

3. 参数

·     x:x坐标或经度, FLOAT。

·     y:y 坐标或纬度, FLOAT。

4. 返回

GEOGRAPHY

5. 示例

以下示例显示了 STV_GeographyPoint 的用法。返回 GEOGRAPHY 点:

=> SELECT ST_AsText(STV_GeographyPoint(-114.101588, 47.909677));

ST_AsText

-------------------------------

POINT (-114.101588 47.909677)

(1 row)

使用两列返回 GEOGRAPHY 点:

=> CREATE TABLE geog_data (id IDENTITY, x FLOAT, y FLOAT);

CREATE TABLE

=> COPY geog_data FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> -114.101588|47.909677

>> -111.532377|46.430753

>> \.

=> SELECT id, ST_AsText(STV_GeographyPoint(x, y)) FROM geog_data;

 id |     ST_AsText

----+-------------------------------

1 | POINT (-114.101588 47.909677)

2 | POINT (-111.532377 46.430753)

(2 rows)

4.8.13  STV_GeometryPoint

基于输入值,返回 GEOMETRY 点。

这是将原始坐标转换为 GEOMETRY 点的最佳方法。

1. 行为类型

不可变

2. 语法

STV_GeometryPoint( x, y [, srid] )

3. 参数

·     x:x坐标或经度, FLOAT。

·     y:y 坐标或纬度, FLOAT。

·     srid:(可选)分配给点的空间参照标识符 (SRID), 类型为 INT。

4. 返回

GEOMETRY

5. 示例

以下示例显示了STV_GeometryPoint 的用法。返回包含 SRID 的 GEOMETRY 点:

=> SELECT ST_AsText(STV_GeometryPoint(71.148562, 42.989374, 4326));

ST_AsText

-----------------------------

POINT (71.148562 42.989374)

(1 row)

使用两列返回 GEOMETRY 点:

=> CREATE TABLE geom_data (id IDENTITY, x FLOAT, y FLOAT, SRID int);

 CREATE TABLE

=> COPY geom_data FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 42.36383053600048|-71.10165445099966|4326

>> 42.3670937980005|-71.10644448699964|4326

>> \.

=> SELECT id, ST_AsText(STV_GeometryPoint(x, y, SRID)) FROM geom_data;

id |      ST_AsText

----+------------------------------------

1 | POINT (-71.101654451 42.363830536)

2 | POINT (-71.106444487 42.367093798)

(2 rows)

4.8.14  STV_NN

计算空间对象与参考对象之间的距离,并按照与参考对象的距离, 以升序方式返回(对象,距离)对。

g1 和 g2 参数必须都是 GEOMETRY 对象或都是 GEOGRAPHY 对象。

1. 行为类型

不可变

2. 语法

STV_NN( g, ref_obj, k ) OVER()

3. 参数

·     g:空间对象,类型为 GEOMETRY 或 GEOGRAPHY 的值

·     ref_obj:参考对象,类型为 GEOMETRY 或 GEOGRAPHY

·     k:返回的行数,类型为 INTEGER

4. 返回

按距离以升序方式返回(对象,距离)对。如果某个参数为 EMPTY 或 NULL,则返回 0 行。

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_NN 的用法。创建表并插入 9 个 GEOGRAPHY 点:

=> CREATE TABLE points (g geography);

CREATE TABLE

=> COPY points (gx filler LONG VARCHAR, g 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.

>> POINT (21.5 18.4)

>> POINT (21.5 19.2)

>> POINT (21.5 20.7)

>> POINT (22.5 16.4)

>> POINT (22.5 17.15)

>> POINT (22.5 18.33)

>> POINT (23.5 13.68)

>> POINT (23.5 15.9)

>> POINT (23.5 18.4)

>> \.

计算表 points 中的对象与 GEOGRAPHY 点 (23.5, 20) 的距离(以米为单位)。返回与该点距离最近的 5 个对象:

=> SELECT ST_AsText(nn), dist FROM (SELECT STV_NN(g,

ST_GeographyFromText('POINT(23.5 20)'),5) OVER() AS (nn,dist) FROM points) AS example; ST_AsText     |    dist

--------------------+------------------

POINT (23.5 18.4) | 177912.12757541

POINT (22.5 18.33) | 213339.210738322

POINT (21.5 20.7)  |  222561.43679943

POINT (21.5 19.2)   | 227604.371833335

POINT (21.5 18.4)   | 275239.416790128

(5 rows)

4.8.15  STV_Reverse

反转空间对象顶点的顺序。

1. 行为类型

不可变

2. 语法

STV_Reverse( g, [USING PARAMETERS skip_nonreorientable_polygons={true | false} ])

3. 参数

参数

说明

g

空间对象, 类型为 GEOGRAPHY

skip_nonreorientable_polygons = [ true | false ]

(可选)Boolean

·     当设为 False 时, 不可定向的多边形将会生成错误。例如,如果将 STV_ForceLHR 或 STV_Reverse 与设为False 的 skip_nonorientable_polygons 配合使用, 则包含孔的地理多边形将会生成错误。

·     当设为 True 时, 返回的结果将是传递给 API 的未经更改的多边形。

此参数可帮助从包含无法重新定向的多边形的表创建索引。

SeaSQL EDW 地理空间将以下多边形视为不可定向:

·     包含孔的多边形

·     多边形集合

·     包含孔的多边形集合默认值:False

 

4. 返回

GEOGRAPHY

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 STV_Reverse 的用法。反转地理多边形的顶点:

=> SELECT ST_AsText(STV_Reverse(ST_GeographyFromText('Polygon((1 1, 3 1, 2 2, 1 1))'))); ST_AsText

--------------------------------

POLYGON ((1 1, 2 2, 3 1, 1 1))

(1 row)

强制多边形反转方向:

=> SELECT ST_AsText(STV_Reverse(ST_GeographyFromText('Polygon((1 1, 2 2, 3 1, 1 1))'))); ST_AsText

--------------------------------

POLYGON ((1 1, 3 1, 2 2, 1 1))

(1 row)

4.9  Geo hash函数

4.9.1  ST_GeoHash

返回指定几何形状的GeoHash。

1. 行为类型

不可变

2. 语法

ST_GeoHash( SpatialObject [ USING PARAMETERS numchars=n] )

3. 参数

参数

说明

空间物体

GEOMETRY或GEOGRAPHY空间对象。对于给定几何图形内的所有点,输入必须在极坐标中(-180 <= x <= 180和-90 <= y <= 90)

n

指定返回的GeoHash的长度(以字符为单位)

 

4. 返回

GEOHASH

5. 支持的数据类型

数据类型

几何

地理(完美球形)

地理(WGS84)

多点

线串

多线串

多边形

多多边形

几何集合

 

6. 示例

以下示例显示如何使用ST_PointFromGeoHash。

 

为指定的几何体生成全精度的GeoHash:

=> SELECT ST_GeoHash(ST_GeographyFromText('POINT(3.14 -1.34)'));

ST_GeoHash

----------------------

kpf0rkn3zmcswks75010

(1 row)

 

根据指定几何的前五个字符生成GeoHash:

=>  select ST_GeoHash(ST_GeographyFromText('POINT(3.14 -1.34)')USING PARAMETERS numchars=5);

ST_GeoHash

------------

kpf0r

(1 row)

4.9.2  ST_GeomFromGeoHash

返回指定GeoHash形状的多边形。

1. 行为类型

不变的

2. 语法

ST_GeomFromGeoHash(GeoHash)

3. 参数

GeoHash:有效的GeoHash字符串,任意长度。

4. 返回

GEOGRAPHY

5. 示例

以下示例显示如何使用ST_GeomFromGeoHash。

将GeoHash字符串转换为Geography对象,然后再转换回GeoHash。

=>  SELECT ST_GeoHash(ST_GeomFromGeoHash('vert1c9' ));

ST_GeoHash

--------------------

vert1c9

(1 row)

 

返回指定GeoHash 的多边形,并使用ST_AsText将多边形,矩形地图图块转换为熟知文本:

=>  SELECT ST_AsText(ST_GeomFromGeoHash('drt3jj9n4dpcbcdef'));

ST_AsText                                                                          

------------------------------------------------------------------------------------------------------------------------------------------------------------------

POLYGON ((-71.1459699298 42.3945346513, -71.1459699297 42.3945346513, -71.1459699297 42.3945346513, -71.1459699298 42.3945346513, -71.1459699298 42.3945346513))

(1 row)

 

返回指定的GeoHashes的多个多边形及其面积。高级别GeoHash(1234)的多边形的面积很大,而低级别GeoHash(1234567890bcdefhjkmn)的面积为零。

=>  SELECT ST_Area(short) short_area, ST_AsText(short) short_WKT, ST_Area(long) long_area, ST_AsText(long) long_WKT from (SELECT ST_GeomFromGeoHash('1234') short, ST_GeomFromGeoHash('1234567890bcdefhjkmn') long) as foo;

-[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------

short_area | 24609762.8991076

short_WKT  | POLYGON ((-122.34375 -88.2421875, -121.9921875 -88.2421875, -121.9921875 -88.06640625, -122.34375 -88.06640625, -122.34375 -88.2421875))

long_area  | 0

long_WKT   | POLYGON ((-122.196077187 -88.2297377551, -122.196077187 -88.2297377551, -122.196077187 -88.2297377551, -122.196077187 -88.2297377551, -122.196077187 -88.2297377551))

4.9.3  ST_PointFromGeoHash

返回指定GeoHash的中心点。

1. 行为类型

不变的

2. 语法

ST_PointFromGeoHash(GeoHash)

3. 参数

GeoHash:有效的GeoHash字符串,任意长度。

4. 返回

GEOGRAPHY POINT

5. 示例

以下示例显示如何使用ST_PointFromGeoHash。

返回高级GeoHash的地理点,并使用ST_AsText将该点转换为熟知文本:

=>  SELECT ST_AsText(ST_PointFromGeoHash('dr'));

ST_AsText

-------------------------

POINT (-73.125 42.1875)

(1 row)

 

返回详细的GeoHash的地理点,并使用ST_AsText将该点转换为熟知文本:

=>  SELECT ST_AsText(ST_PointFromGeoHash('1234567890bcdefhjkmn'));

ST_AsText

---------------------------------------

POINT (-122.196077187 -88.2297377551)

(1 row)

4.10  断言函数

测试空间参数,并返回一个 BOOLEAN 值。

4.10.1  ST_Contains

确定空间对象是否完全在另一个空间对象内部,并且不仅仅在其边界上存在。两个参数必须是相同的空间数据类型。要么指定两个 GEOMETRY 对象,要么指定两个 GEOGRAPHY 对象。

如果某个对象(例如点或线串)仅沿空间对象的边界存在,则 ST_Contains 将返回False。线串的内部是线串上除起点和终点以外的所有点。ST_Contains(g1, g2) 在功能上等同于 ST_Within(g2, g1)。

不支持顶点或边界位于国际日期变更线 (IDL) 或南、北极的 GEOGRAPHY 多边形。

1. 行为类型

不可变

2. 语法

ST_Contains( g1, g2 [USING PARAMETERS spheroid={true | false}] )

3. 参数

·     g1:空间对象,类型为 GEOMETRY 或 GEOGRAPHY

·     g2:空间对象,类型为 GEOMETRY 或 GEOGRAPHY

·     spheroid:(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值:False

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point-Point

Linestring-Point

Polygon-Point

Multipolygon-Point

 

6. 示例

以下示例显示了 ST_Contains 的用法。

第一个多边形未完全包含第二个多边形:

=> SELECT ST_Contains(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'),

ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));

ST_Contains

-------------

f

(1 row)

 

如果点在线串上,但不在终点上:

=> SELECT ST_Contains(ST_GeomFromText('LINESTRING(20 20,30 30)'),

ST_GeomFromText('POINT(25 25)'));

ST_Contains

--------------

t

(1 row)

 

如果点在多边形的边界上:

=> SELECT ST_Contains(ST_GeographyFromText('POLYGON((20 20,30 30,30 25,20 20))'),

ST_GeographyFromText('POINT(20 20)'));

ST_Contains

--------------

f

(1 row)

 

两个在空间上等效的多边形:

=> SELECT ST_Contains (ST_GeomFromText('POLYGON((-1 2, 0 3, 0 1, -1 2))'),

ST_GeomFromText('POLYGON((0 3, -1 2, 0 1, 0 3))'));

ST_Contains

--------------

t

(1 row)

 

4.10.2  ST_Crosses

确定一个 GEOMETRY 对象是否与另一个 GEOMETRY 对象在空间上相交。如果两个对象仅在边界上接触, 则 ST_Crosses 将返回 FALSE。

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

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

·     它们的相交结果的维数小于两个对象的最大维数。

1. 行为类型

不可变

2. 语法

ST_Crosses( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Crosses 的用法。

 

=> SELECT ST_Crosses(ST_GeomFromText('LINESTRING(-1 3,1 4)'),

ST_GeomFromText('LINESTRING(-1 4,1 3)'));

ST_Crosses

------------

t

(1 row)

 

=> SELECT ST_Crosses(ST_GeomFromText('LINESTRING(-1 1,1 2)'),

ST_GeomFromText('POLYGON((1 1,0 -1,3 -1,2 1,1 1))'));

ST_Crosses

------------

f

(1 row)

 

=> SELECT ST_Crosses(ST_GeomFromText('POINT(-1 4)'),

ST_GeomFromText('LINESTRING(-1 4,1 3)'));

ST_ Crosses

------------

f

(1 row)

4.10.3  ST_Disjoint

确定两个 GEOMETRY 对象是否未相交也未接触。

如果 ST_Disjoint 针对一对 GEOMETRY 对象返回 TRUE, 则 ST_Intersects 将针对这两个相同的对象返回 FALSE。

不支持顶点或边界位于国际日期变更线 (IDL) 或南、北极的 GEOGRAPHY 多边形。

1. 行为类型

不可变

2. 语法

ST_Disjoint( g1, g2 [USING PARAMETERS spheroid={true | false}] )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

·     spheroid:(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值: False

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (WGS84)

Point-Point

Linestring-Point

Polygon-Point

Multipolygon-Point

 

6. 示例

下示例显示了 ST_Disjoint 的用法。两个未相交或接触的多边形:

=> SELECT ST_Disjoint (ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((1 0, 1 1, 2 2, 1 0))'));

ST_Disjoint

-------------

t

(1 row)

两个相交的线串:

=> SELECT ST_Disjoint(ST_GeomFromText('LINESTRING(-1 2,0 3)'),

ST_GeomFromText('LINESTRING(0 2,-1 3)'));

ST_Disjoint

-------------

f

(1 row)

两个在一个点接触的多边形:

=> SELECT ST_Disjoint (ST_GeomFromText('POLYGON((-1 2, 0 3, 0 1, -1 2))'),

ST_GeomFromText('POLYGON((0 2, 1 1, 1 2, 0 2))'));

ST_Disjoint

--------------

f

(1 row)

7. ST_Equals

确定两个空间对象在空间上是否等效。ST_Equals 的两个对象的坐标及其WKT/WKB 表示必须完全匹配才能返回TRUE。在确定空间等价关系时点的顺序不重要:

·     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))。

坐标存储为 FLOAT 类型。因此,在导入熟知文本 (WKT) 值时, 由于浮点数表示的限制,预期会出现舍入误差。

g1 和 g2 必须都是 GEOMETRY 对象或都是 GEOGRAPHY 对象。此外, g1 和 g2不能都是 GeometryCollection 类型。

8. 行为类型

不可变

9. 语法

ST_Equals( g1, g2 )

10. 参数

·     g1:要与 g2 相比的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY

·     g2:要与 g1 相比的空间对象, 类型为 GEOMETRY 或 GEOGRAPHY

11. 返回

BOOLEAN

12. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

13. 示例

以下示例显示了 ST_Equals 的用法。两个线串:

=> SELECT ST_Equals (ST_GeomFromText('LINESTRING(-1 2, 0 3)'),

ST_GeomFromText('LINESTRING(0 3, -1 2)'));

ST_Equals

--------------

t

(1 row)

两个多边形:

=> SELECT ST_Equals (ST_GeographyFromText('POLYGON((43.22 42.21,40.3 39.88,

42.1 50.03,43.22 42.21))'),ST_GeographyFromText('POLYGON((43.22 42.21,

40.3 39.88,42.1 50.31,43.22 42.21))'));

ST_Equals

--------------

f

(1 row)

4.10.4  ST_Intersects

确定两个 GEOMETRY 或 GEOGRAPHY 对象是否在一个点相交或接触。对于相同的 GEOMETRY 或 GEOGRAPHY 对象,如果 ST_Disjoint 返回 TRUE, 则 ST_ Intersects 将返回 FALSE。

不支持顶点或边界位于国际日期变更线 (IDL) 或南、北极的 GEOGRAPHY 多边形。

1. 行为类型

不可变

2. 语法

ST_Intersects( g1, g2 [USING PARAMETERS bbox={true | false}, spheroid={true | false}])

3. 参数

·     g1:空间对象,类型为 GEOMETRY

·     g2:空间对象,类型为 GEOMETRY

·     bbox:Boolean。与 g1 和 g2 的边界框相交。默认值: False

·     spheroid:(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值: False

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (WGS84)

Point-Point

Linestring-Point

Polygon-Point

Multipolygon-Point

 

6. 示例

以下示例显示了 ST_Intersects 的用法。两个多边形未相交或接触:

 

=> SELECT ST_Intersects (ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((1 0,1 1,2 2,1 0))'));

ST_Intersects

--------------

f

(1 row)

两个多边形在一个点接触:

 

=> SELECT ST_Intersects (ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((1 0,1 1,0 1,1 0))'));

ST_Intersects

--------------

t

(1 row)

两个多边形相交:

 

=> SELECT ST_Intersects (ST_GeomFromText('POLYGON((-1 2, 0 3, 0 1, -1 2))'),

ST_GeomFromText('POLYGON((0 2, -1 3, -2 0, 0 2))'));

ST_Intersects

--------------

t

(1 row)

4.10.5  ST_IsEmpty

确定空间对象是否表示空集。空对象没有维度。

1. 行为类型

不可变

2. 语法

ST_IsEmpty( g )

3. 参数

g:空间对象,类型为 GEOMETRY 或 GEOGRAPHY

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_IsEmpty 的用法。空多边形:

=> SELECT ST_IsEmpty(ST_GeomFromText('GeometryCollection EMPTY'));

 ST_IsEmpty

------------

t

(1 row)

4.10.6  ST_IsSimple

确定空间对象是否未与自身相交,也未接触其自身边界上的任何点。

1. 行为类型

不可变

2. 语法

ST_IsSimple( g )

3. 参数

g:空间对象, 类型为 GEOMETRY 或 GEOGRAPHY

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_IsSimple 的用法。多边形未与自身相交:

 

=> SELECT ST_IsSimple(ST_GeomFromText('POLYGON((-1 2,0 3,1 2,1 -2,-1 2))'));

ST_IsSimple

--------------

t

(1 row)

线串与自身相交:

 

=> SELECT ST_IsSimple(ST_GeographyFromText('LINESTRING(10 10,25 25,26 34.5,

10 30,10 20,20 10)'));

St_IsSimple

-------------

f

(1 row)

线串在一个或多个位置接触其内部:

 

=> SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(0 0,0 1,1 0,2 1,2 0,0 0)'));

ST_IsSimple

-------------

f

(1 row)

4.10.7  ST_IsValid

确定空间对象的格式是否正确或其是否有效。如果对象有效,则 ST_IsValid 返回 TRUE; 否则它将返回 FALSE。使用 STV_IsValidReason 以确定无效性原因。

空间有效性仅适用于多边形和多边形集合。如果以下所有项均成立, 则多边形或多边形集合是有效的:

·     多边形是封闭的;其起点与终点相同。

·     其边界是一组线串。

·     边界不触及或穿越本身。

·     内部的任何多边形都未接触外部多边形边界除顶点以外的任何位置。

如果不确定多边形是否有效,请先运行 ST_IsValid。如果将无效的空间对象传递给地理空间函数,函数将会失败或返回错误的结果。

1. 行为类型

不可变

2. 语法

ST_IsValid( g )

3. 参数

g:需要测试有效性的多边形或多边形集合,GEOMETRY 类型的值。

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_IsValid 的用法。有效的多边形:

 

=> SELECT ST_IsValid(ST_GeomFromText('POLYGON((1 1,1 3,3 3,3 1,1 1))'));

ST_IsValid

------------

t

(1 row)

无效的多边形:

 

=> SELECT ST_IsValid(ST_GeomFromText('POLYGON((1 3,3 2,1 1,3 0,1 0,1 3))'));

ST_IsValid

------------

f

(1 row)

无效的多边形:

 

=> SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0,2 2,0 2,2 0,0 0))'));

ST_IsValid

------------

f

(1 row)

无效的多边形集合:

 

=> SELECT ST_IsValid(ST_GeomFromText('MULTIPOLYGON(((0 0, 0 1, 1 1, 0 0)),

((0.5 0.5, 0.7 0.5, 0.7 0.7, 0.5 0.7, 0.5 0.5)))'));

ST_IsValid

------------

f

(1 row)

 

 

=> SELECT ST_IsValid(ST_GeomFromText('POLYGON((1 1,3 3,6 -1,0.5 -1,1 1),

(1 1,3 1,2 0,1 1))'));

ST_IsValid

------------

t

(1 row)

包含孔的无效多边形:

 

=> SELECT ST_IsValid(ST_GeomFromText('POLYGON((1 1,3 3,6 -1,0.5 -1,1 1),

(1 1,4.5 1,2 0,1 1))'));

ST_IsValid

------------

f

(1 row)

4.10.8  ST_Overlaps

确定 GEOMETRY 对象是否与另一个 GEOMETRY 对象共享空间但未完全包含在该对象范围内。它们必须在其内部重叠。如果两个对象在单个点接触,或仅仅沿边界相交, 则二者没有重叠。两个参数必须具有相同的维度;否则 ST_ Overlaps 将返回 FALSE。

1. 行为类型

不可变

2. 语法

ST_Overlaps ( g1, g2 )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY

·     g2:空间对象, 类型为 GEOMETRY

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Overlaps 的用法。

Polygon_1 与 Polygon_2 重叠但未完全包含 Polygon_2:

 

=> SELECT ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 1, 1 1, 0 0))'),

ST_GeomFromText('POLYGON((0.5 0.5, 0.7 0.5, 0.7 0.7, 0.5 0.7, 0.5 0.5))'));

ST_Overlaps

-------------

t

(1 row)

具有不同维度的两个对象:

=> SELECT ST_Overlaps(ST_GeomFromText('LINESTRING(2 2,4 4)'),

ST_GeomFromText('POINT(3 3)'));

 ST_Overlaps

-------------

f

(1 row)

4.10.9  ST_Relate

基于指定的 DE-9IM 模式矩阵字符串, 确定给定的 GEOMETRY 对象是否与另一个 GEOMETRY 对象在空间上相关。

DE-9IM 标准确定了两个对象彼此在空间上的相关性。

1. 行为类型

不可变

2. 语法

ST_Relate( g1, g2, matrix )

3. 参数

参数

说明

g1

空间对象, 类型为 GEOMETRY

g2

空间对象, 类型为 GEOMETRY

matrix

DE-9IM 模式矩阵字符串,类型为 CHAR(9)。此字符串表示 3 x 3 限制矩阵, 对应两个几何图形各自的内部、边界和外部交集的维度限制。必须恰好包含 9 个以下字符:

·     T

·     F

·     0

·     1

·     2

·     *

 

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 示例

以下示例显示了 ST_Relate 的用法。

“等于”对应的 DE-9IM 模式为'T*F**FFF2':

=> SELECT ST_Relate(ST_GeomFromText('LINESTRING(0 1,2 2)'),

ST_GeomFromText('LINESTRING(2 2,0 1)'), 'T*F**FFF2');

ST_Relate

--------------

t

(1 row)

“重叠”对应的 DE-9IM 模式为'T*T***T**':

=> SELECT ST_Relate(ST_GeomFromText('POLYGON((-1 -1,0 1,2 2,-1 -1))'),

ST_GeomFromText('POLYGON((0 1,1 -1,1 1,0 1))'), 'T*T***T**');

ST_Relate

-----------

t

(1 row)

4.10.10  ST_Touches

确定两个 GEOMETRY 对象是否在一个点接触或沿边界接触,但没有内部相交。

不支持顶点或边界位于国际日期变更线 (IDL) 或南、北极的 GEOGRAPHY 多边形。

1. 行为类型

不可变

2. 语法

ST_Touches( g1, g2 [USING PARAMETERS spheroid={true | false}] )

3. 参数

·     g1:空间对象,类型为 GEOMETRY 的值

·     g2:空间对象,类型为 GEOMETRY 的值

·     spheroid:(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值:False

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (WGS84)

Point-Point

Linestring-Point

Polygon-Point

Multipolygon-Point

 

7. 示例

以下示例显示了 ST_Touches 的用法。两个多边形在一个点接触:

=> SELECT ST_Touches(ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((1 3,0 3,1 2,1 3))'));

ST_Touches

------------

t

(1 row)

两个多边形仅在沿部分边界接触:

=> SELECT ST_Touches(ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((1 2,0 3,0 1,1 2))'));

ST_Touches

------------

t

(1 row)

两个多边形未在任何点接触:

=> SELECT ST_Touches(ST_GeomFromText('POLYGON((-1 2,0 3,0 1,-1 2))'),

ST_GeomFromText('POLYGON((0 2,-1 3,-2 0,0 2))'));

ST_Touches

------------

f

(1 row)

4.10.11  STV_Extent

返回包含所有输入数据的边界框。

在嵌套查询中使用STV_Extent可获得最佳结果。OVER子句必须为空。

提示

当输入为单点时,STV_Extent不会返回有效的多边形。

 

1. 行为类型

不可变

2. 语法

STV_Extent(g)

3. 参数

g:空间对象,输入GEOMETRY。

4. 返回

GEOMETRY

5. 支持的数据类型

数据类型

几何

多点

线串

多线串

多边形

多多边形

几何集合

 

6. 示例

以下示例显示如何使用STV_Extent。

返回线串的边界框,并确认它是有效的多边形:

=> SELECT ST_AsText(geom) AS bounding_box, ST_IsValid(geom)

   FROM (SELECT STV_Extent(ST_GeomFromText('LineString(0 0, 1 1)')) OVER() AS geom) AS g;

            bounding_box             | ST_IsValid

-------------------------------------+------------

 POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) | t

(1 row)

 

返回表中空间对象的边界框:

=> CREATE TABLE misc_geo_shapes (id IDENTITY, geom GEOMETRY);

CREATE TABLE

=> COPY misc_geo_shapes (gx FILLER LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> POINT(-71.03 42.37)

>> LINESTRING(-71.058849 42.367501, -71.062240 42.371276, -71.067938 42.371246)

>>POLYGON((-71.066030 42.380617, -71.055827 42.376734, -71.060811 42.376011, -71.066030 42.380617))

>> \.

=> SELECT ST_AsText(geom_col) AS bounding_box

   FROM (SELECT STV_Extent(geom) OVER() AS geom_col FROM misc_geo_shapes) AS g;

                                                   bounding_box                                               

------------------------------------------------------------------------------------------------------------------

 POLYGON ((-71.067938 42.367501, -71.03 42.367501, -71.03 42.380617, -71.067938 42.380617, -71.067938 42.367501))

(1 row)

4.10.12  ST_Within

如果空间对象 g1 完全在空间对象 g2 内部,则 ST_Within 将返回 True。两个参数必须是相同的空间数据类型。要么指定两个 GEOMETRY 对象,要么指定两个 GEOGRAPHY 对象。

如果某个对象(例如点或线串)仅沿多边形边界存在,则 ST_Within 将返回False。线串的内部是线串上除起点和终点以外的所有点。ST_Within(g1,g2) 在功能上等同于 ST_Contains(g2,g1)。

不支持顶点或边界位于国际日期变更线 (IDL) 或南、北极的 GEOGRAPHY 多边形。

1. 行为类型

不可变

2. 语法

ST_Within( g1, g2 [USING PARAMETERS spheroid={true | false}] )

3. 参数

·     g1:空间对象, 类型为 GEOMETRY 的值

·     g2:空间对象, 类型为 GEOMETRY 的值

·     spheroid:(可选)用于指定是否使用理想球体或 WGS84 的 BOOLEAN 值。默认值: False

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (Perfect Sphere)

GEOGRAPHY (WGS84)

Point-Point

Point-Linestring

Point-Polygon

Point-Multipolygon

 

7. 示例

以下示例显示了 ST_Within 的用法。

第一个多边形完全包含在第二个多边形范围内:

=> SELECT ST_Within(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'),

ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));

ST_Within

-----------

t

(1 row)

点位于多边形顶点之上但不在其内部:

=>SELECT ST_Within (ST_GeographyFromText('POINT(30 25)'),

ST_GeographyFromText('POLYGON((25 25,25 35,32.2 35,30 25,25 25))'));

ST_Within

-----------

f

(1 row)

两个多边形在空间上等效:

=> SELECT ST_Within (ST_GeomFromText('POLYGON((-1 2, 0 3, 0 1, -1 2))'),

ST_GeomFromText('POLYGON((0 3, -1 2, 0 1, 0 3))'));

ST_Within

-----------

t

(1 row)

4.10.13  STV_DWithin

确定从一个空间对象的边界到另一个对象的边界的最短距离是否在指定的距离范围以内。

g1 和 g2 参数必须都是 GEOMETRY 对象或都是 GEOGRAPHY 对象。

1. 行为类型

不可变

2. 语法

STV_DWithin( g1, g2, d )

3. 参数

参数

说明

g1

GEOMETRY 或 GEOGRAPHY 类型的空间对象

g2

GEOMETRY 或 GEOGRAPHY 类型的空间对象

d

表示距离的 FLOAT 类型的值。对于 GEOMETRY 对象, 距离使用笛卡尔坐标单位测量。对于 GEOGRAPHY 对象, 距离以米为单位测量

 

4. 返回

BOOLEAN

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (Perfect Sphere)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 兼容的 GEOGRAPHY 对:

数据类型

GEOGRAPHY (Perfect Sphere)

Point-Point

Point-Linestring

Point-Polygon

Point-Multilinestring

Point-Multipolygon

 

7. 示例

以下示例显示了 STV_DWithin 的用法。

两个几何图形彼此在最接近的点的距离为一个笛卡尔坐标单位:

=> SELECT STV_DWithin(ST_GeomFromText('POLYGON((-1 -1,2 2,0 1,-1 -1))'),

ST_GeomFromText('POLYGON((4 3,2 3,4 5,4 3))'),1);

STV_DWithin

-------------

t

(1 row)

如果将该距离缩小为 0.99 个单位:

=> SELECT STV_DWithin(ST_GeomFromText('POLYGON((-1 -1,2 2,0 1,-1 -1))'),

ST_GeomFromText('POLYGON((4 3,2 3,4 5,4 3))'),0.99);

STV_DWithin

-------------

f

(1 row)

第一个多边形将会接触到第二个多边形:

=> SELECT STV_DWithin(ST_GeomFromText('POLYGON((-1 -1,2 2,0 1,-1 -1))'),

ST_GeomFromText('POLYGON((1 1,2 3,4 5,1 1))'),0.00001);

STV_DWithin

-------------

t

(1 row)

第一个多边形不在第二个多边形的 1000 米距离范围以内:

=> SELECT STV_DWithin(ST_GeomFromText('POLYGON((45.2 40,50.65 51.29,

55.67 47.6,50 47.6,45.2 40))'),ST_GeomFromText('POLYGON((25 25,25 30,

30 30,30 25,25 25))'), 1000);

STV_DWithin

--------------

t

(1 row)

4.11  Shapefile 函数

基于 shapefile 的内容创建表。解析数据并将其加载到 SeaSQL EDW 数据库中。将数据导出为 shapefile。

4.11.1  STV_Export2Shapefile

将数据库表或子查询中的 GEOGRAPHY 或 GEOMETRY 数据导出到 shapefile 。将输出写入到使用 STV_SetExportShapefileDirectory 指定的目录。

1. 行为类型

不可变

2. 语法

STV_Export2Shapefile( columns

USING PARAMETERS shapefile = 'name_of_shapefile'

[, overwrite = FALSE] [, shape = 'Polygon'] )

OVER()

FROM [table|subquery]

3. 参数

参数

说明

shapefile = 'name_of_shapefile'

shapefile 组件名称的前缀, 类型为 VARCHAR。必须以文件扩展名 .shp 结束。长度限制为 128 个八位位组。例如, city-data.shp。

如果想要将 shapefile 保存到子目录, 可通过将子目录连接到 name_of_shapefile 来实现。例如, visualizations/city-data.shp。

overwrite = FALSE

(可选)用于指定是否覆盖索引的 BOOLEAN 值(如果存在索引)。此参数不能为 NULL。默认值: False

覆盖可能会损坏现有文件。

shape = 'Polygon'

必须为以下空间类之一: Point、Polygon、Linestring、Multipoint、Multipolygon、Multilinestring。多边形和多边形集合始终为顺时针方向。

默认值:Polygon

columns

导出到 shapefile 的列。

星号 (*) 值等同于列出 FROM 子句的所有列。

 

4. 返回

Shapefile 导出目录中具有扩展名 .shp、.shx 和 .dbf 的三个文件。

5. 权限

具有地理空间函数访问权的任何用户。

6. 限制

·     如果多边形集合、线串集合或点集合仅包含一个元素,则分别被写为多边形、线或点。

·     超过 10 个字符的列名称会被截短。

·     不能导出空的 POINTS。

·     会跳过所有包含 NULL 几何或地理数据的列。

·     不支持或无效的日期将被替换为NULL。

·     数字值在导出时可能会损失精度。发生精度损失的原因是,.dbf 文件中的目标字段为 64 位 FLOAT 列,只能表示约 15 个有效位。

7. 示例

以下示例显示了如何使用 STV_Export2Shapefile 将表 geo_data 的所有列导出到名为 city-data.shp 的 shapefile:

=> SELECT STV_Export2Shapefile(*

USING PARAMETERS shapefile = 'visualizations/city-data.shp', overwrite = true, shape = 'Point')

OVER()

FROM geo_data

WHERE REVENUE > 25000;

Rows Exported |      File Path

---------------+--------------------------------------------------------------

6442892 | v_geo-db_node0001: /home/geo/temp/visualizations/city-data.shp

(1 row)

4.11.2  STV_GetExportShapefileDirectory

返回导出目录的路径。

1. 行为类型

不可变

2. 语法

STV_GetExportShapefileDirectory( )

3. 返回

图形文件导出目录的路径。

4. 示例

以下示例显示了如何使用 STV_GetExportShapefileDirectory 来查询 shapefile 导出目录的路径:

=> SELECT STV_GetExportShapefileDirectory();

STV_GetExportShapefileDirectory

-----------------------------------------------

Shapefile export directory: [/home/user/temp] (1 row)

4.11.3  STV_SetExportShapefileDirectory

指定将 GEOMETRY 或 GEOGRAPHY 数据导出到 shapefile 的目录。不检查路径的有效性, 并且路径不能为空。

1. 行为类型

不可变

2. 语法

STV_SetExportShapefileDirectory( USING PARAMETERS path='shapefile_path' )

3. 参数

shapefile_path:需要将 shapefile 导出到的路径。例如“/home/user/temp”。

4. 返回

图形文件导出目录的路径。

5. 权限

只有超级用户才能使用此函数。

6. 示例

以下示例显示了如何使用 STV_SetExportShapefileDirectory 将 shapefile 导出目录设为 /home/user/temp:

=> SELECT STV_SetExportShapefileDirectory(USING PARAMETERS path = '/home/user/temp'); STV_SetExportShapefileDirectory

------------------------------------------------------------

SUCCESS. Set shapefile export directory: [/home/user/temp] (1 row)

4.11.4  STV_ShpCreateTable

返回包含在指定的 shapefile 中找到的属性列和类型的 CREATE TABLE 语句。

列类型将根据 shapefile 元数据调整大小。列大小基于在 shapefile 中找到的最大几何图形。表中的第一列是 gid, 它是自动递增的 IDENTITY 主关键字列。缓存值默认设为 64。最后一列是用于存储实际几何数据的 GEOMETRY 数据类型。

1. 行为类型

不可变

2. 语法

STV_ShpCreateTable(USING PARAMETERS file='filename') OVER()

3. 参数

file = 'filename':.dbf、.shp 或 .shx 文件的完全限定路径。(扩展名可选。)

4. 返回

与指定的 shapefile 相匹配的 CREATE TABLE 语句

5. 使用提示

·     STV_ShpCreateTable 会返回 CREATE TABLE 语句; 但它不会创建表。根据需要修改 CREATE TABLE 语句,在将 shapefile 加载到表中之前创建该表。

·     要使用字母数字和下划线 (_) 字符之外的其他字符创建表, 必须指定双引号括起的表名称, 例如"counties%NY"。

·     表名称与 shapefile 的名称相同(不包括目录名称或扩展名)。

·     必须可以从启动节点访问 shapefile。

·     如果 .shp 和 .shx 文件已损坏, STV_ShpCreateTable 将返回错误。如果.shp 和 .shx 文件有效,但 .dbf 文件已损坏,STV_ShpCreateTable 将忽略 .dbf 文件并且不创建该数据对应的列。

·     所有必要文件(.dbf、.shp、.shx)必须在同一个目录中。否则,STV_ShpCreateTable 将会返回错误。

·     如果 shapefile 的 .dbf 组件包含数字属性,则在 SeaSQL EDW shapefile 加载程序将此字段加载到表中时, 此字段的值可能会损失精度。因为目标字段为 64 位FLOAT 列,只能表示约 15 个有效位。而在 .dbf 文件中,数字字段最多可达30 位。

·     SeaSQL EDW 会在 vertica.log 文件中记录所有长度过大的 shapefile 值实例。

6. 示例

以下示例显示了 STV_ShpCreateTable 的用法。返回 CREATE TABLE 语句:

=> SELECT STV_ShpCreateTable

(USING PARAMETERS file='/shapefiles/tl_2010_us_state10.shp') OVER() as create_table_states;

create_table_states

----------------------------------

CREATE TABLE tl_2010_us_state10( gid IDENTITY(64) PRIMARY KEY, REGION10 VARCHAR(2), DIVISION10 VARCHAR(2), STATEFP10 VARCHAR(2), STATENS10 VARCHAR(8),

GEOID10 VARCHAR(2), STUSPS10 VARCHAR(2), NAME10 VARCHAR(100), LSAD10 VARCHAR(2), MTFCC10 VARCHAR(5), FUNCSTAT10 VARCHAR(1), ALAND10 INT8,

AWATER10 INT8, INTPTLAT10 VARCHAR(11), INTPTLON10 VARCHAR(12), geom GEOMETRY(940845)

);

(18 rows)

4.11.5  STV_ShpSource 和 STV_ShpParser

这两个函数可与 COPY 命令配合使用, 解析 shapefile 中的几何图形和属性并将其加载到数据库表, 然后转换为 GEOMETRY 数据类型格式。必须将这两个函数一起使用。需要 SRID。无法从 shapefile 加载空的点集合或无效的多边形集合。

1. 行为类型

不可变

2. 语法

COPY table_name( col2, col3, ..., coln )

WITH SOURCE STV_ShpSource( file = 'filename'[[, SRID=spatial reference identifier]

[, flatten_2d={true | false }] ] ) PARSER STV_ShpParser()

3. 参数

参数

说明

table_name

向其中加载几何数据的表名称

col1, col2, ...

表中与外部文件字段相匹配的列名称。运行 STV_

ShpCreateTable 创建的 CREATE TABLE 命令。执行此操作时, 这些列将对应第二列到倒数第二列。

file = 'filename'

.dbf、.shp 或 .shx 文件的完全限定路径

SRID=spatial reference identifier

与 shapefile 关联的空间参照标识符 (SRID), 类型为 INTEGER

flatten_2d

(可选)用于确定在 COPY 命令期间是否排除 3D 或4D 坐标的 BOOLEAN 值。

·     True - 在 COPY 命令之前排除使用 3D 或 4D 坐标的几何图形。

·     False - 如果发现使用 3D 或 4D 坐标的几何图形, 将会导致加载失败。

默认值: False

 

4. 使用提示

·     以下情况下 COPY 命令将会失败:

¡     找不到或无法打开 shapefile。

¡     STV_ShpParser 创建的列数或列数据类型与目标表中的列不匹配。使用STV_ShpCreateTable 生成相应的 CREATE TABLE 命令。

¡     缺失或无法打开其中一个必要文件。当打开 shapefile 时,必须具备以下三个文件: .dbf、.shp 和 .shx。

·     如果 .shp 和 .shx 文件已损坏,STV_ShpSource 将返回错误。如果 .shp 和.shx 文件有效, 但 .dbf 文件已损坏, STV_ShpSource 将忽略 .dbf 文件并且不创建该数据对应的列。

·     任何被拒绝的记录都将保存在编录目录下的 /CopyErrorLogs 目录中。

·     如果 shapefile 的 .dbf 组件包含数字属性,则在 shapefile 加载程序将此字段加载到表中时,此字段的值可能会损失精度。因为目标字段为 64 位 FLOAT 列,只能表示约15 个有效位;而在 .dbf 文件中,数字字段最多可达 30 位。

5. 示例

以下示例显示了 STV_ShpSource 和 STV_ShpParser 的用法。

=>COPY tl_2010_us_state10 WITH SOURCE STV_ShpSource(file='/shapefiles/tl_2010_us_state10.shp', SRID=4269) PARSER STV_ShpParser();

Rows loaded

-------------

52

4.12  空间索引函数

执行与空间索引相关的任务。

4.12.1  STV_Create_Index

对一组多边形创建空间索引, 以加快与一组点的空间相交计算速度。

利用一个输入多边形集(可以是查询的结果), 可以创建空间索引。空间索引是在全局命名空间中创建的。当跨群集的节点对输入表或projection分段时, SeaSQL EDW 会采用分布式计划。

OVER() 子句必须为空。

1. 行为类型

注意

索引没有关联到任何特定的表。后续对输入数据源的一个或多个底层表执行 DML 命令不会修改索引。

 

不可变

2. 语法

STV_Create_Index( gid, g

USING PARAMETERS index='index_name'

[, overwrite={ true | false } ] [, max_mem_mb=maxmem_value]

[, skip_nonindexable_polygons={true | false } ] )

OVER()

[ AS (polygons, srid, min_x, min_y, max_x, max_y, info) ] FROM [table|subquery]

3. 参数

参数

说明

gid

唯一标识多边形的 Integer 列的名称。Gid 不能为 NULL

g

包含多边形或多边形集合的几何或地理 (WGS84) 列或表达式的名称。只能对多边形和多边形集合编制索引。将从索引中排除其他图形类型

index = 'index_name'

(可选)索引名称, 类型为 VARCHAR。索引名称不能超过 110 个字符。索引名称中不允许使用斜杠、反斜杠和制表符

overwrite = [ true | false ]

(可选)用于指定是否覆盖索引的BOOLEAN 值(如果存在索引)。此参数不能为 NULL。

默认值: False

max_mem_mb = maxmem_value

(可选)用于为 STV_Create_Index 在索引构建期间可分配的内存量指定限制(以MB 为单位)的正整数。在多节点数据库上, 它是每个节点的内存限制。默认值为 256。不要指定高于 GENERAL 资源池中的内存量的值。

如果为 max_mem_mb 设置的值等于或接近节点上的最大可用内存, 则可能给系统性能造成不利影响。例如,它可能导致在索引构建期间, 其他查询由于等待内存资源而发生超时。

skip_nonindexable_polygons = [ true | false ]

(可选)BOOLEAN

在极少的情况下,无法对复杂多边形(例如解析度过高或包含不规则尖峰)编制索引。这些多边形被视为不可编制索引。

·     当设为 False 时, 不可编制索引的多边形会导致创建索引失败。

·     当设为 True 时, 可通过从索引中排除不可编制索引的多边形成功创建索引。

要审查无法编制索引的多边形,请配合参数 list_polygon 使用 STV_Describe_Index

默认值: False

 

4. 返回

参数

说明

polygons

已编制索引的多边形数量

SRID

空间参照系标识符

min_x, min_y, max_x, max_y

已编制索引的几何图形的最小边界矩形 (MBR) 的坐标。

(min_x, min_y) 是西南坐标, (max_x, max_y) 是东北坐标。

info

列出从索引中排除的空间对象数量及其类型

 

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 权限

任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除由其他任何用户创建的索引。

7. 建议

对跨多个节点的大型多边形表进行分段。通过表分段可以并行运行索引创建操作,从而充分利用 SeaSQL EDW 中的大规模并行处理 (MPP) 架构。这会显著缩短大型表的执行时间。

对于需要构建索引的表,如果多边形总数较大,SeaSQL EDW 建议对其进行分段。

·     STV_Create_Index 可能占用大量处理时间和内存。

首次为新数据编制索引时,SeaSQL EDW 建议监视内存使用情况, 以确保其保持在安全限制以内。内存使用情况取决于多边形数量、顶点数量以及多边形之间的重叠量。

·     STV_Create_Index 会在开始创建索引之前尝试分配内存。如果无法分配足够的内存, 函数将会失败。如果没有足够的可用内存,请尝试以下解决方案:

¡     在系统负载较小时创建索引。

¡     避免并发创建索引。

¡     尝试跨群集节点对输入表进行分段。

·     在创建索引前确保所有多边形都是有效的多边形。STV_Create_Index和STV_Refresh_Index在创建索引时不检查多边形的有效性。

8. 限制

·     索引名称中不允许使用反斜杠或制表符。

·     索引名称不能超过 110 个字符。

·     将从索引中排除以下几何图形:

¡     非多边形

¡     使用 NULL 标识符的几何图形

¡     NULL 多边形(集合)

¡     EMPTY 多边形(集合)

¡     无效的多边形(集合)

·     以下地形被排除在索引之外:

¡     有孔的多边形

¡     跨越国际日期变更线的多边形

¡     覆盖北极或南极的多边形

¡     对跖多边形

9. 使用提示

·     要取消运行 STV_Create_Index,请使用 Ctrl + C。

·     如果 Geometry 列没有有效的多边形,STV_Create_Index 将在 vertica.log 中报告错误并停止创建索引。

·     如果创建索引时使用了大量内存,请考虑对数据进行分段, 以便并行创建索引。

10. 示例

以下示例显示了 STV_Create_Index 的用法。使用单个字面参数创建索引:

=> SELECT STV_Create_Index(1, ST_GeomFromText('POLYGON((0 0,0 15.2,3.9 15.2,3.9 0,0 0))')

USING PARAMETERS index='my_polygon') OVER();

polygons | SRID | min_x | min_y | max_x | max_y | info

----------+------+-------+-------+-------+-------+------

1 |       0 |   0 |   0 |   3.9 | 15.2 |

(1 row)

从表创建索引:

=> CREATE TABLE pols (gid INT, geom GEOMETRY(1000));

 CREATE TABLE

=> COPY pols(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((-31 74,8 70,8 50,-36 53,-31 74))

>> 2|POLYGON((-38 50,4 13,11 45,0 65,-38 50))

>> 3|POLYGON((10 20,15 60,20 45,46 15,10 20))

>> 4|POLYGON((5 20,9 30,20 45,36 35,5 20))

>> 5|POLYGON((12 23,9 30,20 45,36 35,37 67,45 80,50 20,12 23))

>> \.

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons_1', overwrite=true, max_mem_mb=256) OVER() FROM pols;

polygons | SRID | min_x | min_y | max_x | max_y | info

----------+------+-------+-------+-------+-------+------

5 |       0 |   -38 |       13 | 50 | 80 |

(1 row)

从已分区的表并行创建索引:

=> CREATE TABLE pols (p INT, gid INT, geom GEOMETRY(1000)) SEGMENTED BY HASH(p) ALL NODES;

CREATE TABLE

=> COPY pols (p, 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|10|POLYGON((-31 74,8 70,8 50,-36 53,-31 74))

>> 1|11|POLYGON((-38 50,4 13,11 45,0 65,-38 50))

>> 3|12|POLYGON((-12 42,-12 42,27 48,14 26,-12 42))

>> \.

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons', overwrite=true, max_mem_mb=256) OVER() FROM pols;

polygons | SRID | min_x | min_y | max_x | max_y | info

----------+------+-------+-------+-------+-------+------

3 |       0 |   -38 |       13 | 27 | 74 |

(1 row)

4.12.2  STV_Describe_Index

检索关于包含一组多边形的索引的信息。如果没有传递任何参数, STV_Describe_Index 将返回所有已定义的索引。

OVER() 子句必须为空。

1. 行为类型

不可变

2. 语法

STV_Describe_Index ( [ USING PARAMETERS [index='index_name']

[, list_polygons={true | false } ]] ) OVER ()

3. 参数

参数

说明

index = 'index_name'

(可选)索引名称, 类型为 VARCHAR。索引名称不能超过 110个字符。索引名称中不允许使用斜杠、反斜杠和制表符

list_polygon

(可选)用于指定是否列出索引中的多边形的 BOOLEAN 值。索引参数必须与此参数配合使用

 

4. 返回

参数

说明

polygons

已编制索引的多边形数量

SRID

空间参照系标识符

min_x, min_y, max_x, max_y

已编制索引的几何图形的最小边界矩形 (MBR) 的坐标。

(min_x, min_y) 是西南坐标, (max_x, max_y) 是东北坐标

name

空间索引的名称

gid

唯一标识多边形的 Integer 列的名称。Gid 不能为NULL

state

索引中的空间对象的状态。值可能是:

·     INDEXED - 空间对象已成功编制索引

·     SELF_INTERSECT -(仅限 WGS84)空间对象未编制索引, 因为其一个边与自身的另一个边相交

·     EDGE_CROSS_IDL -(仅限 WGS84)空间对象未编制索引, 因为其一个边与国际日期变更线交叉

·     EDGE_HALF_CIRCLE -(仅限 WGS84)空间对象未编制索引, 因为包含两个对跖的相邻顶点

·     NON_INDEXABLE - 空间对象无法编制索引

geography

空间对象的熟知二进制 (WKB) 表示

geometry

空间对象的熟知二进制 (WKB) 表示

 

5. 权限

任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除由其他任何用户创建的索引。

6. 示例

以下示例显示了 STV_Describe_Index 的用法。检索关于索引的信息:

=> SELECT STV_Describe_Index (USING PARAMETERS index='my_polygons') OVER ();

 type   | polygons | SRID | min_x | min_y | max_x | max_y

----------+----------+------+-------+-------+-------+-------

GEOMETRY |   4 |   0 |   -1 |  -1 |  12 | 12

(1 row)

返回所有已定义的索引的名称:

=> SELECT STV_Describe_Index() OVER ();

name

------------------

MA_counties_index

my_polygons

NY_counties_index

US_States_Index (4 rows)

返回索引中包含的多边形:

=>SELECT STV_Describe_Index(USING PARAMETERS index='my_polygons', list_polygons=TRUE) OVER ();

gid |    state       |      geometry

-----+---------------+----------------------------------

 12 | INDEXED |  \260\000\000\000\000\000\000\ ...

14 | INDEXED  |  \200\000\000\000\000\000\000\ ...

10 | NON_INDEXABLE | \274\000\000\000\000\000\000\  ...

11 | INDEXED   |  \260\000\000\000\000\000\000\ ...

(4 rows)

4.12.3  STV_Drop_Index

删除空间索引。如果 STV_Drop_Index 找不到指定的空间索引, 它将返回错误。

OVER 子句必须为空。

1. 行为类型

不可变

2. 语法

STV_Drop_Index( USING PARAMETERS index = 'index_name' ) OVER ()

3. 参数

index = 'index_name':(可选)索引名称, 类型为 VARCHAR。索引名称不能超过 110

个字符。索引名称中不允许使用斜杠、反斜杠和制表符。

4. 示例

以下示例显示了 STV_Drop_Index 的用法。删除索引:

=> SELECT STV_Drop_Index(USING PARAMETERS index ='my_polygons') OVER ();

drop_index

------------

Index dropped

(1 row)

4.12.4  STV_Refresh_Index

将新添加或更新的多边形追加到现有的空间索引,以及从现有的空间索引中移除已删除的多边形。

OVER() 子句必须为空。

1. 行为类型

可变

2. 语法

STV_Refresh_Index( gid, g

USING PARAMETERS index='index_name'

[, skip_nonindexable_polygons={ true | false } ] )

OVER()

[ AS (type, polygons, srid, min_x, min_y, max_x, max_y, info, indexed, appended, updated, deleted) ]

FROM table

3. 参数

参数

说明

gid

唯一标识多边形的 Integer 列的名称。Gid 不能为 NULL

g

包含多边形或多边形集合的几何或地理 (WGS84) 列或表达式的名称。只能对多边形和多边形集合编制索引。将从索引中排除其他图形类型

index = 'index_name'

(可选)索引名称, 类型为 VARCHAR。索引名称不能超过 110 个字符。索引名称中不允许使用斜杠、反斜杠和制表符

skip_nonindexable_polygons = { true | false }

(可选)BOOLEAN

在极少的情况下, 无法对复杂多边形(例如解析度过高或包含不规则尖峰)编制索引。这些多边形被视为不可编制索引。

·     当设为 False 时, 不可编制索引的多边形会导致创建索引失败。

·     当设为 True 时, 可通过从索引中排除不可编制索引的多边形成功创建索引。

要审查无法编制索引的多边形,请配合参数 list_polygon 使用 STV_Describe_Index。

默认值: False

 

4. 返回

参数

说明

type

索引的空间对象类型

polygons

已编制索引的多边形数量

SRID

空间参照系标识符

min_x, min_y, max_x, max_y

已编制索引的几何图形的最小边界矩形 (MBR) 的坐标。

(min_x, min_y) 是西南坐标, (max_x, max_y) 是东北坐标

info

列出从索引中排除的空间对象数量及其类型

indexed

在操作期间编制索引的多边形数量

appended

追加的多边形数量

updated

更新的多边形数量

deleted

删除的多边形数量

 

5. 支持的数据类型

数据类型

GEOMETRY

GEOGRAPHY (WGS84)

Point

Multipoint

Linestring

Multilinestring

Polygon

Multipolygon

GeometryCollection

 

6. 权限

任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除由其他任何用户创建的索引。

7. 限制

·     在极少的情况下, 无法对复杂多边形(例如解析度过高或包含不规则尖峰)编制索引。请参见参数 skip_nonindexable_polygons。

·     如果将源表中的有效多边形替换为无效的多边形, STV_Refresh_Index 将会忽略无效的多边形。因此,原来已编制索引的多边形仍保留在索引中。

·     以下几何图形不能编制索引:

¡     非多边形

¡     NULL gid

¡     NULL 多边形(集合)

¡     EMPTY 多边形(集合)

¡     无效的多边形(集合)

·     以下地形被排除在索引之外:

¡     有孔的多边形

¡     跨越国际日期变更线的多边形

¡     覆盖北极或南极的多边形

¡     对跖多边形

8. 使用提示

·     要取消运行 STV_Refresh_Index, 请使用 Ctrl + C。

·     如果使用之前没有与索引关联的源数据, 则会覆盖索引。

·     如果 STV_Refresh_Index 没有足够的内存处理该查询,则将使用 STV_Create_Index 重建索引。

·     如果 Geometry 列没有有效的多边形, STV_Refresh_Index 将在 vertica.log 中报告错误并停止刷新索引。

9. 示例

以下示例显示了 STV_Refresh_Index 的用法。使用单个字面参数刷新索引:

=> SELECT STV_Create_Index(1, ST_GeomFromText('POLYGON((0 0,0 15.2,3.9 15.2,3.9 0,0 0))')

USING PARAMETERS index='my_polygon') OVER();

type | polygons | SRID | min_x | min_y | max_x | max_y | info

----------+----------+------+-------+-------+-------+-------+------

GEOMETRY | 1 | 0 | 0 | 0 | 3.9 | 15.2 |

(1 row)

=> SELECT STV_Refresh_Index(2, ST_GeomFromText('POLYGON((0 0,0 13.2,3.9 18.2,3.9 0,0 0))')

USING PARAMETERS index='my_polygon') OVER();

type | polygons | SRID | min_x | min_y | max_x | max_y | info | indexed | appended | updated |

deleted

----------+----------+------+-------+-------+-------+-------+------+---------+----------+---------

+---------

GEOMETRY | 1 | 0 | 0 | 0 | 3.9 | 18.2 | | 1 | 1 | 0 |

1

(1 row)

 

刷新表索引:

=> CREATE TABLE pols (gid INT, geom GEOMETRY);

CREATE TABLE

=> COPY pols(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((-31 74,8 70,8 50,-36 53,-31 74))

>> 2|POLYGON((5 20,9 30,20 45,36 35,5 20))

>> 3|POLYGON((12 23,9 30,20 45,36 35,37 67,45 80,50 20,12 23))

>> \.

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons_1', overwrite=true)

OVER() FROM pols;

type | polygons | SRID | min_x | min_y | max_x | max_y | info

----------+----------+------+-------+-------+-------+-------+------

GEOMETRY | 3 | 0 | -36 | 20 | 50 | 80 |

(1 row)

=> COPY pols(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.

>> 6|POLYGON((-32 74,8 70,8 50,-36 53,-32 74))

>> \.

=> SELECT STV_Refresh_Index(gid, geom USING PARAMETERS index='my_polygons_1') OVER() FROM pols;

type | polygons | SRID | min_x | min_y | max_x | max_y | info | indexed | appended | updated |

deleted

----------+----------+------+-------+-------+-------+-------+------+---------+----------+---------

+---------

GEOMETRY | 4 | 0 | -36 | 20 | 50 | 80 | | 1 | 1 | 0 |0

(1 row)

4.12.5  STV_Rename_Index

为空间索引重命名。如果索引格式过期, 则不能为索引重命名。

利用一个输入多边形集(可以是查询的结果), 可以创建空间索引。空间索引是在全局命名空间中创建的。当跨群集的节点对输入表或projection分段时,SeaSQL EDW 会采用分布式计划。

OVER() 子句必须为空。

1. 行为类型

不可变

2. 语法

STV_Rename_Index( USING PARAMETERS

source = 'old_index_name',

dest = 'new_index_name',

overwrite = [ 'true' | 'false' ]

)

OVER ()

3. 参数

参数

说明

source = 'old_index_name'

空间索引的当前名称, 类型为 VARCHAR

dest = 'new_index_name'

空间索引的新名称, 类型为 VARCHAR

overwrite = [ 'true' | 'false' ]

(可选)用于指定是否覆盖索引的 BOOLEAN 值(如果存在索引)。此参数不能为 NULL。

默认值: False

 

4. 权限

任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除由其他任何用户创建的索引。

5. 限制

·     索引名称不能超过 110 个字符。

·     索引名称中不允许使用反斜杠或制表符。

6. 示例

以下示例显示了 STV_Rename_Index 的用法。为索引重命名:

=> SELECT STV_Rename_Index ( USING PARAMETERS

source = 'my_polygons', dest = 'US_states', overwrite = 'false'

)

OVER ();

rename_index

---------------

Index renamed (1 Row)

4.13  空间连接函数

针对点-多边形对执行空间关联。

4.13.1  STV_Intersect Scalar Function

将点与一组多边形在空间上相交。STV_Intersect 标量函数将返回与相交多边形关联的标识符。

1. 行为类型

不可变

2. 语法

STV_Intersect({ g | x , y }

 

USING PARAMETERS index= 'index_name')

FROM table

3. 参数

参数

说明

g

包含点的几何或地理 (WGS84) 列 。 g 列只能包含点几何图形或地理图形 。

如果该列包含其他几何或地理类型,STV_Intersect 将会终止并提示错误

x

X坐标,float

y

y坐标,float

index = 'index_name'

空间索引的名称, 类型为 VARCHAR

 

4. 返回

匹配多边形的标识符。如果点没有与索引中的任何多边形相交, 则 STV_Intersect 标量函数将返回 NULL。

5. 示例

以下示例显示了 STV_Intersect 的用法。返回匹配多边形的 gid 或返回 NULL:

=> CREATE TABLE polygons (gid INT, geom GEOMETRY(700));

CREATE TABLE

=> COPY polygons (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((-31 74,8 70,8 50,-36 53,-31 74))

>> 2|POLYGON((-38 50,4 13,11 45,0 65,-38 50))

>> 3|POLYGON((-18 42,-10 65,27 48,14 26,-18 42))

>> \.

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons', overwrite=true, max_mem_mb=256) OVER() FROM polygons;

type    | polygons | SRID | min_x | min_y | max_x | max_y | info

----------+----------+------+-------+-------+-------+-------+------

GEOMETRY |   3 |   0 |   -38 |       13 | 27 | 74 |

(1 row)

=> CREATE TABLE points (gid INT, geom GEOMETRY(700));

CREATE TABLE

=> COPY points (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.

>> 100|POINT(-1 52)

>> 101|POINT(-20 0)

>> 102|POINT(-8 25)

>> 103|POINT(0 0)

>> 104|POINT(1 5)

>> 105|POINT(20 45)

>> 106|POINT(-20 5)

>> 107|POINT(-20 1)

>> \.

=> SELECT gid AS pt_gid, STV_Intersect(geom USING PARAMETERS index='my_polygons') AS pol_gid

FROM points ORDER BY pt_gid;

pt_gid | pol_gid

--------+---------

100 | 1

101 |

102 | 2

103 |

104 |

105 | 3

106 |

107 |

(8 rows)

4.13.2  STV_Intersect Transform Function

将点与多边形在空间上相交。STV_Intersect 变换函数返回包含匹配的点/多边形对的元组。对于每个点, 可能返回一个或多个匹配的多边形。

在多个节点上并行计算 STV_Intersect 变换函数可以提高性能。要执行并行计算, 请使用 OVER(PARTITION BEST) 子句。

1. 行为类型

不可变

2. 语法

STV_Intersect ({ gid | i }, { g | x , y }

USING PARAMETERS index='index_name') OVER() AS (pt_gid, pol_gid)

FROM table

3. 参数

参数

说明

gid

用于唯一标识 g 的空间对象的整型列

g

包含点的几何或地理 (WGS84) 列。g 列只能包含点几何图形或地理图形。如果该列包含其他几何或地理类型, STV_Intersect 将会终止并提示错误

index = 'index_name'

空间索引的名称, 类型为 VARCHAR

x

X坐标,float

y

y坐标,float

 

4. 返回

参数

说明

pt_gid

几何或地理点的唯一标识符, 类型为 INTEGER

pol_gid

几何或地理多边形的唯一标识符, 类型为 INTEGER

 

5. 示例

以下示例显示了 STV_Intersect 变换函数的用法。返回匹配的点-多边形对。

=> CREATE TABLE polygons (gid int, geom GEOMETRY(700));

CREATE TABLE

=> COPY polygons (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.

>> 10|POLYGON((5 5, 5 10, 10 10, 10 5, 5 5))

>> 11|POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))

>> 12|POLYGON((1 1, 1 3, 3 3, 3 1, 1 1))

>> 14|POLYGON((-1 -1, -1 12, 12 12, 12 -1, -1 -1))

>> \.

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons', overwrite=true, max_mem_

mb=256)

OVER() FROM polygons;

type | polygons | SRID | min_x | min_y | max_x | max_y | info

----------+----------+------+-------+-------+-------+-------+------

GEOMETRY | 4 | 0 | -1 | -1 | 12 | 12 |

(1 row)

 

=> CREATE TABLE points (gid INT, geom GEOMETRY(700));

CREATE TABLE

=> COPY points (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(9 9)

>> 2|POINT(0 1)

>> 3|POINT(2.5 2.5)

>> 4|POINT(0 0)

>> 5|POINT(1 5)

>> 6|POINT(1.5 1.5)

>> \.

=> SELECT STV_Intersect(gid, geom USING PARAMETERS index='my_polygons') OVER (PARTITION BEST)

AS (point_id, polygon_gid)

FROM points;

point_id | polygon_gid

----------+-------------

5 | 14

1 | 14

1 | 10

4 | 14

4 | 11

6 | 12

6 | 14

6 | 11

2 | 14

2 | 11

3 | 12

3 | 14

(12 rows)

可通过在 WHERE 子句中使用 STV_Intersect 变换函数来提高查询性能 。由于此语法会消除未与索引中的多边形相交的点, 因此能够提高性能 。

 

返回与 gid = 14 的多边形相交的点计数:

=> SELECT COUNT(pt_id) FROM

(SELECT STV_Intersect(gid, geom USING PARAMETERS index='my_polygons')

OVER (PARTITION BEST) AS (pt_id, pol_id) FROM points)

AS T WHERE pol_id = 14;

COUNT

-------

6

(1 row)

4.14  按数据类型划分空间函数

4.14.1  几何函数

以下函数支持几何数据类型:

ST_AsBinary

ST_AsText 

ST_Area

ST_Boundary

ST_Buffer

ST_Centroid

ST_Contains

ST_ConvexHull

ST_Crosses

ST_Difference

ST_Disjoint

ST_Distance

STV_DWithin

ST_Envelope

ST_Equals

ST_GeometryN

ST_GeomFromGeoJSON

ST_GeomFromText

ST_GeomFromWKB

ST_GeometryType

ST_Intersection

ST_Intersects

ST_IsEmpty

ST_IsSimple

ST_IsValid

ST_Length

ST_NumPoints

ST_Overlaps

ST_PointN

ST_Relate

ST_SRID

ST_SymDifference

ST_Touches

ST_Union

ST_Within

ST_X

ST_XMax

ST_XMin

ST_Y

ST_YMax

ST_YMin

STV_AsGeoJSON

STV_Create_Index

STV_Describe_Index

STV_Drop_Index

STV_Export2Shapefile

STV_ForceLHR

STV_GeometryPoint

STV_Geography

STV_GetExportShapefileDirectory

STV_Intersect

Scalar Function STV_Intersect

Transform Function STV_IsValidReason

STV_LineStringPoint

STV_MemSize

STV_NN

STV_PolygonPoint

STV_Refresh_Index

STV_Rename_Index

STV_Reverse

STV_SetExportShapefileDirectory

STV_ShpCreateTable

STV_ShpSource 和 STV_ShpParser

4.14.2  地理(理想球体)函数

以下函数支持地理(理想球体)数据类型:

ST_Area

ST_AsBinary

ST_AsText

ST_Contains

ST_Distance

ST_Equals

ST_GeometryN

ST_GeometryType

ST_GeographyFromText

ST_GeographyFromWKB

ST_IsEmpty 

ST_IsSimple

ST_Length

ST_NumPoints

ST_PointN

ST_SRID

ST_Within

ST_X

ST_XMax

ST_XMin

ST_Y

ST_YMax

ST_YMin

STV_AsGeoJSON

STV_DWithin

STV_Export2Shapefile

STV_ForceLHR

STV_GeographyPoint

STV_Geometry

STV_GetExportShapefileDirectory

STV_LineStringPoint

STV_MemSize

STV_NN

STV_PolygonPoint

STV_Reverse

STV_SetExportShapefileDirectory

STV_ShpCreateTable

STV_ShpSource 和 STV_ShpParser

4.14.3  地理 (WGS84) 函数

以下函数支持地理 (WGS84) 数据类型:

ST_AsBinary

ST_AsText

ST_Distance

ST_Equals

ST_GeographyFromText

ST_GeographyFromWKB

ST_GeometryN

ST_IsEmpty

ST_NumPoints

ST_PointN

ST_SRID ST_X

ST_Y

STV_AsGeoJSON

STV_Create_Index

STV_Describe_Index

STV_Drop_Index

STV_Export2Shapefile

STV_ForceLHR

STV_Geometry

STV_GeographyPoint

STV_GetExportShapefileDirectory

STV_Intersect Scalar Function

STV_Intersect Transform Function

STV_LineStringPoint

STV_MemSize

STV_PolygonPoint

STV_Refresh_Index

STV_Rename_Index

STV_Reverse

STV_SetExportShapefileDirectory

STV_ShpCreateTable

STV_ShpSource 和 STV_ShpParser

4.15  处理表中的空间对象

4.15.1  定义空间数据的空间对象

要定义包含 GEOMETRY 和 GEOGRAPHY 数据的列,请使用以下命令:

=> CREATE TABLE [[db-name.]schema.]table-name ( column-name GEOMETRY[(length)],

column-name GEOGRAPHY[(length)]);

如果忽略长度规范,则默认列大小为 1 MB。最大列大小为 10 MB。不强制执行上限, 但 SeaSQL EDW 地理空间函数只能接受或返回不超过 10 MB 的空间数据。

在创建后,无法修改 GEOMETRY 或 GEOGRAPHY 列的大小或数据类型。如果创建的列大小不足,请创建一个具有所需大小的新列。然后从旧列复制数据,并从表中删除旧列。

无法向包含另一个 SeaSQL EDW 数据库的空间数据的表导入数据或从中导出数据。

说明

列宽过大可能会影响性能。使用适合数据但不会过大的列宽。

 

4.15.2  从表中导出空间数据

可以将 SeaSQL EDW 数据库表中的空间数据导出到 shapefile。要将表中的空间数据导出到 shapefile:

(1)     以超级用户的身份设置 shapefile 导出目录

=> SELECT STV_SetExportShapefileDirectory(USING PARAMETERS path = '/home/geo/temp');

STV_SetExportShapefileDirectory

------------------------------------------------------------

SUCCESS. Set shapefile export directory: [/home/geo/temp]

(1 row)

(2)     将空间数据导出到 shapefile。

=> SELECT STV_Export2Shapefile(*

USING PARAMETERS shapefile = 'visualizations/city-data.shp', shape = 'Polygon') OVER() FROM spatial_data;

Rows Exported |    File Path

---------------+----------------------------------------------------------------

185873 | v_geo-db_node0001: /home/geo/temp/visualizations/city-data.shp

(1 row)

n 值星号 (*) 等同于列出 FROM 子句中的所有列。

n 在导出 shapefile 时可以指定子目录。

n Shapefile 必须以文件扩展名 .shp 结束。

(3)     确认现在有三个文件显示在 shapefile 导出目录中

$ ls

city-data.dbf  city-data.shp   city-data.shx

4.15.3  识别 Null 空间对象

可使用 IS NULL 和 IS NOT NULL 结构来识别空的 GEOMETRY 和

GEOGRAPHY 对象。

以下示例使用下面的表, 其中 id=2 的行在 geog 字段中包含 null 值。

=> SELECT id, ST_AsText(geom), ST_AsText(geog) FROM locations ORDER BY 1 ASC;

id |      ST_AsText    |      ST_AsText

----+----------------------------------+--------------------------------------

1 | POINT (2 3)       | POINT (-85 15)

2 | POINT (4 5)       |

3 | POLYGON ((-1 2, 0 3, 1 2, -1 2)) | POLYGON ((-24 12, -15 23, -20 27, -24 12))

4 | LINESTRING (-1 2, 1 5)   | LINESTRING (-42.74 23.98, -62.19 23.78)

(4 rows)

识别具有 null geog 值的所有行:

=> SELECT id, ST_AsText(geom), (ST_AsText(geog) IS NULL) FROM locations ORDER BY 1 ASC;

id |      ST_AsText    | ?column?

----+----------------------------------+----------

1 | POINT (2 3)       | f

2 | POINT (4 5)       | t

3 | POLYGON ((-1 2, 0 3, 1 2, -1 2)) | f

4 | LINESTRING (-1 2, 1 5)   | f

 (4 rows)

识别 geog 值不为 null 的行:

=> SELECT id, ST_AsText(geom), (ST_AsText(geog) IS NOT NULL) FROM locations ORDER BY 1 ASC;

id |      st_astext       | ?column?

----+----------------------------------+---------- 1 | POINT (2 3)     | t

| POINT (4 5)   | f

| LINESTRING (-1 2, 1 5)      | t 4 | POLYGON ((-1 2, 0 3, 1 2, -1 2)) | t

(4 rows)

4.15.4  从 Shapefile 中加载空间数据

SeaSQL EDW提供了加载和解析 shapefile 中存储的空间数据的功能。Shapefile 描述了点、线和多边形。Shapefile 由三个必要的文件构成:所有三个文件都必须存在,并且位于同一目录内以定义几何图形:

·     shp—包含几何数据。

·     shx—包含几何图形的位置索引。

·     dbf—包含每个几何图形的属性。

要从 shapefile 加载空间数据:

(1)     使用 STV_ShpCreateTable 生成 CREATE TABLE 语句

=> SELECT STV_ShpCreateTable ( USING PARAMETERS file = '/home/geo/temp/shp-files/spatial_ data.shp') OVER() AS spatial_data;

spatial_data

----------------------------------

CREATE TABLE spatial_data(

gid IDENTITY(64) PRIMARY KEY,

uniq_id INT8, geom GEOMETRY(85)

);

(5 rows)

创建表。

=> CREATE TABLE spatial_data( gid IDENTITY(64) PRIMARY KEY,

uniq_id INT8,

geom GEOMETRY(85));

(2)     加载 shapefile

=> COPY spatial_data WITH SOURCE STV_ShpSource(file='/home/geo/temp/shp-files/spatial_ data.shp') PARSER STV_ShpParser();

Rows Loaded

-------------

10

(1 row)

4.15.5  支持的 Shapefile 图形类型

下表列出了SeaSQL EDW支持的 shapefile 图形类型。

Shapefile 图形类型

支持

Null 图形

Point

Polyline

Polygon

MultiPoint

PointZ

PolylineZ

PolygonZ

MultiPointZ

PointM

PolylineM

PolygonM

MultiPointM

MultiPatch

 

4.15.6  使用 COPY 将空间数据加载到表中

可以使用 COPY 语句将空间数据加载到 SeaSQL EDW 中的表。要使用 COPY 语句将数据加载到 SeaSQL EDW:

(1)     创建表。

=> CREATE TABLE spatial_data (id INTEGER, geom GEOMETRY(200));

CREATE TABLE

(2)     使用以下数据创建名为 spatial.dat 的文本文件。

1|POINT(2 3)

2|LINESTRING(-1 2, 1 5)

3|POLYGON((-1 2, 0 3, 1 2, -1 2))

(3)     使用 COPY 将数据加载到表中。

=> COPY spatial_data (id, gx FILLER LONG VARCHAR(605), geom AS ST_GeomFromText(gx)) FROM LOCAL 'spatial.dat';

Rows Loaded

-------------

3

(1 row)

该语句指定了一个 LONG VARCHAR(32000000) 填充器,它是 WKT 的最大大小。必须指定足够大的填充器值,以容纳想要插入表中的最大 WKT。

4.15.7  从表中检索作为熟知文本 (WKT) 的空间数据

GEOMETRY 和 GEOGRAPHY 数据在 SeaSQL EDW 表中存储为用户不可读的 LONG

VARBINARY。可使用 ST_AsText 返回熟知文本 (WKT) 格式的空间数据。要返回 WKT 格式的空间数据:

=> SELECT id, ST_AsText(geom) AS WKT FROM spatial_data;

id |      WKT

----+----------------------------------

 1 | POINT (2 3)

2 | LINESTRING (-1 2, 1 5)

3 | POLYGON ((-1 2, 0 3, 1 2, -1 2))

(3 rows)

4.15.8  使用GeoHash数据

SeaSQL EDW支持GeoHashes。GeoHash是一种地理编码系统,用于对越来越细化的空间参考进行分层编码。GeoHash中的每个附加字符都会向下钻取地图的较小部分。

用户可以使用SeaSQL EDW从GeoHashes生成空间数据,并从空间数据生成GeoHashes。SeaSQL EDW支持与GeoHashes一起使用的以下功能:

·     ST_GeoHash-返回指定几何形状的GeoHash。

·     ST_GeomFromGeoHash-返回指定GeoHash形状的多边形。

·     ST_PointFromGeoHash-返回指定的GeoHash的中心点。

例如,要从单个点生成全精度和部分精度的GeoHash。

=>SELECT ST_GeoHash(ST_GeographyFromText('POINT(3.14 -1.34)')),

LENGTH(ST_GeoHash(ST_GeographyFromText('POINT(3.14 -1.34)'))),

ST_GeoHash(ST_GeographyFromText('POINT(3.14 -1.34)') USING PARAMETERS numchars=5) partial_hash;

      ST_GeoHash      | LENGTH | partial_hash

----------------------+--------+--------------

 kpf0rkn3zmcswks75010 |     20 | kpf0r

(1 row)     

 

本示例说明如何从多点对象生成GeoHash。返回的多边形是包围该GeoHash的最小图块的几何对象。

=> SELECT ST_AsText(ST_GeomFromGeoHash(ST_GeoHash(ST_GeomFromText('MULTIPOINT(0 0, 0.0002 0.0001)')))) AS region_1,

                    ST_AsText(ST_GeomFromGeoHash(ST_GeoHash(ST_GeomFromText('MULTIPOINT(0.0001 0.0001, 0.0003 0.0002)')))) AS region_2;

-[ RECORD 1 ]-------------------------------------------------------------------------------------------------

region_1 | POLYGON ((0 0, 0.000343322753906 0, 0.000343322753906 0.000171661376953, 0 0.000171661376953, 0 0))

region_2 | POLYGON ((0 0, 0.00137329101562 0, 0.00137329101562 0.00137329101562, 0 0.00137329101562, 0 0))

使用 ST_Intersects 和 STV_Intersect 执行空间关联

利用空间关联可以确定两组空间数据之间的空间关系。例如,可使用空间关联:

·     计算不同区域内的移动呼叫密度,以确定新蜂窝站的位置。

·     确定在飓风影响区域内的家庭。

·     计算在某个邮政编码区域内生活的用户数量。

·     计算零售店在任意指定时间的顾客数量。

1. 空间关联的最佳实践

使用以下 SeaSQL EDW 地理空间最佳实践来提高总体性能并优化空间查询。在 SeaSQL EDW 地理空间中使用空间关联的最佳实践包括:

·     通过表分段提高创建索引的速度。

·     适当调整 Geometry 列的大小以存储点数据。

·     在 COPY 语句中使用 STV_GeometryPoint, 将熟知文本 (WKT) 直接加载到Geometry 列中。

·     将 OVER (PARTITION BEST) 与 STV_Intersect 变换查询配合使用。

2. 最佳实践示例

在执行以下示例中的步骤之前,请从 Vertica Place GitHub 存储库

(http://github.com/vertica/Place) 下载 place_output.csv.zip。需要使用此存储库中的数据集。

(1)     创建用于多边形的表。使用适合数据但不会过大的 GEOMETRY 列宽。合适的列宽有助于提高性能。此外, 通过哈希处理对表进行分段有利于并行计算。

=> CREATE TABLE artworks (gid int, g GEOMETRY(700)) SEGMENTED BY HASH(gid) ALL NODES;

(2)     将 Copy 语句与 ST_Buffer 配合使用, 创建并加载对其运行相交函数的多边形。通过在 Copy 语句中使用 ST_Buffer, 可使用该函数创建多边形。

=> COPY artworks(gid, gx FILLER LONG VARCHAR, g AS ST_Buffer(ST_GeomFromText(gx),8)) FROM STDIN DELIMITER ',';

>> 1, POINT(10 45)

>> 2, POINT(25 45)

>> 3, POINT(35 45)

>> 4, POINT(35 15)

>> 5, POINT(30 5)

>> 6, POINT(15 5)

>> \.

(3)     创建用于位置数据(表示为点)的表。可以将点数据存储在大小为 100 字节的GEOMETRY 列中。避免设置过大的 GEOMETRY 列。否则可能严重影响空间相交的性能。此外, 通过哈希处理对表进行分段有利于并行计算。

=> CREATE TABLE usr_data (gid identity, usr_id int, date_time timestamp, g GEOMETRY(100)) SEGMENTED BY HASH(gid) ALL NODES;

(4)     在执行 Copy 语句的过程中, 将原始位置数据转换为 GEOMETRY 数据。由于位置数据需要使用 GEOMETRY 数据类型, 因此必须执行此变换。使用函数 STV_GeometryPoint 变换源表的 x 和 y 列。

=> COPY usr_data (usr_id, date_time, x FILLER LONG VARCHAR,

y FILLER LONG VARCHAR, g AS STV_GeometryPoint(x, y)) FROM LOCAL 'place_output.csv' DELIMITER ',' ENCLOSED BY '';

(5)     创建用于多边形的空间索引。此索引有助于加快相交计算的速度。

=> SELECT STV_Create_Index(gid, g USING PARAMETERS index='art_index', overwrite=true) OVER() FROM artworks;

(6)     编写用于返回每个多边形的相交数量的分析查询。指定SeaSQL EDW 地理空间忽略与给定多边形相交次数少于 20 次的任何 usr_id。

=> SELECT pol_gid,

COUNT(DISTINCT(usr_id)) AS count_user_visit

FROM

(SELECT pol_gid, usr_id,

COUNT(usr_id) AS user_points_in FROM

(SELECT STV_Intersect(usr_id, g USING PARAMETERS INDEX='art_index') OVER(PARTITION BEST) AS

(usr_id,

FROM usr_data

WHERE date_time BETWEEN '2014-07-02 09:30:20' AND '2014-07-02 17:05:00') AS c

GROUP BY pol_gid,

usr_id HAVING COUNT(usr_id) > 20) AS real_visits GROUP BY pol_gid

ORDER BY count_user_visit DESC;

3. 示例查询中的优化

此查询采用了以下优化:

·     断言的时间出现在子查询中。

·     使用位置数据表避免需要巨大开销的联接操作。

·     查询使用 OVER (PARTITION BEST), 通过对数据进行分区提高了性能。

·     user_points_in 提供了所有游客与艺术品相交所花的综合时间估算值。

4.15.9  在创建或刷新索引之前确保多边形有效性

当SeaSQL EDW的创建或更新空间索引它不检查多边形有效性。为了防止在查询空间索引时得到无效的结果,应在创建或更新空间索引之前检查多边形的有效性。

以下示例显示了如何检查多边形的有效性。

(1)     创建一个表并加载空间数据。

=> CREATE TABLE polygon_validity_test (gid INT, geom GEOMETRY);

CREATE TABLE

=> COPY polygon_validity_test (gid, gx FILLER LONG VARCHAR, geom AS St_GeomFromText(gx)) FROM STDIN;

Enter data to be copied followed by a newline.

End with a backslash and a period on a line by itself.

>> 2|POLYGON((-31 74,8 70,8 50,-36 53,-31 74))

>> 3|POLYGON((-38 50,4 13,11 45,0 65,-38 50))

>> 4|POLYGON((-12 42,-12 42,27 48,14 26,-12 42))

>> 5|POLYGON((0 0,1 1,0 0,2 1,1 1,0 0))

>> 6|POLYGON((3 3,2 2,2 1,2 3,3 3))

>> \.

(2)     使用ST_IsValid和STV_IsValidReason查找任何无效的多边形。

=> SELECT gid, ST_IsValid(geom), STV_IsValidReason(geom) FROM polygon_validity_test;

 gid | ST_IsValid |            STV_IsValidReason

-----+------------+------------------------------------------

   4 | t          |

   6 | f          | Self-intersection at or near POINT (2 1)

   2 | t          |

   3 | t          |

   5 | f          | Self-intersection at or near POINT (0 0)

(5 rows)

现在,我们已经在表中确定了无效的多边形,在创建或刷新空间索引时,可以通过几种不同的方式来处理无效的多边形。

2. 使用WHERE子句过滤无效的多边形

此方法比创建索引之前的过滤要慢,因为它在执行时检查每个多边形的有效性。

下面的示例说明如何使用WHERE子句排除无效的多边形。

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index = 'valid_polygons') OVER()

   FROM polygon_validity_test

   WHERE ST_IsValid(geom) = 't';

3. 在创建或刷新索引之前过滤无效的多边形

此方法比使用WHERE子句进行过滤的速度更快,因为在构建索引之前会产生性能成本。

以下示例显示了如何通过创建一个排除无效多边形的新表来排除无效多边形。

=> CREATE TABLE polygon_validity_clean AS

   SELECT *

   FROM polygon_validity_test

   WHERE ST_IsValid(geom) = 't';

CREATE TABLE

=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index = 'valid_polygons') OVER()

   FROM polygon_validity_clean;

4.15.10  STV_Intersect:标量函数与转换函数

这些 STV_Intersect 函数的用途相似,但用法不同。

STV_Intersect

函数类型

描述

性能

标量

将点与多边形进行匹配。如果有多个多边形包含该点, 则此函数将返回 gid 值。正常情况下其结果是多边形 gid。但如果没有任何多边形包含该点, 则为NULL。

消除未与任何已创建索引的多边形相交的点, 从而避免不必要的比较操作。

变换

将点与包含该点的所有多边形进行匹配。如果点没有与索引中的任何多边形相交, 则函数不会返回任何行。

处理所有输入点, 不论其是否与已编制索引的多边形相交。

 

在下面的示例中, STV_Intersect 标量函数会将 points 表中的点与名为 my_polygons 的空间索引中的多边形进行比较。STV_Intersect 将会返回所有完全匹配的点和多边形:

=> SELECT gid AS pt_gid,

   STV_Intersect(geom USING PARAMETERS index='my_polygons') AS pol_gid

   FROM points ORDER BY pt_gid;

 pt_gid | pol_gid

--------+---------

    100 |       2

    101 |       

    102 |       2

    103 |      

    104 |       

    105 |       3

    106 |      

    107 |       

 (8 rows)

以下示例显示了如何使用 STV_Intersect 变换函数来返回关于匹配的三个点-多边形对以及它们所匹配的每个多边形的信息:

=> SELECT STV_Intersect(gid, geom

   USING PARAMETERS index='my_polygons')

   OVER (PARTITION BEST) AS (pt_gid, pol_id)

   FROM points;

 pt_gid | pol_id 

--------+--------

    100 |      1

    100 |      2

    100 |      3

    102 |      2

    105 |      3

(3 rows)

4.15.11  使用 STV_Intersect 函数执行空间关联

假定用户想要处理一个大中型空间数据集, 并确定哪些点与哪些多边形相交。这种情况下, 请首先使用 STV_Create_Index 创建一个空间索引。空间索引提高了访问多边形集的效率。

然后,使用 STV_Intersect 标量或变换函数确定匹配的点-多边形对。

1. 空间索引和 STV_Intersect

在使用 STV_Intersect 函数之一执行空间关联之前, 必须首先运行 STV_Create_Index, 创建一个包含多边形相关信息的数据库对象。此对象被称为多边形集的空间索引。空间索引缩短了 STV_Intersect 函数访问多边形数据所用的时间。

SeaSQL EDW 地理空间在全局空间中创建空间索引。因此, 任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除其他任何用户创建的索引。

SeaSQL EDW 地理空间提供了多个与空间索引配合使用的函数:

·     STV_Create_Index—在索引中存储关于多边形的信息以提高性能。

·     STV_Describe_Index—检索关于索引的信息。

·     STV_Drop_Index—删除空间索引。

·     STV_Refresh_Index—刷新空间索引。

·     STV_Rename_Index—重命名空间索引。

4.15.12  何时使用ST_Intersects与 STV_ Intersect

SeaSQL EDW 地理空间提供了两种功能来识别一组点是否与一组多边形相交。根据数据集的大小, 选择可提供最佳性能的方法:

·     在将一组几何图形与单个几何图形进行比较以查看其是否相交时,请使用ST_Intersects 函数。

·     要确定一组点是否与一个大中型数据集中的一组多边形相交,请首先使用STV_Create_Index 创建空间索引。然后,使用 STV_Intersect 函数之一返回相交的点-多边形对集合。

说明

只能对 GEOMETRY 数据执行空间关联。

 

1. 使用 ST_Intersects 执行空间联接

ST_Intersects 确定两个 GEOMETRY 对象是否在一个点相交或接触。

当需要确定一个列中的小型几何图形集与给定的几何图形是否相交时, 可使用ST_Intersects。

示例

以下示例使用 ST_Intersects 将一列点几何图形与单个多边形进行比较。包含点的表有 1 百万行。

ST_Intersects 仅返回与多边形相交的点。这些点约占表中点数的 0.01%:

=> CREATE TABLE points_1m(gid IDENTITY, g GEOMETRY(100)) ORDER BY g;

=> COPY points_1m(wkt FILLER LONG VARCHAR(100), g AS ST_GeomFromText(wkt)) FROM LOCAL '/data/points.dat' DIRECT;

Rows Loaded

-------------

1000000

(1 row)

=> SELECT ST_AsText(g) FROM points_1m WHERE ST_Intersects

(

g,

ST_GeomFromText('POLYGON((-71 42, -70.9 42, -70.9 42.1, -71 42.1, -71 42))')

);

st_astext

----------------------------

POINT (-70.97532 42.03538)

POINT (-70.97421 42.0376)

POINT (-70.99004 42.07538)

POINT (-70.99477 42.08454)

POINT (-70.99088 42.08177)

POINT (-70.98643 42.07593)

POINT (-70.98032 42.07982)

POINT (-70.95921 42.00982)

POINT (-70.95115 42.02177)

...

(116 rows)

SeaSQL EDW 建议通过创建空间索引来测试两列几何图形的相交情况。使用 STV_Intersect: 标量函数与转换函数中介绍的 STV_Intersect 函数之一。

4.16  使用客户端应用程序中的空间对象

SeaSQL EDW 客户端驱动程序库提供用于将客户端应用程序连接到 SeaSQL EDW 数据库的接口。这些驱动程序简化了执行加载、报告生成及其他常见数据库任务时的数据交换操作。

以下是三种不同的客户端驱动程序:

·     开放数据库连接 (ODBC)—对于以 C、Python、PHP、Perl 和其他大多数语言编写的第三方应用程序和客户端而言最常用的接口。

·     Java 数据库连接 (JDBC)—供采用 Java 编程语言编写的客户端使用。

·     面向 .NET 的 ActiveX 数据对象 (ADO.NET)—供使用 Microsoft .NET Framework开发的并且以 C#、Visual Basic .NET 和其他 .NET 语言编写的客户端使用。

SeaSQL EDW 地理空间支持以下新数据类型:

·     LONG VARCHAR

·     LONG VARBINARY

·     GEOMETRY

·     GEOGRAPHY

客户端驱动程序库支持上述数据类型; 以下几节将介绍该项支持并提供示例。

4.16.1  将 LONG VARCHAR 和 LONGVARBINARY 数据类型与 ODBC 配合使用

注意

请勿针对 LONG VARBINARY 和 LONG VARCHAR 值使用效率低下的编码格式。SeaSQL EDW 不能加载大于 32MB 的编码值, 即使解码值的大小小于32MB。例如, 如果用户尝试加载以八进制格式编码的 32MB LONG VARBINARY 值, SeaSQL EDW 将返回错误, 因为八进制编码使值的大小翻了两番(每个字节都转换成了反斜杠后跟三位数)。

 

ODBC 驱动程序支持 LONG VARCHAR 和 LONG VARBINARY 数据类型(这两种数据类型分别类似于 VARCHAR 和 VARBINARY 数据类型)。

将输入参数或输出参数绑定到查询中的 LONG VARCHAR 或 LONG VARBINARY 列时, 请使用 SQL_LONGVARCHAR 和SQL_LONGVARBINARY 常数设置列的数据类型。例如, 若要将输入参数绑定到 LONG VARCHAR 列, 应使用如下所示的语句:

rc = SQLBindParameter(hdlStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR,

             80000, 0, (SQLPOINTER)myLongString, sizeof(myLongString), NULL);

4.16.2  将 LONG VARCHAR 和 LONGVARBINARY 数据类型与 JDBC 配合使用

在 JDBC 客户端应用程序中使用 LONG VARCHAR 和 LONG VARBINARY 数据类型与使用 VARCHAR 和 VARBINARY 数据类型相似。JDBC 驱动程序以透明方式处理转换(例如, Java String 对象和 LONG VARCHAR 之间的转换)。以下示例代码演示了插入和检索 LONG VARCHAR 字符串。此示例使用 JDBC Types 类确定由 SeaSQL EDW 返回的字符串的数据类型, 但它实际上不需要知道数据库列是LONG VARCHAR 还是 VARCHAR 即可检索值。

import java.sql.*;

import java.util.Properties;

 

public class LongVarcharExample {

    public static void main(String[] args) {

        try {

            Class.forName("com.vertica.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            System.err.println("Could not find the JDBC driver class.");

            e.printStackTrace();

            return;

        }

        Properties myProp = new Properties();

        myProp.put("user", "ExampleUser");

        myProp.put("password", "password123");

        Connection conn;

        try {

            conn = DriverManager.getConnection(

                            "jdbc:vertica://VerticaHost:5433/ExampleDB",

                            myProp);

            // establish connection and make a table for the data.

            Statement stmt = conn.createStatement();        

           

            // How long we want the example string to be. This is

            // larger than can fit into a traditional VARCHAR (which is limited

            // to 65000.

            int length = 100000;

           

            // Create a table with a LONG VARCHAR column that can store

            // the string we want to insert.

            stmt.execute("DROP TABLE IF EXISTS longtable CASCADE");

            stmt.execute("CREATE TABLE longtable (text LONG VARCHAR(" + length

                            + "))");

            // Build a long string by appending an integer to a string builder

            // until we hit the size limit. Will result in a string

            // containing 01234567890123....

            StringBuilder sb = new StringBuilder(length);

            for (int i = 0; i < length; i++)

            {

                sb.append(i % 10);

            }

            String value = sb.toString();

           

            System.out.println("String value is " + value.length() +

                            " characters long.");

           

            // Create the prepared statement

            PreparedStatement pstmt = conn.prepareStatement(

                            "INSERT INTO longtable (text)" +

                            " VALUES(?)");

            try {

                // Insert LONG VARCHAR value

                System.out.println("Inserting LONG VARCHAR value");

                pstmt.setString(1, value);

                pstmt.addBatch();

                pstmt.executeBatch();

               

                // Query the table we created to get the value back.

                ResultSet rs = null;

                rs = stmt.executeQuery("SELECT * FROM longtable");

               

                // Get metadata about the result set.

                ResultSetMetaData rsmd = rs.getMetaData();

                // Print the type of the first column. Should be

                // LONG VARCHAR. Also check it against the Types class, to

                // recognize it programmatically.

                System.out.println("Column #1 data type is: " +

                                rsmd.getColumnTypeName(1));

                if (rsmd.getColumnType(1) == Types.LONGVARCHAR) {

                    System.out.println("It is a LONG VARCHAR");

                } else {

                    System.out.println("It is NOT a LONG VARCHAR");

                }

               

                // Print out the string length of the returned value.

                while (rs.next()) {

                    // Use the same getString method to get the value that you

                    // use to get the value of a VARCHAR.

                    System.out.println("Returned string length: " +

                                    rs.getString(1).length());

                }

            } catch (SQLException e) {

                System.out.println("Error message: " + e.getMessage());

                return; // Exit if there was an error

            }

            // Cleanup

            conn.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }  

}

说明

请勿针对 LONG VARBINARY 和 LONG VARCHAR 值使用效率低下的编码格式。SeaSQL EDW 不能加载大于 32MB 的编码值, 即使解码值的大小小于 32MB。例如, 如果用户尝试加载以八进制格式编码的 32MB LONG VARBINARY 值, SeaSQL EDW 将返回错误, 因为八进制编码使值的大小翻了两番(每个字节都转换成了反斜杠后跟三位数)。

 

4.16.3  将 GEOMETRY 和 GEOGRAPHY 数据类型用于 ODBC

GEOMETRY 和 GEOGRAPHY 数据类型受 LONG VARBINARY 原生类型支持, ODBC 客户端应用程序将其视为二进制数据。但是, 这些数据类型的格式是 SeaSQL EDW 所特有的。要在 C++ 应用程序中操作此数据,必须使用 SeaSQL EDW中可将其转换为可识别格式的函数。

要将 WKT 或 WKB 转换为 GEOMETRY 或 GEOGRAPHY 格式, 请使用以下 SQL函数之一:

·     ST_GeographyFromText—将 WKT 转换为 GEOGRAPHY 类型。

·     ST_GeographyFromWKB—将 WKB 转换为 GEOGRAPHY 类型。

·     ST_GeomFromText—将 WKT 转换为 GEOMETRY 类型。

·     ST_GeomFromWKB—将 WKB 转换为 GEOMETRY 类型。

要将 GEOMETRY 或 GEOGRAPHY 对象转换为其对应的 WKT 或 WKB, 请使用以下 SQL 函数之一:

·     ST_AsText—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKT, 返回LONGVARCHAR。

·     ST_AsBinary—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKB, 返回 LONG VARBINARY。

以下代码示例使用 ST_GeomFromText 将 WKT 数据转换为 GEOMETRY 数据,然后将其存储在表中。之后,此示例从该表中检索 GEOMETRY 数据,并使用 ST_AsText 和 ST_AsBinary 将它转换为 WKT 和 WKB 格式。

 

// Compile on Linux using:

//  g++ -g -I/opt/vertica/include -L/opt/vertica/lib64 -lodbc -o SpatialData SpatialData.cpp

// Some standard headers

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <sstream>

// Only needed for Windows clients

// #include <windows.h>

// Standard ODBC headers

#include <sql.h>

#include <sqltypes.h>

#include <sqlext.h>

// Helper function to print SQL error messages.

template <typename HandleT>

void reportError(int handleTypeEnum, HandleT hdl)

{

    // Get the status records.

    SQLSMALLINT   i, MsgLen;

    SQLRETURN     ret2;

    SQLCHAR       SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];

    SQLINTEGER    NativeError;

    i = 1;

    printf("\n");

    while ((ret2 = SQLGetDiagRec(handleTypeEnum, hdl, i, SqlState, &NativeError,

                                Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {           

        printf("error record %d\n", i);

        printf("sqlstate: %s\n", SqlState);

        printf("detailed msg: %s\n", Msg);

        printf("native error code: %d\n\n", NativeError);

        i++;

    }

    exit(EXIT_FAILURE); // bad form... but Ok for this demo

}

int main()

{

    // Set up the ODBC environment

    SQLRETURN ret;

    SQLHENV hdlEnv;

    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hdlEnv);

    assert(SQL_SUCCEEDED(ret));

    // Tell ODBC that the application uses ODBC 3.

    ret = SQLSetEnvAttr(hdlEnv, SQL_ATTR_ODBC_VERSION,

        (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);

    assert(SQL_SUCCEEDED(ret));

    // Allocate a database handle.

    SQLHDBC hdlDbc;

    ret = SQLAllocHandle(SQL_HANDLE_DBC, hdlEnv, &hdlDbc);

    assert(SQL_SUCCEEDED(ret));

    // Connect to the database

    printf("Connecting to database.\n");

    const char *dsnName = "ExampleDB";

    const char* userID = "dbadmin";

    const char* passwd = "password123";

    ret = SQLConnect(hdlDbc, (SQLCHAR*)dsnName,

        SQL_NTS,(SQLCHAR*)userID,SQL_NTS,

        (SQLCHAR*)passwd, SQL_NTS);

    if(!SQL_SUCCEEDED(ret)) {

        printf("Could not connect to database.\n");

        reportError<SQLHDBC>(SQL_HANDLE_DBC, hdlDbc);

       

    } else {

        printf("Connected to database.\n");

    }

     

    // Disable AUTOCOMMIT

    ret = SQLSetConnectAttr(hdlDbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF,

        SQL_NTS);

   

    // Set up a statement handle

    SQLHSTMT hdlStmt;

    SQLAllocHandle(SQL_HANDLE_STMT, hdlDbc, &hdlStmt);

       

    // Drop any previously defined table.

    ret = SQLExecDirect(hdlStmt, (SQLCHAR*)"DROP TABLE IF EXISTS polygons",

        SQL_NTS);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

   

    // Run query to create a table to hold a geometry.

    ret = SQLExecDirect(hdlStmt,

        (SQLCHAR*)"CREATE TABLE polygons(id INTEGER PRIMARY KEY, poly GEOMETRY);",

        SQL_NTS);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

   

    // Create the prepared statement. This will insert data into the

    // table we created above. It uses the ST_GeomFromText function to convert the

    // string-formatted polygon definition to a GEOMETRY datat type.

    printf("Creating prepared statement\n");

    ret = SQLPrepare (hdlStmt,

        (SQLTCHAR*)"INSERT INTO polygons(id, poly) VALUES(?, ST_GeomFromText(?))",

        SQL_NTS) ;

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

   

    SQLINTEGER id = 0;

    int numBatches = 5;

    int rowsPerBatch = 10;

   

    // Polygon definition as a string.

    char polygon[] = "polygon((1 1, 1 2, 2 2, 2 1, 1 1))";

    // Bind variables to the parameters in the prepared SQL statement

    ret = SQLBindParameter(hdlStmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,

        0, 0, &id, 0 , NULL);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT,hdlStmt);}

    // Bind polygon string to the geometry column

    SQLBindParameter(hdlStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR,

        strlen(polygon), 0, (SQLPOINTER)polygon, strlen(polygon), NULL);

     if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT,hdlStmt);}

    // Execute the insert

    ret = SQLExecute(hdlStmt);

    if(!SQL_SUCCEEDED(ret)) { 

       reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);

    }  else {

        printf("Executed batch.\n");

    }

   

    // Commit the transaction

    printf("Committing transaction\n");

    ret = SQLEndTran(SQL_HANDLE_DBC, hdlDbc, SQL_COMMIT);

    if(!SQL_SUCCEEDED(ret)) {

        reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);                     

    }  else {

        printf("Committed transaction\n");

    }

    // Now, create a query to retrieve the geometry.

    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdlDbc, &hdlStmt);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

    printf("Getting data from table.\n");

    // Execute a query to get the id, raw geometry data, and

    // the geometry data as a string. Uses the ST_AsText SQL function to

    // format raw data back into a string polygon definition

    ret = SQLExecDirect(hdlStmt,

        (SQLCHAR*)"select id,ST_AsBinary(poly),ST_AsText(poly) from polygons ORDER BY id;",

        SQL_NTS);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT,hdlStmt);}

   

    SQLINTEGER idval;

    // 10MB buffer to hold the raw data from the geometry (10Mb is the maximum

    // length of a GEOMETRY)

    SQLCHAR* polygonval = (SQLCHAR*)malloc(10485760);

    SQLLEN polygonlen, polygonstrlen;

    // Buffer to hold a LONGVARCHAR that can result from converting the

    // geometry to a string.

    SQLTCHAR* polygonstr = (SQLTCHAR*)malloc(33554432);

   

    // Get the results of the query and print each row.

    do {

        ret = SQLFetch(hdlStmt);

        if (SQL_SUCCEEDED(ret)) {

            // ID column

            ret = SQLGetData(hdlStmt, 1, SQL_C_LONG, &idval, 0, NULL);

            if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

            printf("id: %d\n",idval);

            // The WKB format geometry data

            ret = SQLGetData(hdlStmt, 2, SQL_C_BINARY, polygonval, 10485760,

                &polygonlen);

            if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

            printf("Polygon in WKB format: ");

            // Print each byte of polygonval buffer in hex format.

            for (int z = 0; z < polygonlen; z++)

                printf("%02x ",polygonval[z]);

            printf("\n");

            // Geometry data formatted as a string.

            ret = SQLGetData(hdlStmt, 3, SQL_C_TCHAR, polygonstr, 33554432, &polygonstrlen);

            if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

            printf("Polygon in WKT format: %s\n", polygonstr);

        }

    } while(SQL_SUCCEEDED(ret));

   

   

    free(polygonval);

    free(polygonstr);

    // Clean up

    printf("Free handles.\n");

    ret = SQLFreeHandle(SQL_HANDLE_STMT, hdlStmt);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

    ret = SQLFreeHandle(SQL_HANDLE_DBC, hdlDbc);

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

    ret = SQLFreeHandle(SQL_HANDLE_ENV, hdlEnv); 

    if (!SQL_SUCCEEDED(ret)) {reportError<SQLHDBC>(SQL_HANDLE_STMT, hdlStmt);}

    exit(EXIT_SUCCESS);

}

运行上述示例的输出是:

Connecting to database. Connected to database. Creating prepared statement Executed batch.

Committing transaction Committed transaction Getting data from table. id: 0

Polygon in WKB format: 01 03 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 f0 3f

Polygon in WKT format: POLYGON ((1 1, 1 2, 2 2, 2 1, 1 1)) Free handles.

说明

请勿针对 LONG VARBINARY 和 LONG VARCHAR 值使用效率低下的编码格式。SeaSQL EDW 不能加载大于 32 MB 的编码值, 即使解码值的大小小于32MB。例如, 如果用户尝试加载以八进制格式编码的 32 MB LONG VARBINARY 值, SeaSQL EDW 将返回错误, 因为八进制编码使值的大小翻了两番(每个字节都转换成了反斜杠后跟三位数)。

 

4.16.4  将 GEOMETRY 和 GEOGRAPHY 数据类型用于 JDBC

GEOMETRY 和 GEOGRAPHY 数据类型受 LONG VARBINARY 原生类型支持, JDBC 客户端应用程序将其视为二进制数据。但是, 这些数据类型的格式是 SeaSQL EDW 所特有的。要在 Java 应用程序中操作此数据, 必须使用 SeaSQL EDW中可将其转换为识别的格式的函数。

要将 WKT 或 WKB 转换为 GEOMETRY 或 GEOGRAPHY 格式, 请使用以下 SQL函数之一:

·     ST_GeographyFromText—将 WKT 转换为 GEOGRAPHY 类型。

·     ST_GeographyFromWKB—将 WKB 转换为 GEOGRAPHY 类型。

·     ST_GeomFromText—将 WKT 转换为 GEOMETRY 类型。

·     ST_GeomFromWKB—将 WKB 转换为 GEOMETRY 类型。

要将 GEOMETRY 或 GEOGRAPHY 对象转换为其对应的 WKT 或 WKB, 请使用以下 SQL 函数之一:

·     ST_AsText—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKT, 返回LONGVARCHAR。

·     ST_AsBinary—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKB, 返回 LONGVARBINARY。

以下代码示例使用 ST_GeomFromText 和 ST_GeomFromWKB 将 WKT 和 WKB 数据转换为 GEOMETRY 数据,然后将其存储在表中。之后,此示例从该表中检索GEOMETRY 数据, 并使用 ST_AsText 和 ST_AsBinary 将它转换为 WKT 和 WKB格式。

import java.io.InputStream;

import java.io.Reader;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

public class GeospatialDemo

{

    public static void main(String [] args) throws Exception

    {

        Class.forName("com.vertica.jdbc.Driver");

        Connection conn =

              DriverManager.getConnection("jdbc:vertica://localhost:5433/db",

                                          "user", "password");

        conn.setAutoCommit(false);

       

        Statement stmt = conn.createStatement();

        stmt.execute("CREATE TABLE polygons(id INTEGER PRIMARY KEY, poly GEOMETRY)");

       

        int id = 0;

        int numBatches = 5;

        int rowsPerBatch = 10;

       

        //batch inserting WKT data

        PreparedStatement pstmt = conn.prepareStatement("INSERT INTO polygons

                                  (id, poly) VALUES(?, ST_GeomFromText(?))");

        for(int i = 0; i < numBatches; i++)

        {

           

            for(int j = 0; j < rowsPerBatch; j++)

            {

                //Insert your own WKT data here

                pstmt.setInt(1, id++);

                pstmt.setString(2, "polygon((1 1, 1 2, 2 2, 2 1, 1 1))");

                pstmt.addBatch();

            }

            pstmt.executeBatch();

        }

       

        conn.commit();

        pstmt.close();

        //batch insert WKB data

        pstmt = conn.prepareStatement("INSERT INTO polygons(id, poly)

                                      VALUES(?, ST_GeomFromWKB(?))");

        for(int i = 0; i < numBatches; i++)

        {

            for(int j = 0; j < rowsPerBatch; j++)

            {

                //Insert your own WKB data here

                byte [] wkb = getWKB();

                pstmt.setInt(1, id++);

                pstmt.setBytes(2, wkb);

                pstmt.addBatch();

            }

            pstmt.executeBatch();

        }

       

        conn.commit();

        pstmt.close();

        //selecting data as WKT

        ResultSet rs = stmt.executeQuery("select ST_AsText(poly) from polygons");

        while(rs.next())

        {

            String wkt = rs.getString(1);

            Reader wktReader = rs.getCharacterStream(1);

            //process the wkt as necessary

        }

        rs.close();

       

        //selecting data as WKB

        rs = stmt.executeQuery("select ST_AsBinary(poly) from polygons");

        while(rs.next())

        {

            byte [] wkb = rs.getBytes(1);

            InputStream wkbStream = rs.getBinaryStream(1);

            //process the wkb as necessary

        }

        rs.close();

       

        //binding parameters in predicates

        pstmt = conn.prepareStatement("SELECT id FROM polygons WHERE

                                      ST_Contains(ST_GeomFromText(?), poly)");

        pstmt.setString(1, "polygon((1 1, 1 2, 2 2, 2 1, 1 1))");

        rs = pstmt.executeQuery();

        while(rs.next())

        {

            int pk = rs.getInt(1);

                  //process the results as necessary

        }

        rs.close();

       

        conn.close();

    }

}

4.16.5  将 GEOMETRY 和 GEOGRAPHY 数据类型用于 ADO.NET

GEOMETRY 和 GEOGRAPHY 数据类型受 LONG VARBINARY 原生类型支持, ADO.NET 客户端应用程序将其视为二进制数据。但是, 这些数据类型的格式是 SeaSQL EDW 所特有的。要在 C# 应用程序中操作此数据,必须使用 SeaSQL EDW中可将其转换为识别的格式的函数。

要将 WKT 或 WKB 转换为 GEOMETRY 或 GEOGRAPHY 格式, 请使用以下 SQL函数之一:

·     ST_GeographyFromText—将 WKT 转换为 GEOGRAPHY 类型。

·     ST_GeographyFromWKB—将 WKB 转换为 GEOGRAPHY 类型。

·     ST_GeomFromText—将 WKT 转换为 GEOMETRY 类型。

·     ST_GeomFromWKB—将 WKB 转换为 GEOMETRY 类型。

要将 GEOMETRY 或 GEOGRAPHY 对象转换为其对应的 WKT 或 WKB, 请使用以下 SQL 函数之一:

·     ST_AsText—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKT, 返回LONGVARCHAR。

·     ST_AsBinary—将 GEOMETRY 或 GEOGRAPHY 对象转换为 WKB, 返回 LONG VARBINARY。

以下 C# 代码示例使用 ST_GeomFromText 将 WKT 数据转换为 GEOMETRY 数据, 然后将其存储在表中。之后,此示例从该表中检索 GEOMETRY 数据,并使用 ST_AsText 和 ST_AsBinary 将它转换为 WKT 和 WKB 格式。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using Vertica.Data.VerticaClient;

namespace ConsoleApplication

{

    class Program

    {

        static void Main(string[] args)

        {

            VerticaConnectionStringBuilder builder =

                             new VerticaConnectionStringBuilder();

            builder.Host = "VerticaHost";

            builder.Database = "VMart";

            builder.User = "ExampleUser";

            builder.Password = "password123";

            VerticaConnection _conn = new

                              VerticaConnection(builder.ToString());

            _conn.Open();

           

            VerticaCommand command = _conn.CreateCommand();

            command.CommandText = "DROP TABLE IF EXISTS polygons";

            command.ExecuteNonQuery();

            command.CommandText =

              "CREATE TABLE polygons (id INTEGER PRIMARY KEY, poly GEOMETRY)";

            command.ExecuteNonQuery();

            // Prepare to insert a polygon using a prepared statement. Use the

            // ST_GeomFromtText SQl function to convert from WKT to GEOMETRY.

            VerticaTransaction txn = _conn.BeginTransaction();

            command.CommandText =

             "INSERT into polygons VALUES(@id, ST_GeomFromText(@polygon))";

            command.Parameters.Add(new

                           VerticaParameter("id", VerticaType.BigInt));

            command.Parameters.Add(new

                           VerticaParameter("polygon", VerticaType.VarChar));

            command.Prepare();

            // Set the values for the parameters

            command.Parameters["id"].Value = 0;

            //

            command.Parameters["polygon"].Value =

                               "polygon((1 1, 1 2, 2 2, 2 1, 1 1))";

            // Execute the query to insert the value

            command.ExecuteNonQuery();

           

            // Now query the table

            VerticaCommand query = _conn.CreateCommand();

            query.CommandText =

               "SELECT id, ST_AsText(poly), ST_AsBinary(poly) FROM polygons;";

            VerticaDataReader dr = query.ExecuteReader();

            while (dr.Read())

            {

                Console.WriteLine("ID: " + dr[0]);

                Console.WriteLine("Polygon WKT format data type: "

                    + dr.GetDataTypeName(1) +

                    " Value: " + dr[1]);

                // Get the WKB format of the polygon and print it out as hex.

                Console.Write("Polygon WKB format data type: "

                               + dr.GetDataTypeName(2));

                Console.WriteLine(" Value: "

                               + BitConverter.ToString((byte[])dr[2]));               

            }

            _conn.Close();

        }

    }

}

该示例代码在系统控制台上输出以下内容:

ID: 0

Polygon WKT format data type: LONG VARCHAR Value: POLYGON ((1 1, 1 2,

2 2, 2 1,1 1))

Polygon WKB format data type: LONG VARBINARY Value: 01-03-00-00-00-01

-00-00-00-05-00-00-00-00-00-00-00-00-00-F0-3F-00-00-00-00-00-00-F0-3F

-00-00-00-00-00-00-F0-3F-00-00-00-00-00-00-00-40-00-00-00-00-00-00-00

-40-00-00-00-00-00-00-00-40-00-00-00-00-00-00-00-40-00-00-00-00-00-00

-F0-3F-00-00-00-00-00-00-F0-3F-00-00-00-00-00-00-F0-3F

4.17  空间类

SeaSQL EDW 地理空间支持 OGC 标准中定义的多个对象类。

4.17.1  Point

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

·     X 和 Y 坐标

·     经度和纬度值

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

1. 示例

下面的示例使用 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)

4.17.2  Multipoint

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

1. 示例

下面的示例使用 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)

4.17.3  Linestring

由连续点对标识的一个或多个连接的线。线串的维度为 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)

4.17.4  Multilinestring

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

以下是线串集合的示例:

 

 

1. 示例

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

=> 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)

4.17.5  Polygon

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

 

1. 示例

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

=> 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)

4.17.6  Multipolygon

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

 

1. 示例

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

=> 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)

4.18  空间对象表示方法

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

·     熟知文本 (WKT)

·     熟知二进制 (WKB)

4.18.1  熟知文本 (WKT)

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

WKT 不区分大小写; SeaSQL EDW 可识别小写字母和大写字母的任意组合。以下是一些有效的 WKT 示例:

WKT 示例

描述

POINT(1 2)

点 (1,2)

MULTIPOINT(0 0,1 1)

由点 (0,0) 和 (1,1) 组成的集合

LINESTRING(1.5 2.45,3.21 4)

从点 (1.5,2.45) 到点 (3.21,4) 的直线

MULTILINESTRING((0 0,–1 –

2,–3 –4),(2 3,3 4,6 7))

两个线串, 一个穿过 (0,0)、(–1,–2) 和 (–3,–4), 另一个穿过 (2,3)、(3,4) 和 (6,7)

POLYGON((1 2,1 4,3 4,3 2,1 2))

四个角分别表示为 (1,2)、(1,4)、(3,4) 和 (3,2) 的矩形。多边形必须是封闭的, 因此 WKT 中的第一个点和最后一个点必须匹配

POLYGON((0.5 0.5,5 0,5 5,0

5,0.5 0.5), (1.5 1,4 3,4 1,1.5 1))

其中有一个孔 (1.5 1,4 3,4 1,1.5 1) 的多边形

 (0.50.5,5 0,5 5,0 5,0.5 0.5)

MULTIPOLYGON(((0 1,3 0,4 3,0 4,0 1)), ((3 4,6 3,5 5,3 4)), ((0

0,–1 –2,–3 –2,–2 –1,0 0)))

三个多边形的集合

GEOMETRYCOLLECTION (POINT(5 8), LINESTRING(–1

3,1 4))

包含点 (5,8) 和从 (–1,3) 到 (1,4) 的直线的集合

POINT EMPTY MULTIPOINT EMPTY LINESTRING EMPTY MULTILINESTRING EMPTY

MULTILINESTRING(EMPTY) POLYGON EMPTY POLYGON(EMPTY) MULTIPOLYGON EMPTY

MULTIPOLYGON(EMPTY)

空的空间对象; 空对象不包含任何点

 

无效的 WKT:

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

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

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

4.18.2  熟知二进制 (WKB)

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

4.19  空间定义

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

·     空间对象的特征

·     空间对象之间存在的关系

SeaSQL EDW 地理空间提供了用于测试和分析以下属性和关系的函数。

1. 边界 (Boundary)

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

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

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

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

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

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

2. 缓冲区 (Buffer)

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

正缓冲区:

 

负缓冲区:

 

3. 包含 (Contains)

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

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

4. 凸包 (Convex Hull)

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

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

 

5. 交叉 (Crosses)

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

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

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

 

6. 非连续 (Disjoint)

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

7. 包络 (Envelope)

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

以下多边形的包络呈现为下图中的虚线。

 

8. 相等 (Equals)

如果两个空间对象的坐标完全匹配, 则二者相等。与空间上等效同义。在确定空间等价关系时点的顺序不重要:

·     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))。

9. 外部 (Exterior)

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

10. GeometryCollection

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

11. 内部 (Interior)

点集被包含在空间对象中, 除了其边界。

12. 交集 (Intersection)

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

 

 

13. 重叠 (Overlaps)

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

14. 相关 (Relates)

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

DE-9IM 模式矩阵字符标识了两个空间对象彼此在空间上的相关性。

15. 简单 (Simple)

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

16. 余集 (Symmetric Difference)

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

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

 

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

 

17. 并集 (Union)

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

 

18. 有效性 (Validity)

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

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

·     其边界是一组线串。

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

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

有效的多边形:

 

无效的多边形:

 

19. 范围内 (Within)

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

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

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

 

4.20  地理空间使用限制

SeaSQL EDW 地理空间具有以下限制:

·     必须在版本一致的 SeaSQL EDW 分析型数据库服务器上运行SeaSQL EDW 地理空间。

·     在没有重新平衡群集之前,不能访问新添加的节点上的空间索引。

4.20.1  空间数据类型支持限制

SeaSQL EDW不是所有类型的 GEOMETRY 和 GEOGRAPHY 对象都支持。球面几何通常比欧式几何更复杂。因此,支持 GEOGRAPHY 数据类型的空间函数较少。

空间数据类型支持的局限性:

·     非 WGS84 GEOGRAPHY 对象是在半径为 6371 千米的理想球体的表面定义的空间对象。这个球体接近地球的形状。其他空间程序可能使用椭圆对地球进行建模,从而产生略微不同的数据。

·     在创建后,无法修改 GEOMETRY 或 GEOGRAPHY 列的大小或数据类型。

·     无法向包含另一个 SeaSQL EDW 数据库的空间数据的表导入数据或从中导出数据。

·     只能将 STV_Intersect 函数与点和多边形配合使用。

·     不支持类型为 GEOMETRYCOLLECTION 的 GEOGRAPHY 对象。

·     经度值必须介于 -180 和 +180 度之间。纬度值必须介于 –90 和 +90 度之间。SeaSQL EDW 地理空间函数不验证这些值。

·     GEOMETRYCOLLECTION 对象不能包含空对象。例如,不能指定GEOMETRYCOLLECTION (LINESTRING(1 2, 3 4), POINT(5 6) 或    POINT EMPTY)。

·     如果将 NULL 几何传递给空间函数, 该函数将返回 NULL, 除非另有说明。NULL 结果没有值。

·     Polymorphic 函数(例如 NVL 和 GREATEST)不接受 GEOMETRY 和 GEOGRAPHY实参。

不同款型规格的资料略有差异, 详细信息请向具体销售和400咨询。H3C保留在没有任何通知或提示的情况下对资料内容进行修改的权利!

新华三官网
联系我们