达梦DMGEO空间数据实现

一、空间数据介绍

1、DMGEO 包

DMGEO 系统包实现了 SFA 标准(《OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 2: SQL option》)中规定的 SQL 预定义 schema,基于 SQL UDT(自定义数据类型)的空间数据类型和空间数据类型的初始化,以及针对空间数据类型的几何体计算函数。

2、数据类型

达梦的空间数据类型是以类的方式进行体现的,具体有:
⚫ ST_Geometry:最基本的几何体,是其他几何类型的基类
⚫ ST_Point:点几何体
⚫ ST_Curve,ST_LineString:线几何体。ST_Curve 是抽象类,ST_LineString是 ST_Curve 可实例化的子类
⚫ ST_Surface,ST_Polygon:面几何体。ST_Surface 是抽象类,ST_Polygon是 ST_Surface 可实例化的子类
⚫ ST_GeomCollection:几何体集合
⚫ ST_Multipoint:点集合
⚫ ST_Multicurve,ST_Multilinestring:线集合。ST_Multicurve 是抽象类,ST_Multilinestring 是 ST_Multicurve 可实例化的子类
⚫ ST_Multisurface,ST_Multipolygon:多边形集合。ST_Multisurface 是抽象类,ST_Multipolygon 是 ST_Multisurface 可实例化的子类
达梦的空间数据类型主要是以类的形式来使用

二、如何使用

1、用户在使用DMGEO包之前,需要提前调用系统过程SP_INIT_GEO_SYS(1)创建DMGEO包,包创建成功后就可以使用空间数据类型以及包提供的方法。
SP_INIT_GEO_SYS(1);
2、如果 dmgeo 包已存在,调用 SP_INIT_GEO_SYS(2),系统将只重建 dmgeo 包方法,而不影响现有的空间数据类型以及数据。
SP_INIT_GEO_SYS(2);
3、调用系统过程 SP_INIT_GEO_SYS(0)可以删除 DMGEO 包,任何与空间数据类型相关的表、函数、过程、触发器等对象均会被级联删除。
SP_INIT_GEO_SYS(0);

三、基本方法介绍

1、构造函数

① ST_GeomFromText
根据 wkt 信息和 srid 信息构造空间数据基础类。
语法如下:
FUNCTION ST_GEOMFROMTEXT(
WKT CLOB,
SRID INT
)RETURN ST_GEOMETRY;
参数详解
⚫ wkt 几何对象文本描述信息。
⚫ srid 空间参考坐标系 ID。
② ST_PointFromText
根据 wkt 信息和 srid 信息构造点类。
语法如下:
FUNCTION ST_POINTFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_POINT;
参数详解
⚫ wkt 几何对象文本描述信息。
⚫ srid 空间参考坐标系 ID。
举例说明
dmgeo.ST_PointFromText(‘point empty’ , 0); //空对象
dmgeo.ST_PointFromText(‘point (1 1)’ , 0);
③ ST_LineFromText
根据 wkt 信息和 srid 信息构造线类。
语法如下:
FUNCTION ST_LINEFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_LINESTRING;
参数详解
⚫ wkt 几何对象文本描述信息。 ⚫ srid 空间参考坐标系 ID。
举例说明
dmgeo.ST_LineFromText(‘linestring empty’ , 0); //空对象
dmgeo.ST_LineFromText(‘linestring (1 1, 2 2)’ , 0);
④ ST_PolyFromText
根据 wkt 信息和 srid 信息构造面类。
语法如下:
FUNCTION ST_POLYFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_POLYGON;
参数详解
⚫ wkt 几何对象文本描述信息。 ⚫ srid 空间参考坐标系 ID。
举例说明
dmgeo.ST_PolyFromText(‘polygon empty’ , 0); //空对象
dmgeo.ST_PolyFromText(‘polygon ((1 1, 1 2, 2 2, 2 1, 1 1))’, 0);

2、关系判断函数

① ST_INTERSECTS
判断两个几何对象是否相交。
语法如下:
FUNCTION ST_INTERSECTS (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
参数详解
⚫ g1 几何对象。 ⚫ g2 几何对象。
返回值
0:两个几何对象不相交;1:两个几何对象相交。
其余的还有
达梦数据库空间关系
ST_Equals
判断两个几何对象是否相同。
ST_DISJOINT
判断两个几何对象是否不相交。
ST_INTERSECTS
判断两个几何对象是否相交。
ST_TOUCHES
判断两个几何对象是否接触,即存在边界点相同,内节点不相交。
ST_CROSSES
判断两个几何对象是否交叉,存在相同的点,但不是完全一致。
ST_WITHIN
判断对象是否完全包含,对象g1是否完全在g2的内部。
ST_CONTAINS
判断对象是否包含,g2不存在点在g1的外边界,且至少存在一个g2的内节点在g1内部。
ST_OVERLAPS
判断两个几何对象是存在重叠,但并不被对方完全包含。
ST_RELATE
判断两个几何对象是否满足DE-9IM字符串关系。
3、几何运算函数
ST_Distance
获取几何对象间的最短距离。
ST_Intersection
获取几何对象的交集。
ST_Difference
获取几何对象的差集。
ST_Union
获取几何对象的并集。
ST_SymDifference
获取几何对象的差异集。
ST_Buffer
获取代替几何对象g1的几何对象,其到g1的距离小于等于d。
ST_ConvexHull
获取几何对象凸壳。

四、相交关系判断简单示例

1、点面相交

在sql命令输入区输入以下语句,创建一个表,字段为空间数据类型(点)

create table testgeo(a SYSGEO.ST_POINT);

在sql命令输入区输入以下语句,向表中插入5条点空间数据:

insert into test values(dmgeo.ST_PointFromText('point (110 50)' , 0));
insert into test values(dmgeo.ST_PointFromText('point (120 40)' , 0));
insert into test values(dmgeo.ST_PointFromText('point (115 45)' , 0));
insert into test values(dmgeo.ST_PointFromText('point (30 40)' , 0));
insert into test values(dmgeo.ST_PointFromText('point (200 40)' , 0));
commit; 
select * from test where dmgeo.ST_INTERSECTS(a,
dmgeo.st_geomfromtext('polygon ((110 40, 110 50, 120 50, 120 40,110 40))', 0));

2、线面相交

在sql命令输入区输入以下语句,创建一个表,字段为空间数据类型(线)

CREATE TABLE "SYSDBA"."TESTACG"
(
"A" "SYSGEO"."ST_LINESTRING") STORAGE(ON "MAIN", CLUSTERBTR) ;

在sql命令输入区输入以下语句,向表中插入3条线空间数据:

INSERT INTO TESTACG VALUES (dmgeo.ST_LineFromText('linestring (1 1, 2 2)' , 0)) ;

INSERT INTO TESTACG VALUES (dmgeo.ST_LineFromText('linestring (2 2, 3 3)' , 0)) ;

INSERT INTO TESTACG VALUES (dmgeo.ST_LineFromText('linestring (1 1, 3 2)' , 0)) ;

commit; 
SELECT * FROM TESTACG WHERE DMGEO.ST_INTERSECTS(A,DMGEO.ST_GEOMFROMTEXT('POLYGON((0 0,2 0,2 4,0 4,0 0))',0));

3、点线相交

在sql命令输入区输入以下语句,创建一个表,字段为空间数据类型(点)

CREATE TABLE "SYSDBA"."TESTGEO"
(
"A" "SYSGEO"."ST_POINT") STORAGE(ON "MAIN", CLUSTERBTR) ;

在sql命令输入区输入以下语句,向表中插入3条点空间数据:

INSERT INTO TESTGEO VALUES (dmgeo.ST_POINTFromText('POINT (1 1)' , 0)) ;

INSERT INTO TESTGEO VALUES (dmgeo.ST_POINTFromText('POINT (2 2)' , 0)) ;

INSERT INTO TESTGEO VALUES (dmgeo.ST_POINTFromText('POINT (2 3)' , 0)) ;

commit;
SELECT * FROM TESTGEO WHERE DMGEO.ST_INTERSECTS(A,DMGEO.ST_GEOMFROMTEXT('LineString(0 0,6 6)',0));
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值