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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值