从熟知文本或熟知二进制数据中生成的 ST_Geometry
在 Oracle 中将几何转换为 ST_Geometry 类型
下面介绍了空间数据格式以及在这些格式与 Oracle 的空间数据类型之间进行转换的方法。
OGC 熟知文本表示
熟知文本 (WKT) 表示带格式的 ASCII 文本字符串,该字符串可将几何转换成 ASCII 文本格式。可在第三代或第四代语言(3GL 或 4GL)程序中使用这些函数,因为这些函数无需定义任何专门的程序结构。
空间类型中有几个函数可从文本描述中生成几何。其中包括以下函数:
- ST_GeomFromText:从任何几何类型 的 WKT 表示创建 ST_Geometry
- ST_PointFromText:从点 WKT 表示创建 ST_Point
- ST_LineFromText:从线串 WKT 表示创建 ST_LineString
- ST_PolyFromText:从面 WKT 表示创建 ST_Polygon
- ST_MPointFromText:从多点 WKT 表示创建 ST_MultiPoint
- ST_MLineFromText:从多线串 WKT 表示创建 ST_MultiLineString
- ST_MPolyFromText:从多面 WKT 表示创建 ST_MultiPolygon
ST_AsText 函数可将现有几何转换为 WKT 表示。
在 C 程序中使用熟知文本表示
几何的 WKT 表示可与 C 程序兼容。以下定义了类似于这种实现的结构。记号 {}* 表示大括号内的令牌不存在或重复多次。大括号不在输出令牌列表中出现。
<Geometry Tagged Text> :=
| <Point Tagged Text>
| <LineString Tagged Text>
| <Polygon Tagged Text>
| <MultiPoint Tagged Text>
| <MultiLineString Tagged Text>
| <MultiPolygon Tagged Text>
<Point Tagged Text> :=
POINT <Point Text>
<LineString Tagged Text> :=
LINESTRING <LineString Text>
<Polygon Tagged Text> :=
POLYGON <Polygon Text>
<MultiPoint Tagged Text> :=
MULTIPOINT <Multipoint Text>
<MultiLineString Tagged Text> :=
MULTILINESTRING <MultiLineString Text>
<MultiPolygon Tagged Text> :=
MULTIPOLYGON <MultiPolygon Text>
<Point Text> := EMPTY
| <Point>
| Z <PointZ>
| M <PointM>
| ZM <PointZM>
<Point> := <x> <y>
<x> := double precision literal
<y> := double precision literal
<PointZ> := <x> <y> <z>
<x> := double precision literal
<y> := double precision literal
<z> := double precision literal
<PointM> := <x> <y> <m>
<x> := double precision literal
<y> := double precision literal
<m> := double precision literal
<PointZM> := <x> <y> <z> <m>
<x> := double precision literal
<y> := double precision literal
<z> := double precision literal
<m> := double precision literal
<LineString Text> := EMPTY
| ( <Point Text > {, <Point Text> }* )
| Z ( <PointZ Text > {, <PointZ Text> }* )
| M ( <PointM Text > {, <PointM Text> }* )
| ZM ( <PointZM Text > {, <PointZM Text> }* )
<Polygon Text> := EMPTY
| ( <LineString Text > {,< LineString Text > }*)
<Multipoint Text> := EMPTY
| ( <Point Text > {, <Point Text > }* )
<MultiLineString Text> := EMPTY
| ( <LineString Text > {,< LineString Text>}* )
<MultiPolygon Text> := EMPTY
| ( < Polygon Text > {, < Polygon Text > }* )
在 SQL 编辑器中使用熟知文本表示
由于熟知文本表示是文本,因此可方便地输入至 SQL 脚本或直接输入至 SQL 编辑器。通过某个函数可将此文本转换为几何,也可将几何转换为此文本。将文本转换为几何的函数使用如下语法:
function ('<text description>',<SRID>)
例如:
ST_PointFromText('point zm(10.01 20.04 3.2 9.5)', 1)
空间参考标识符 (SRID) - ST_SPATIAL_REFERENCES 表的主键,可识别某个 Oracle 实例内的可能空间参考系统。SRID 在其创建时已被指定给空间列。在将几何插入某列空间列之前,该几何的 SRID 必须与此空间列的 SRID 相匹配。
文本描述由三个基本部分(外括一对单引号)构成:
'<geometry type> [coordinate type] [coordinate list]'
geometry type 可定义为以下其中一项:点、线串、面、多点、多线串或多面。
coordinate type 用于指定几何是否具有 z 坐标和/或度量值。如果几何中既无 z 坐标也无度量值,则将此参数留为空;否则,若几何中包含 z 坐标,则将 coordinate type 设置为 Z;若包含度量值,则设置为 M;若两者均包含,则设置为 ZM。
coordinate list 用于定义几何的双精度折点。坐标列表由逗号分隔,外括圆括号。具有多个组成部分的几何需要多组括号来括入每个组成部分。若几何为空,则 EMPTY 关键字将替代坐标。
以下示例完整地列出了文本表示的文本描述部分的所有可能排列:
几何类型 |
文本描述 |
注释 |
---|---|---|
ST_Point |
'point empty' |
空点 |
ST_Point |
'point z empty' |
带 z 坐标的空点 |
ST_Point |
'point m empty' |
带度量值的空点 |
ST_Point |
'point zm empty' |
带 z 坐标与度量值的空点 |
ST_Point |
'point ( 10.05 10.28 )' |
Point |
ST_Point |
'point z( 10.05 10.28 2.51 )' |
带 z 坐标的点 |
ST_Point |
'point m( 10.05 10.28 4.72 )' |
带度量值的点 |
ST_Point |
'point zm(10.05 10.28 2.51 4.72 )' |
带 z 坐标与度量值的点 |
ST_LineString |
'linestring empty' |
空线串 |
ST_LineString |
'linestring z empty' |
带 z 坐标的空线串 |
ST_LineString |
'linestring m empty' |
带度量值的空线串 |
ST_LineString |
'linestring zm empty' |
带 z 坐标与度量值的空线串 |
ST_LineString |
'linestring (10.05 10.28 , 20.95 20.89 )' |
线串 |
ST_LineString |
'linestring z(10.05 10.28 3.09, 20.95 31.98 4.72, 21.98 29.80 3.51 )' |
带 z 坐标的线串 |
ST_LineString |
'linestring m(10.05 10.28 5.84, 20.95 31.98 9.01, 21.98 29.80 12.84 )' |
带度量值的线串 |
ST_LineString |
'linestring zm(10.05 10.28 3.09 5.84, 20.95 31.98 4.72 9.01, 21.98 29.80 3.51 12.84)' |
带 z 坐标与度量值的线串 |
ST_Polygon |
'polygon empty' |
空面 |
ST_Polygon |
'polygon z empty' |
带 z 坐标的空面 |
ST_Polygon |
'polygon m empty' |
带度量值的空面 |
ST_Polygon |
'polygon zm empty' |
带 z 坐标与度量值的空面 |
ST_Polygon |
'polygon ((10 10, 10 20, 20 20, 20 15, 10 10))' |
面 |
ST_Polygon |
'polygon z((10 10 3, 10 20 3, 20 20 3, 20 15 4, 10 10 3))' |
带 z 坐标的面 |
ST_Polygon |
'polygon m((10 10 8, 10 20 9, 20 20 9, 20 15 9, 10 10 8 ))' |
带度量值的面 |
ST_Polygon |
'polygon zm((10 10 3 8, 10 20 3 9, 20 20 3 9, 20 15 4 9, 10 10 3 8 ))' |
带 z 坐标与度量值的面 |
ST_MultiPoint |
'multipoint empty' |
空多点 |
ST_MultiPoint |
'multipoint z empty' |
带 z 坐标的空多点 |
ST_MultiPoint |
'multipoint m empty' |
带度量值的空多点 |
ST_MultiPoint |
'multipoint zm empty' |
带 z 坐标与度量值的空多点 |
ST_MultiPoint |
'multipoint (10 10, 20 20)' |
包含两个点的多点 |
ST_MultiPoint |
'multipoint z(10 10 2, 20 20 3)' |
带 z 坐标的多点 |
ST_MultiPoint |
'multipoint m(10 10 4, 20 20 5)' |
带度量值的多点 |
ST_MultiPoint |
'multipoint zm(10 10 2 4, 20 20 3 5)' |
带 z 坐标与度量值的多点 |
ST_MultiLineString |
'multilinestring empty' |
空多线串 |
ST_MultiLineString |
'multilinestring z empty' |
带 z 坐标的空多线串 |
ST_MultiLineString |
'multilinestring m empty' |
带度量值的空多线串 |
ST_MultiLineString |
'multilinestring zm empty' |
带 z 坐标与度量值的空多线串 |
ST_MultiLineString |
'multilinestring ((10.05 10.28 , 20.95 20.89 ),( 20.95 20.89, 31.92 21.45))' |
多线串 |
ST_MultiLineString |
'multilinestring z((10.05 10.28 3.4, 20.95 20.89 4.5),( 20.95 20.89 4.5, 31.92 21.45 3.6))' |
带 z 坐标的多线串 |
ST_MultiLineString |
'multilinestring m((10.05 10.28 8.4, 20.95 20.89 9.5), (20.95 20.89 9.5, 31.92 21.45 8.6))' |
带度量值的多线串 |
ST_MultiLineString |
'multilinestring zm((10.05 10.28 3.4 8.4, 20.95 20.89 4.5 9.5), (20.95 20.89 4.5 9.5, 31.92 21.45 3.6 8.6))' |
带 z 坐标与度量值的多线串 |
ST_MultiPolygon |
'multipolygon empty' |
空多面 |
ST_MultiPolygon |
'multipolygon z empty' |
带 z 坐标的空多面 |
ST_MultiPolygon |
'multipolygon m empty' |
带度量值的空多面 |
ST_MultiPolygon |
'multipolygon zm empty' |
空 |
ST_MultiPolygon |
'multipolygon (((10 10, 10 20, 20 20, 20 15 , 10 10)), ((50 40, 50 50, 60 50, 60 40, 50 40)))' |
多面 |
ST_MultiPolygon |
'multipolygon z(((10 10 7, 10 20 8, 20 20 7, 20 15 5, 10 10 7)), ((50 40 6, 50 50 6, 60 50 5, 60 40 6, 50 40 6)))' |
带 z 坐标的多面 |
ST_MultiPolygon |
'multipolygon m(((10 10 2, 10 20 3, 20 20 4, 20 15 5, 10 10 2)), ((50 40 7, 50 50 3, 60 50 4, 60 40 5, 50 40 7)))' |
带度量值的多面 |
ST_MultiPolygon |
'multipolygon zm(((10 10 7 2, 10 20 8 3, 20 20 7 4, 20 15 5 5, 10 10 7 2)), ((50 40 6 7, 50 50 6 3, 60 50 5 4, 60 40 6 5, 50 40 6 7)))' |
带 z 坐标与度量值的多面 |
OGC 熟知二进制表示
几何的熟知二进制表示是开放地理空间联盟 (OGC) 简单要素规范的一部分,该规范规定了使用 x,y 坐标实现点、线和面要素的简单存储模型。该存储类型将几何值表示为不间断的字节流形式。它允许在 ODBC 客户端与数据库之间以二进制形式交换几何值。并且未进行压缩。
Oracle 的 ST_Geometry 类型中的某些函数能从熟知二进制 (WKB) 表示中生成几何。其中包括以下函数:
- ST_GeomFromWKB:从任何几何类型的 WKB 表示创建 ST_Geometry
- ST_PointFromWKB:从点 WKB 表示创建 ST_Point
- ST_LineFromWKB:从线串 WKB 表示创建 ST_LineString
- ST_PolyFromWKB:从面 WKB 表示创建 ST_Polygon
- ST_MPointFromWKB:从多点 WKB 表示创建 ST_MultiPoint
- ST_MLineFromWKB:从多线串 WKB 表示创建 ST_MultiLineString
- ST_MPolyFromWKB:从多面 WKB 表示创建 ST_MultiPolygon
这些几何函数需要 C 结构的定义来映射二进制表示。这些函数可在 3GL 程序中使用,但不适用于 4GL 环境。
ST_AsBinary 函数可将现有几何值转换为熟知二进制表示。
有关熟知二进制表示的详细信息,请参阅几何的 OGC 熟知二进制表示。