Oracle矢量数据类型ST_Geometry


一、简介

    ArcSDE for Oracle 提供了 ST_Geometry 类型来存储几何数据。 ST_Geometry 是一种遵循 ISO 和 OGC 规范的,可以通过 SQL 直接读取的空间信 息存储类型。采用这种存储方式能够更好的利用 oracle 的资源,更好的兼容 oracle 的特征,比如复制和分区,并且能够更快的读取空间数据。使用 ST_Geometry 存储空间数据,可以把业务数据和空间数据存储到一张表中(使用 SDENBLOB 方式业务数据和空间数据是分开存储在 B 表和 F 表中 的),因此可以很方便的在业务数据中增加空间数据(只需要在业务表中增加ST_Geometry 列)。使用这种存储方式还能够简化多用户的读取,管理 ( 只 需要管理一张表 ) 。

    从 ArcGIS 9.3 开始,新的 ArcSDE geodatabases for Oracle 会默认使用 ST_Geometry 方式来存储空间数据。它实现了 SQL3 规范中的用户自定义类型( user-defined data types ),允许用户使用 ST_Geometry 类型创建列来存储诸如界址点,街道,地块等空间数据。

  二、存储结构

ST_Geometry 存储空间数据的结构如下表:

Name    Type

ENTITY NUMBER(38)

NUMPTS NUMBER(38)

MINX     FLOAT(64)

MINY FLOAT(64)

MAXX FLOAT(64)

MAXY FLOAT(64)

MINZ FLOAT(64)

MAXZ FLOAT(64)

MINM FLOAT(64)

MAXM FLOAT(64)

AREA FLOAT(64)

LEN FLOAT(64)

SRID NUMBER(38)

POINTS BLOB

Entity 为要素类型,包括 (linestring, multilinestring, multipoint, multipolygon, point, or polygon )。具体的值对应的类型可以通过st_geom_util 存储过程获得。 NUMPTS 为坐标点的个数

Minx, miny, maxx, maxy 几何的外包络矩形

Area 几何的面积

Len 几何的周长

SRID 空间参考系 ID ,对应 ST_Spatial_References 表中的空间参考信息

POINTS 坐标序列

三、操作函数

    下面是一些针对 ST_Geometry 进行操作的函数,输入为 ST_Geometry 类型数据,输出为 Number 型数据、

ST_Area 返回几何的面积。

ST_Len 返回几何的周长。

ST_Entity 返回几何类型 .

ST_NumPoints 返回几何坐标点的个数 .

ST_MinM, ST_MinX, ST_MinY, ST_MinZ 返回几何不同维度的最小坐标 . ST_MaxM, ST_MaxX, ST_MaxY, ST_MaxZ 返回几何不同维度的最大坐标 . ST_SRID 返回空间参考系 ID.

Get_release 返回版本信息 .

如下面例子,在 us_states 表中查找所有 state 的名字并计算 state 的面积。

SELECT name, st_area(geometry)

FROM us_states

ORDER BY name;

四、构造 ST_Geometry 对象

    ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point, and ST_Polygon 全部是 ST_Geometry 的子类 . ST_Geometry 和他的子类共享属性和方法 . ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point and ST_Polygon 的构造函数的定义是相同的,构造函数的名字就是类型名。

    ST_Point 是个有限对象(只有一个点),因此可以使用下面的方法来构造。

1 ,使用 xy 坐标和 SRID 来构造 ST_Point

1 ,使用 xy 坐标和 SRID 来构造 ST_Point

METHOD

FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT

Argument Name                  Type                    In/Out Default?

PT_X                           NUMBER                  IN

PT_Y                           NUMBER                  IN

SRID                           NUMBER                  IN

SQL> insert into sample_pt values (ST_Point (10, 20, 1) );

2 ,使用 xy 坐标、高程值( z )和 SRID 来构造 ST_Point

METHOD

FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT

Argument Name                  Type                    In/Out Default?

PT_X                           NUMBER                  IN

PT_Y                           NUMBER                  IN

PT_Z                           NUMBER                  IN

SRID                           NUMBER                  IN

SQL> insert into sample_pt values (ST_Point (10, 20, 5, 1) );

3 ,使用 xy 坐标、高程值( z ),量测值( m )和 SRID 来构造 ST_Point

METHOD

FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT

Argument Name                  Type                    In/Out Default?

PT_X                           NUMBER                  IN

PT_Y                           NUMBER                  IN

PT_Z                           NUMBER                  IN

MEASURE                        NUMBER                  IN

SRID                           NUMBER                  IN

SQL> insert into sample_pt values (ST_Point (10, 20, 5, 401, 1) );

五 、 用户权限限制   

 

 

在 oracle 使用 ST_Geometry ,用户必须有以下权限:

CREATE TYPE

UNLIMITED TABLESPACE

CREATE LIBRARY

CREATE OPERATOR

CREATE INDEXTYPE

CREATE PUBLIC SYNONYM

DROP PUBLIC SYNONYM

The CONNECT and RESOURCE roles include these privileges.

六、 st_geometry 操作实例

这是 Oracle 数据中与矢量数据相关的类型。设置字段类型格式为 sde.st_geometry 。

下面我就例子来讨论它的用途:

首先创建一个表 geoms

Create table geoms (id integer, geometry sde.st_geometry);

然后向里面插入数据:

INSERT INTO geoms (id, geometry) VALUES (

1901,

sde.st_geometry ('point (1 2)', 0)

);  

INSERT INTO geoms (id, geometry) VALUES (

1902,

sde.st_geometry ('linestring (33 2, 34 3, 35 6)', 0)

);  

INSERT INTO geoms (id, geometry) VALUES (

1903,

sde.st_geometry ('polygon ((3 3, 4 6, 5 3, 3 3))', 0)

);

查询:

SELECT id, sde.st_astext (geometry) geometry FROM geoms;

七、st_geometrytype

返回 geometry 的类型。

sde.st_geometrytype (g1 sde.st_geometry)

Varchar(32) 包含下面其中之了:

  • ST_Point
  • ST_LineString
  • ST_Polygon
  • ST_MultiPoint
  • ST_MultiLineString
  • ST_MultiPolygon

举例:

先构建表和插入数据

CREATE TABLE geometrytype_test (g1 sde.st_geometry);  

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('point (10.02 20.01)', 0)

);  

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('linestring (10.01 20.01, 10.01 30.01, 10.01 40.01)', 0)

);

 

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('polygon ((10.02 20.01, 11.92 35.64, 25.02 34.15,

19.15 33.94, 10.02 20.01))', 0)

); 

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('multipoint (10.02 20.01, 10.32 23.98, 11.92 25.64)', 0)

);  

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('multilinestring ((10.02 20.01, 10.32 23.98,

11.92 25.64), (9.55 23.75, 15.36 30.11))', 0)

);  

INSERT INTO geometrytype_test VALUES (

sde.st_geomfromtext ('multipolygon (((10.02 20.01, 11.92 35.64, 25.02 34.15,

19.15 33.94, 10.02 20.01)), ((51.71 21.73, 73.36 27.04, 71.52 32.87, 52.43 31.90,51.71 21.73)))', 0)

);

然后从表中查询数据

SELECT UPPER (sde.st_geometrytype (g1)) Geometry_type FROM geometrytype_test;

结果 为

Geometry_type
ST_POINT ST_LINESTRING ST_POLYGON ST_MULTIPOINT ST_MULTILINESTRING ST_MULTIPOLYGON

八、 ST_GeomFromText

sde.st_geomfromtext (wkt clob, srid integer)

返回 ST_Geometry

举例

创建表与插入数据

CREATE TABLE geometry_test (gid smallint unique, g1 sde.st_geometry); 

INSERT INTO geometry_test VALUES (

1,

sde.st_geomfromtext ('point (10.02 20.01)', 0)

); 

INSERT INTO geometry_test VALUES (

2,

sde.st_geomfromtext('linestring (10.01 20.01, 10.01 30.01, 10.01 40.01)', 0)

);  

INSERT INTO geometry_test VALUES (

3,

sde.st_geomfromtext('polygon ((10.02 20.01, 11.92 35.64, 25.02 34.15,

19.15 33.94, 10.02 20.01))', 0)

); 

INSERT INTO geometry_test VALUES (

4,

sde.st_geomfromtext('multipoint (10.02 20.01, 10.32 23.98, 11.92 25.64)', 0)

); 

INSERT INTO geometry_test VALUES (

5,

sde.st_geomfromtext ('multilinestring ((10.02 20.01, 10.32 23.98,

11.92 25.64), (9.55 23.75, 15.36 30.11))', 0)

);

 

INSERT INTO geometry_test VALUES (

6,

sde.st_geomfromtext ('multipolygon (((10.02 20.01, 11.92 35.64,

25.02 34.15, 19.15 33.94, 10.02 20.01), (51.71 21.73, 73.36 27.04,

71.52 32.87, 52.43 31.90, 51.71 21.73)))', 0)

);

查询
SELECT sde.st_astext(g1)  FROM geometry_test; 

九、 ST_MinX

 

 ST_MinY 、 ST_MinZ 等同。

返回最小X 坐标。

sde.st_minx (g1 sde.st_geometry)

举例

创建表

CREATE TABLE minx_test (id integer, geometry sde.st_geometry);
插入数据
INSERT INTO minx_test VALUES ( 1901,
sde.st_polygon ('polygon zm((110 120 20 3, 110 140 22 3, 120 130 26 4, 110 120 20 3))', 0)
);
INSERT INTO minx_test VALUES ( 1902, sde.st_polygon ('polygon zm((0 0 40 7, 0 4 35 9, 5 4 32 12, 5 0 31 5, 0 0 40 7))', 0) );
查询 SELECT id, sde.st_minx (geometry) MinX FROM minx_test; 结果
ID       MINX 1901        110 1902          0

你可能感兴趣的:(Oracle矢量数据类型ST_Geometry)