一、概述
DMGEO 系统包实现了 SFA 标准(《OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 2: SQL option》) 中规定的SQL 预定义 schema,基于 SQL UDT(自定义数据类型)的空间数据类型和空间数据类型的初始化,以及针对空间数据类型的几何体计算函数。
二、相关函数和方法
1.使用前先调用系统过程:SP_INIT_GEO_SYS(1);
如果包已存在可以重建:SP_INIT_GEO_SYS(2);
删除包:SP_INIT_GEO_SYS(0);
2.几何体构造函数
几何体构造函数大体可分为两类:通过 WKT 信息与 SRID 信息构造和通过 WKB 信息与 SRID 信息构造。
2.1 ST_GeomFromText
根据wkt信息和srid信息构造空间数据基础类。
语法:
FUNCTION ST_GEOMFROMTEXT(
WKT CLOB, --几何对象文本描述信息
SRID INT --空间参考坐标系ID
)RETURN ST_GEOMETRY;
2.2 ST_PointFromText
根据wkt信息和srid信息构造点类。
语法:
FUNCTION ST_POINTFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_POINT;
例子:dmgeo.ST_PointFromText('point empty' , 0); //空对象
dmgeo.ST_PointFromText('point (1 1)' , 0);
2.3 ST_LineFromText
根据wkt信息和srid信息构造线类。
语法:
FUNCTION ST_LINEFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_LINESTRING;
例子:dmgeo.ST_LineFromText('linestring (1 1, 2 2)' , 0);
2.4 ST_PolyFromText
根据wkt信息和srid信息构造面类。
语法:
FUNCTION ST_POLYFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_POLYGON;
例子:dmgeo.ST_PolyFromText('polygon ((1 1, 1 2, 2 2, 2 1, 1 1))', 0);
2.5 ST_MPointFromText
根据wkt信息和srid信息构造多点类。
语法:
FUNCTION ST_MPOINTFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_MULTIPOINT;
例子:dmgeo.ST_MPointFromText('multipoint (1 1, 2 2)', 0 );
2.6 ST_MLineFromText
根据wkt信息和srid信息构造多线类。
语法:
FUNCTION ST_MLINEFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_MULTILINESTRING;
例子:dmgeo.ST_MLineFromText('multilinestring ((1 1,2 1),(4 4, 3 3))', 0);
2.7 ST_MPolyFromText
根据wkt信息和srid信息构造多面类。
语法:
FUNCTION ST_MPOLYFROMTEXT (
WKT CLOB,
SRID INT
)RETURN ST_MULTIPOLYGON;
例子:dmgeo.ST_MPolyFromText('multipolygon (((1 1, 1 2, 2 2, 2 1, 1 1)), ((3 3, 3 4, 4 4, 4 3, 3 3)))' , 0);
2.8 ST_GeomFromWKB
根据wkb信息和srid信息构造空间数据基础类对象。
语法:
FUNCTION ST_GEOMFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_GEOMETRY;
2.9 ST_PointFromWKB
根据wkb信息和srid信息构造点类。
语法:
FUNCTION ST_POINTFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_POINT;
2.10 ST_LineFromWKB
根据wkb信息和srid信息构造线类。
语法:
FUNCTION ST_LINEFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_LINESTRING;
2.11 ST_PolyFromWKB
根据wkb信息和srid信息构造面类。
语法:
FUNCTION ST_POLYFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_POLYGON;
2.12 ST_MPointFromWKB
根据wkb信息和srid信息构造多点类。
语法:
FUNCTION ST_MPOINTFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_MULTIPOINT;
2.13 ST_MLineFromWKB
根据wkb信息和srid信息构造多线类。
语法:
FUNCTION ST_MLINEFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_MULTILINESTRING;
2.14 ST_MPolyFromWKB
根据wkb信息和srid信息构造多面类。
语法:
FUNCTION ST_MPOLYFROMWKB (
WKB BLOB,
SRID INT
)RETURN ST_MULTIPOLYGON;
2.15 ST_CreateCircle
根据几何体构造圆/椭圆。根据给定几何体的最左边、最上边、最右边和最下边四个边 界点构建一个方形或矩形,再构建 出该方形或矩形的内切圆或椭圆。
语法:
FUNCTION ST_CREATECIRCLE(
GEO SYSGEO.ST_GEOMETRY,
N INT
) RETURN SYSGEO.ST_GEOMETRY;
说明:GEO几何体对象。
N指定生成圆(椭圆)的坐标个数,给定参数 N将生成 N个坐标点。N个点均匀的排列 在圆或椭圆上。考虑到 POLYGON封闭的特征,给定参数N将生成(N + 1)个点,因为必须 保证POLYGON首尾相连,所以会有一个重复 点。
例子:
构建一个圆。
declare
geo1 st_geometry;
geo3 st_geometry;
begin
geo1 = dmgeo.st_geomfromtext( 'polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4296);
geo3 = dmgeo.ST_CreateCircle(geo1, 6);
select dmgeo.st_astext(geo3, 4);
end;
结果:POLYGON ((10.0000 5.0000, 7.5000 9.3301, 2.5000 9.3301, 0.0000 5.0000, 2.5000 0.6699, 7.5000 0.6699, 10.0000 5.0000))
2.16 ST_CreateArc
根据几何体构建弧线(包括圆弧和椭圆弧)。根据给定几何体的最左边、最上边、最右边 和最下边四个边界点构建一个方形 或矩形,构建出该方形或矩形的内切圆或椭圆。进而根据 起始角度和弧线的跨度在圆或椭圆的基础上构造出弧线。
语法:
FUNCTION ST_CREATEARC(
GEO SYSGEO.ST_GEOMETRY,
N INT,
STARTANG DOUBLE,
ANGEXTENT DOUBLE
) RETURN SYSGEO.ST_GEOMETRY;
例子:构建一个弧线。
declare
geo1 st_geometry;
geo3 st_geometry;
begin
geo1 = dmgeo.st_geomfromtext( 'polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4296);
geo3 = dmgeo.ST_CreateArc(geo1, 6, 0, 1.772);
select dmgeo.st_astext(geo3, 4);
end;
结果:
LINESTRING (10.0000 5.0000, 9.6893 6.7351, 8.7957 8.2546, 7.4304 9.3696, 5.7630 9.9414, 4.0008 9.8991)
2.17 ST_CreateArcPolygon
根据几何体构建扇形(包括椭圆扇形)。根据给定几何体的最左边、最上边、最右边和最下边四个边界点构建一个方形或 矩形,构建出该方形或矩形的内切圆或椭圆。进而根据圆心(椭圆心)和半径,以及指定的起始角度和弧线的跨度在圆 (或椭圆)的基础上构造出扇形。
语法:
FUNCTION ST_CREATEARCPOLYGON(
GEO SYSGEO.ST_GEOMETRY,
N INT,
STARTANG DOUBLE,
ANGEXTENT DOUBLE
) RETURN SYSGEO.ST_GEOMETRY;
说明:
GEO几何体对象。
N 指定生成扇形(包括椭圆扇形)的坐标个数。由于扇形的特殊性质,给定参数 N,将 生成(N + 2)个坐标点,额外的2 个坐标点为圆心点,它作为起始和结束坐标而被重复一次。
STARTANG 表示扇弧形的起始角度。
ANGEXTENT表示扇弧形的跨度,它的取值范围为0~2*Π,不在此范围的取值一律视为 2*Π。
例子:构建一个扇形。
declare
geo1 st_geometry;
geo3 st_geometry;
begin
geo1 = dmgeo.st_geomfromtext( 'polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4296)
geo3 = dmgeo.ST_CreateArcPolygon(geo1, 6, 0, 1.772);
select dmgeo.st_astext(geo3, 4);
end;
结果:
POLYGON ((5.0000 5.0000, 10.0000 5.0000, 9.6893 6.7351, 8.7957 8.2546, 7.4304 9.3696, 5.7630 9.9414, 4.0008 9.8991, 5.0000 5.0000))
2.18 ST_CreateAnnulus
根据两个几何体构建一个圆环。首先,根据给定几何体的最左边、最上边、最右边和最 下边四个边界点构建一个方形,两 个方形的中心一定要求一致;其次,构建出方形的内切圆; 最后,根据两个圆构造出一个圆环。
语法:
FUNCTION ST_CREATEANNULUS(
GEO1 SYSGEO.ST_GEOMETRY,
GEO2 SYSGEO.ST_GEOMETRY,
N INT
) RETURN SYSGEO.ST_GEOMETRY;
例子:构建一个圆环。
declare
geo1 st_geometry;
geo2 st_geometry;
geo3 st_geometry;
begin
geo1 = dmgeo.st_geomfromtext( 'polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4296);
geo2 = dmgeo.st_geomfromtext( 'polygon ((3 3, 3 7, 7 7, 7 3, 3 3))', 4296);
geo3 = dmgeo.ST_CreateAnnulus(geo1,geo2, 6);
select dmgeo.st_astext(geo3, 4);
end;
结果:
POLYGON ((10.0000 5.0000, 7.5000 0.6699, 2.5000 0.6699, 0.0000 5.0000, 2.5000 9.3301, 7.5000 9.3301, 10.0000 5.0000), (7.0000 5.0000, 6.0000 6.7321, 4.0000 6.7321, 3.0000 5.0000, 4.0000 3.2679, 6.0000 3.2679, 7.0000 5.0000))
2.19 ST_CreateAnnularSector
根据两个几何体构建一个扇环。首先,根据给定几何体构造出一个圆环;然后,根据圆 心和内外圆半径,以及指定的起始 角度和弧线的跨度在圆的基础上构造出扇形。
语法:
FUNCTIONST_CREATEANNULARSECTOR(
GEO1 SYSGEO.ST_GEOMETRY,
GEO2 SYSGEO.ST_GEOMETRY,
N INT, STARTANG DOUBLE,
ANGEXTENT DOUBLE
) RETURN SYSGEO.ST_GEOMETRY;
说明:
GEO1 构建外圆的几何体对象。
GEO2 构建内圆的几何体对象。
N 指定生成扇环的坐标个数。由于扇环的特殊性质,给定参数 N,将生成(2*N + 1) 个坐标点,额外的1个坐标点,它作为起 始和结束坐标而被重复一次。
STARTANG 表示扇弧形的起始角度。
ANGEXTENT表示扇弧形的跨度,它的取值范围为0~2*Π,不在此范围的取值一律视为 2*Π。
例子:构建一个扇环。
declare
geo1 st_geometry;
geo2 st_geometry;
geo3 st_geometry;
begin
geo1 = dmgeo.st_geomfromtext( 'polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 4296);
geo2 = dmgeo.st_geomfromtext( 'polygon ((3 3, 3 7, 7 7, 7 3, 3 3))', 4296);
geo3 = dmgeo.ST_CreateAnnularSector(geo1,geo2, 6, 0, 1.772);
select dmgeo.st_astext(geo3, 4);
end;
结果: POLYGON ((10.0000 5.0000, 9.6893 6.7351, 8.7957 8.2546, 7.4304 9.3696, 5.7630 9.9414, 4.0008 9.8991, 4.6003 6.9597, 5.3052 6.9766, 5.9722 6.7478, 6.5183 6.3018, 6.8757 5.6941, 7.0000 5.0000, 10.0000 5.0000))
3.几何获取函数
3.1. ST_Dimension 获取几何体对象的几何维度。
语法:
FUNCTION ST_DIMENSION (
GEO ST_GEOMETRY
)RETURN INT;
3.2 ST_CoordDim 获取几何体对象的坐标维度。
语法:
FUNCTION ST_COORDDIM (
GEO ST_GEOMETRY
)RETURN INT;
3.3 ST_GeometryType 获取几何体对象的类型。
语法:
FUNCTION ST_GEOMETRYTYPE (
GEO ST_GEOMETRY
)RETURN VARCHAR(20);
3.4 ST_AsText 获取几何体对象的wkt格式文本描述信息。
语法:
FUNCTION ST_ASTEXT (
GEO ST_GEOMETRY
)RETURN CLOB;
3.5 ST_AsText 获取指定坐标精度的几何体对象wkt格式文本描述信息。
语法:
FUNCTION ST_ASTEXT (
GEO ST_GEOMETRY,
V_PRECISION INT
)RETURN CLOB;
3.6 ST_AsBinary 获取几何体对象的wkb格式序列化描述信息。
语法:
FUNCTION ST_ASBINARY (
GEO ST_GEOMETRY
)RETURNBLOB;
3.7 ST_SRID 获取几何体对象的空间参考坐标系ID。
语法:
FUNCTION ST_SRID (
GEO ST_GEOMETRY
)RETURN INT;
3.8 ST_ISValid 几何体对象是否是合法对象。
语法:
FUNCTION ST_ISVALID(
GEO SYSGEO.ST_GEOMETRY
)RETURN INT;
说明:0:非法;1:合法。
3.9 ST_ISEmpty 获取几何体对象是否为空。
语法:
FUNCTION ST_ISEMPTY (
GEO ST_GEOMETRY
)RETURN INT;
说明:0:非空;1:空。
3.10 ST_ISSimple 判断几何体对象是否为简单几何体。
语法:
FUNCTION ST_ISSIMPLE (
GEO ST_GEOMETRY
)RETURN INT;
说明:0:复杂几何体; 1:简单几何体。
3.11 ST_X 获取几何体对象的X坐标。
语法:
FUNCTION ST_X (
GEO ST_GEOMETRY
)RETURN INT;
3.12 ST_Y 获取几何体对象的Y坐标。
语法:
FUNCTION ST_Y (
GEO ST_GEOMETRY
)RETURN INT;
3.13 ST_MinX 获取几何对象X坐标的最小值。
语法:
FUNCTION ST_MINX (
GEO ST_GEOMETRY
)RETURN INT;
3.14 ST_MAXX 获取几何体对象的X坐标的最大值。
语法:
FUNCTION ST_MAXX (
GEO ST_GEOMETRY
)RETURN INT;
3.15 ST_MINY 获取几何体对象Y坐标的最小值。
语法:
FUNCTION ST_MINY (
GEO ST_GEOMETRY
)RETURN INT;
3.16 ST_MAXY 获取几何体对象Y坐标的最大值。
语法:
FUNCTION ST_MAXY (
GEO ST_GEOMETRY
)RETURN INT;
3.17 ST_StartPoint 获取几何体对象的起始点。
语法:
FUNCTION ST_STARTPOINT (
GEO ST_GEOMETRY
)RETURN ST_POINT;
3.18 ST_EndPoint 获取几何体对象的终点。
语法:
FUNCTION ST_ENDPOINT (
GEO ST_GEOMETRY
)RETURN ST_POINT;
3.19 ST_ISRing 获取几何体对象是否是环。
语法:
FUNCTION ST_ISRING (
GEO ST_GEOMETRY
)RETURN INT;
3.20 ST_ISClosed 获取几何体对象是否闭合。
语法:
FUNCTION ST_ISCLOSED (
GEO ST_GEOMETRY
)RETURN INT;
说明:0:不闭合;1:闭合。
3.21 ST_Length 获取几何体对象的长度。
语法:
FUNCTION ST_LENGTH (
GEO ST_GEOMETRY
)RETURN INT;
3.22 ST_Perimeter 获取几何体对象的周长。
语法:
FUNCTION ST_PERIMETER (
GEO ST_GEOMETRY
)RETURN INT;
3.23 ST_NumPoints 获取几何体对象的节点数。
语法:
FUNCTION ST_NUMPOINTS (
GEO ST_GEOMETRY
)RETURN INT;
3.24 ST_PointN 获取几何体对象的第n个节点。
语法:
FUNCTION ST_POINTN (
GEO ST_GEOMETRY,
N INT )RETURN ST_POINT;
3.25 ST_Centroid 获取几何体对象的中心点。
语法:
FUNCTION ST_CENTROID (
GEO ST_GEOMETRY
)RETURN ST_POINT;
3.26 ST_PointOnSurface 获取几何体对象表面上的一点。
语法:
FUNCTION ST_POINTONSURFACE (
GEO ST_GEOMETRY
)RETURN ST_POINT;
3.27 ST_Area 获取几何体对象的面积。
语法:
FUNCTION ST_AREA (
GEO ST_GEOMETRY
)RETURN DOUBLE;
3.28 ST_ExteriorRing 获取几何体对象的外环。
语法:
FUNCTION ST_EXTERIORRING (
GEO ST_GEOMETRY
)RETURN ST_LINESTRING;
3.29 ST_NumInteriorRing 获取几何体对象的内环数。
语法:
FUNCTION ST_NUMINTERIORRING (
GEO ST_GEOMETRY
)RETURN INT;
3.30 ST_Boundary 获取几何体对象的边界。
语法:
FUNCTION ST_BOUNDARY (
GEO ST_GEOMETRY
)RETURN ST_GEOMETRY;
3.31 ST_Envelope 获取几何体对象的矩形范围。
语法:
FUNCTION ST_ENVELOPE (
GEO ST_GEOMETRY
)RETURN ST_POLYGON;
3.32 ST_InteriorRingN 获取几何体对象的第n个内环。
语法:
FUNCTION ST_INTERIORRINGN (
GEO ST_GEOMETRY,
N INT
)RETURN ST_LINESTRING;
3.33 ST_NumGeometries 获取几何对象个数。
语法:
FUNCTION ST_NUMGEOMETRIES (
GEO ST_GEOMETRY
)RETURN INT
3.34 ST_GeometryN 获取第n个几何对象。
语法:
FUNCTION ST_GEOMETRYN (
GEO ST_GEOMETRY, N INT
)RETURN ST_GEOMETRY
4. 空间关系判断函数
4.1 ST_Equals 判断两个几何对象是否相同。
语法:
FUNCTION ST_EQUALS (
G1 ST_GEOMETRY, G2 ST_GEOMETRY
) RETURN INT;
说明:返回值0:两个几何对象不相同;1:两个几何对象相同。
4.2 ST_DISJOINT 判断两个几何对象是否不相交。
语法:
FUNCTION ST_DISJOINT (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
说明:返回值0:两个几何对象相交;1:两个几何对象不相交。
4.3 ST_INTERSECTS 判断两个几何对象是否相交。
语法:
FUNCTION ST_INTERSECTS (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT
4.4 ST_TOUCHES 判断两个几何对象是否接触,即存在边界点相同,内节点不相交。
语法:
FUNCTION ST_TOUCHES (
ST_GEOMETRY, G2 ST_GEOMETRY
) RETURN INT;
4.5 ST_CROSSES 判断两个几何对象是否交叉,存在相同的点(不是几何对象完全一致)。不能处理面与 面之间的交叉情况, 可用于:点与线,点与面,线与面,线与线。
语法:
FUNCTION ST_CROSSES (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
4.6 ST_WITHIN 判断对象是否完全包含,对象g1是否完全在g2的内部。
语法:
FUNCTION ST_WITHIN (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
4.7 ST_CONTAINS 判断对象是否包含,g2 不存在点在 g1 的外边界,且至少存在一个 g2 的内节点在 g1 内部。
语法:
FUNCTION ST_CONTAINS (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
4.8 ST_OVERLAPS 判断两个几何对象是存在重叠,但并不被对方完全包含。
语法:
FUNCTION ST_OVERLAPS (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN INT;
4.9 ST_RELATE 判断两个几何对象是否满足DE-9IM字符串关系。
语法:
FUNCTION ST_RELATE (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY,
PATTERN CHAR(9)
) RETURN INT;
5.几何运算函数
5.1 ST_Distance 获取几何对象间的最短距离。
语法:
FUNCTION ST_DISTANCE (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN DOUBLE;
5.2 ST_Intersection 获取几何对象的交集。
语法:
FUNCTION ST_INTERSECTION (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN ST_GEOMETRY;
5.3 ST_Difference 获取几何对象的差集。
语法:
FUNCTION ST_DIFFERENCE (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN ST_GEOMETRY;
5.4 ST_Union 获取几何对象的并集。
语法:
FUNCTION ST_UNION (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN ST_GEOMETRY;
5.5 ST_SymDifference 获取几何对象的差异集。
语法:
FUNCTION ST_SYMDIFFERENCE (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN ST_GEOMETRY;
5.6 ST_Buffer 获取代替几何对象g1的几何对象,其到g1的距离小于等于d。
语法:
FUNCTION ST_BUFFER (
G1 ST_GEOMETRY,
D DOUBLE
) RETURN ST_GEOMETRY;
5.7 ST_ConvexHull 获取几何对象凸壳。
语法:
FUNCTION ST_CONVEXHULL (
G1 ST_GEOMETRY
) RETURN ST_GEOMETRY;
6.其他函数
6.1 ST_ADD_SPATIAL_REF 向SPATIAL_REF_SYS表中插入一条空间参考系信息。
语法:
PROCEDURE ST_ADD_SPATIAL_REF(
V_SRID INTEGER,
V_AUTH_NAME VARCHAR,
V_AUTH_SRID INTEGER,
V_SRTEXT VARCHAR );
6.2 ST_DEL_SPATIAL_REF 向SPATIAL_REF_SYS表中删除一条空间参考系信息。
语法:
PROCEDURE ST_DEL_SPATIAL_REF(
V_SRID INTEGER
);
6.3 ST_geo_valid_check
语法:
FUNCTION ST_GEO_VALID_CHECK(
GEO SYSGEO.ST_GEOMETRY
) RETURN INT;
6.4 ST_UPDATE_SRID 更新列的参考系SRID,可在GEOMETRY_COLUMNS表中查询到更新后列的SRID。
语法:
PROCEDURE ST_UPDATE_SRID(
V_SCH VARCHAR,
V_TAB VARCHAR,
V_COL VARCHAR,
NEW_SRID INTEGER );
以上是关于 DMGEO包的函数。