DMGEO系统包实现了SFA标准(《OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 2: SQL option》)中规定的SQL预定义schema,基于SQL UDT(自定义数据类型)的空间数据类型和空间数据类型的初始化,以及针对空间数据类型的几何体计算函数。
DM根据空间数据第一个点的坐标维度来确定该空间数据的几何维度,若该空间数据的坐标中存在维度小于几何维度的坐标,则在该坐标参数的末尾自动补充维度值0;若存在维度大于几何维度的坐标,则自动忽略该坐标参数末尾多余的维度值。因此若同时使用不同维度的坐标来描述一个空间数据,则无法保证该空间数据的准确性。
2.1 数据类型
达梦的空间数据类型是以类的方式进行体现的,具体有:
- ST_Geometry:最基本的几何体,是其他几何类型的基类
- ST_Point:点几何体
- ST_Curve,ST_LineString(ST_LineArring):线几何体。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可实例化的子类
相关类型的继承关系如下图所示(带*号的表示抽象父类):
如下详细介绍各数据类型:
- ST_Geometry
基础几何体类。
语法如下:
create or replace type SYSGEO.ST_GEOMETRY as object(
srid int,
geo_wkb blob,
geo_typeID int,
constructor function st_geometry() return self as result,
constructor function st_geometry(srid int, wkb blob, typeid int) return
self as result,
function st_wkt() return clob,
function st_dim() return int,
function st_type() return varchar(20),
function st_isempty() return int,
function st_issimple() return int,
function st_isvalid() return int,
function st_coordim() return int,
function st_NumGeos() return int,
function st_numPoints() return int,
function st_length() return double,
function st_point_x() return double,
function st_point_y() return double,
function st_start_point() return sysgeo.ST_GEOMETRY,
function st_end_point() return sysgeo.ST_GEOMETRY,
function st_is_ring() return int,
function st_is_closed() return int,
function st_centroid() return sysgeo.ST_GEOMETRY,
function st_point_on() return sysgeo.ST_GEOMETRY,
function st_area() return double,
function st_ext_ring() return sysgeo.ST_GEOMETRY,
function st_num_inter_ring() return int)
not final;
类成员说明:
- srid空间参考坐标系ID。
- geo_wkb二进制格式的几何体信息。
- geo_typeid几何体类型ID。-1表示ST_Geometry;0表示ST_Point;1表示ST_LineString;2表示ST_LineArring;3表示ST_Polygon;4表示ST_Multipoint;5表示ST_Multilinestring;6表示ST_Multipolygon;7表示ST_GeomCollection。
类方法说明:
- st_geometry()st_geometry类的构造函数。
- st_wkt()返回文本格式表示的几何体。
- st_dim()几何体的几何维度。
- st_type()几何体的类型名。
- st_isempty()几何体是否为空。
- st_issimple()是否为简单几何体。
- st_isvalid()几何体信息是否有效。
- st_coordim()几何体的坐标维度。
- st_NumGeos()几何体对象个数。
- ST_NUMPOINTS()几何体点的个数。
- ST_LENGTH()几何体长度。
- ST_POINT_X()点几何体的X坐标。
- ST_POINT_Y()点几何体的Y坐标。
- ST_START_POINT()线几何体的起点。
- ST_END_POINT()线几何体的终点。
- ST_IS_RING()线几何体是否是环。
- ST_IS_CLOSED()几何体是否是封闭的。
- ST_CENTROID()几何体质心。
- ST_POINT_ON()几何体表面上的点。
- ST_AREA()几何体面积。
- ST_EXT_RING()几何体外环。
- ST_NUM_INTER_RING()几何体内环数。
- ST_Point
点类。
语法如下:
create or replace type sysgeo.st_point under sysgeo.st_geometry(
constructor function st_point() return self as result,
constructor function st_point(srid int, wkb blob, typeid int) return self
as result) not final;
类说明:
- st_point()点类构造方法。
- ST_Curve
抽象线类。
语法如下:
create or replace type SYSGEO.ST_CURVE under SYSGEO.ST_GEOMETRY(
constructor function st_curve() return self as result,
constructor function st_curve(srid int, wkb blob, typeid int) return self
as result) not final;
类说明:
- st_curve()几何线基类构造方法。
- ST_Linestring
线类。
语法如下:
create or replace type SYSGEO.ST_LINESTRING under sysgeo.ST_Curve(
constructor function st_linestring() return self as result,
constructor function st_linestring(srid int, wkb blob, typeid int) return
self as result,
function curve() return sysgeo.ST_Curve) not final;
类说明:
- st_linestring()几何线类构造方法。
- ST_Surface
基础面类。
语法如下:
create or replace type SYSGEO.ST_SURFACE under SYSGEO.ST_GEOMETRY(
constructor function st_surface() return self as result,
constructor function st_surface(srid int, wkb blob, typeid int) return
self as result) not final;
类说明:
- st_surface()几何面基类构造方法。
- ST_Polygon
面类。
语法如下:
create or replace type SYSGEO.ST_POLYGON under SYSGEO.ST_Surface(
constructor function st_polygon() return self as result,
constructor function st_polygon(srid int, wkb blob, typeid int) return
self as result,
function surface() return sysgeo.ST_Surface) not final;
类说明:
- st_polygon()几何面类构造方法。
- ST_GeomCollection
基础几何体集合类。
语法如下:
create or replace type SYSGEO.ST_GEOMCOLLECTION under SYSGEO.ST_GEOMETRY(
constructor function st_geomcollection() return self as result,
constructor function st_geomcollection(srid int, wkb blob, typeid int)
return self as result)not final;
类说明:
- st_geomcollection()几何体集合类构造方法。
- ST_Multipoint
多点类语法如下:
create or replace type SYSGEO.ST_MULTIPOINT under SYSGEO.ST_GEOMETRY(
constructor function st_multipoint() return self as result,
constructor function st_multipoint(srid int, wkb blob, typeid int) return
self as result) not final;
类说明:
- st_multipoint()多点类构造方法。
- ST_MultiCurve
抽象多线类。
语法如下:
create or replace type SYSGEO.ST_MULTICURVE under SYSGEO.ST_GEOMETRY(
constructor function st_multicurve() return self as result,
constructor function st_multicurve(srid int, wkb blob, typeid int) return
self as result) not final;
类说明:
- st_multicurve()多线基类构造方法。
- ST_Multilinestring
多线类。
语法如下:
create or replace type SYSGEO.ST_MULTILINESTRING under SYSGEO.ST_MultiCurve(
constructor function st_multilinestring() return self as result,
constructor function st_multilinestring(srid int, wkb blob, typeid int)
return self as result,
function st_mcurve() return sysgeo.ST_MultiCurve) not final;
类成员说明:
- st_multilinestring()多线类构造方法。
- st_mcurve()返回ST_MultiCurve几何类对象。
- ST_MultiSurface
抽象多面类。
语法如下:
create or replace type SYSGEO.ST_MULTISURFACE under SYSGEO.ST_GEOMETRY(
constructor function st_multisurface() return self as result,
constructor function st_multisurface(srid int, wkb blob, typeid int)
return as result) not final;
类说明:
- st_multisurface()多面基类构造方法。
- ST_Multipolygon
多面类。
语法如下:
create or replace type SYSGEO.ST_MULTIPOLYGON under SYSGEO.ST_MultiSurface(
constructor function st_multipolygon() return self as result,
constructor function st_multipolygon(srid int, wkb blob, typeid int)
return self
function st_msurface() return sysgeo.ST_MultiSurface) not final;
类说明:
- st_multipolygon()多面类构造方法。
- st_msurface()返回st_msurface几何类对象。
2.2 相关方法
用户在使用DMGEO包之前,需要提前调用系统过程SP_INIT_GEO_SYS(1)创建DMGEO包,包创建成功后就可以使用空间数据类型以及包提供的方法。
SP_INIT_GEO_SYS(1);
如果dmgeo包已存在,调用SP_INIT_GEO_SYS(2),系统将只重建dmgeo包方法,而不影响现有的空间数据类型以及数据。
SP_INIT_GEO_SYS(2);
调用系统过程SP_INIT_GEO_SYS(0)可以删除DMGEO包,任何与空间数据类型相关的表、函数、过程、触发器等对象均会被级联删除。
SP_INIT_GEO_SYS(0);
创建DMGEO包后,系统会创建表GEOMETRY_COLUMNS和SPATIAL_REF_SYS,这两张表分别记录空间数据类型列创建情况和空间参考坐标系信息。GEOMETRY_COLUMNS内容不需要用户干预,SPATIAL_REF_SYS内容可以通过DMGEO包提供的存储过程ST_ADD_SPATIAL_REF和ST_DEL_SPATIAL_REF增加或删除。
2.2.1 几何体构造函数
几何体构造函数大体可分为两类:通过WKT信息与SRID信息构造和通过WKB信息与SRID信息构造。通常直接构造时选择通过WKT信息与SRID信息构造,从数据库获取信息时会使用WKB信息与SRID信息构造,因此下面仅给出第一种构造方式的例子。
达梦实现的几何体函数以包中方法的形式提供给用户,包名为dmgeo。使用如下函数时,必须加上包名dmgeo。
- 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);
- ST_MPointFromText
根据wkt信息和srid信息构造多点类。
语法如下:
function ST_MPointFromText (
wkt clob,
srid int
)return ST_Multipoint;
参数详解
- wkt几何对象文本描述信息。
- srid空间参考坐标系ID。
举例说明
dmgeo.ST_MPointFromText('multipoint empty' , 0 ); //空对象
dmgeo.ST_MPointFromText('multipoint (1 1, 2 2)', 0 );
- ST_MLineFromText
根据wkt信息和srid信息构造多线类。
语法如下:
function ST_MLineFromText (
wkt clob,
srid int
)return ST_Multilinestring;
参数详解
- wkt几何对象文本描述信息。
- srid空间参考坐标系ID。
举例说明
dmgeo.ST_MLineFromText('multilinestring empty' , 0); //空对象
dmgeo.ST_MLineFromText('multilinestring ((1 1,2 1),(4 4, 3 3))', 0);
- ST_MPolyFromText
根据wkt信息和srid信息构造多面类。
语法如下:
function ST_MPolyFromText (
wkt clob,
srid int
)return ST_Multipolygon;
参数详解
- wkt几何对象文本描述信息。
- srid空间参考坐标系ID。
举例说明
dmgeo.ST_MPolyFromText('multipolygon empty' , 0); //空对象
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);
- ST_GeomFromWKB
根据wkb信息和srid信息构造空间数据基础类对象。
语法如下:
function ST_GeomFromWKB (
wkB Blob,
srid int
)return ST_GEOMETRY;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_PointFromWKB
根据wkb信息和srid信息构造点类。
语法如下:
function ST_PointFromWKB (
wkB Blob,
srid int
)return ST_Point;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_LineFromWKB
根据wkb信息和srid信息构造线类。
语法如下:
function ST_LineFromWKB (
wkB Blob,
srid int
)return ST_Linestring;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_PolyFromWKB
根据wkb信息和srid信息构造面类。
语法如下:
function ST_PolyFromWKB (
wkB Blob,
srid int
)return ST_Polygon;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_MPointFromWKB
根据wkb信息和srid信息构造多点类。
语法如下:
function ST_MPointFromWKB (
wkB Blob,
srid int
)return ST_Multipoint;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_MLineFromWKB
根据wkb信息和srid信息构造多线类。
语法如下:
function ST_MLineFromWKB (
wkB Blob,
srid int
)return ST_Multilinestring;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- ST_MPolyFromWKB
根据wkb信息和srid信息构造多面类。
语法如下:
function ST_MPolyFromWKB (
wkB Blob,
srid int
)return ST_Multipolygon;
参数详解
- wkb几何对象序列化描述信息。
- srid空间参考坐标系ID。
- 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首尾相连,所以会有一个重复点。
返回值
一个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))
- ST_CreateArc
根据几何体构建弧线(包括圆弧和椭圆弧)。根据给定几何体的最左边、最上边、最右边和最下边四个边界点构建一个方形或矩形,构建出该方形或矩形的内切圆或椭圆。进而根据起始角度和弧线的跨度在圆或椭圆的基础上构造出弧线。
语法如下:
function ST_CreateArc(
geo sysgeo.ST_Geometry,
n int,
startAng double,
angExtent double
) return sysgeo.ST_Geometry;
参数详解
- GEO几何体对象。
- N指定生成圆弧(椭圆弧)的坐标个数,给定参数N将生成N个坐标点。
- startang表示截取圆弧、椭圆弧线的起始角度。
- angextent表示弧线的跨度(由此可得到结束角度),它的取值范围为0~2*π,不在此范围的取值一律视为2*π。
返回值
一个linestring空间类型对象。
举例说明
构建一个弧线。
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)
- 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*π。
返回值
一个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_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))
- ST_CreateAnnulus
根据两个几何体构建一个圆环。首先,根据给定几何体的最左边、最上边、最右边和最下边四个边界点构建一个方形,两个方形的中心一定要求一致;其次,构建出方形的内切圆;最后,根据两个圆构造出一个圆环。
语法如下:
function ST_CreateAnnulus(
geo1 sysgeo.ST_Geometry,
geo2 sysgeo.ST_Geometry,
n int
) return sysgeo.ST_Geometry;
参数详解
- GEO1 构建外圆的几何体对象。
- GEO2 构建内圆的几何体对象。
- N 指定生成圆环的坐标个数。由于环有两个圆构造而成,因此给定参数N,实际上会生成(2*N+2)个坐标点,环上的内外圆上各分布(N + 1)个点。
返回值
一个polygon空间类型对象。
举例说明
构建一个圆环。
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))
- 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*π。
返回值
一个polygon空间类型对象。
举例说明
构建一个扇环。
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))
2.2.2 几何信息获取函数
- ST_Dimension
获取几何体对象的几何维度。
语法如下:
function ST_Dimension (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象的几何维度
- ST_CoordDim
获取几何体对象的坐标维度。
语法如下:
function ST_CoordDim (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象的坐标维度
- ST_GeometryType
获取几何体对象的类型。
语法如下:
function ST_GeometryType (
geo ST_Geometry
)return varchar(20);
参数详解
- geo几何体对象。
返回值
几何体对象的类型。
- ST_AsText
获取几何体对象的wkt格式文本描述信息。
语法如下:
function ST_AsText (
geo ST_Geometry
)return clob;
参数详解
- geo几何体对象。
返回值
几何体对象的文本表示形式。
- ST_AsText
获取指定坐标精度的几何体对象wkt格式文本描述信息。
语法如下:
function ST_AsText (
geo ST_Geometry,
v_precision int
)return clob;
参数详解
- geo几何体对象。
- v_precision坐标精度,即小数位的个数,精度取值范围1~16,缺省为16。
返回值
指定精度的几何体对象文本表示形式。
- ST_AsBinary
获取几何体对象的wkb格式序列化描述信息。
语法如下:
function ST_AsBinary (
geo ST_Geometry
)returnblob;
参数详解
- geo几何体对象。
返回值
几何体对象的序列化表示形式。
- ST_SRID
获取几何体对象的空间参考坐标系ID。
语法如下:
function ST_SRID (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象的空间参考坐标系。
- ST_ISValid
几何体对象是否是合法对象。
语法如下:
function ST_IsValid(
geo sysgeo.ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
0:非法;1:合法。
- ST_ISEmpty
获取几何体对象是否为空。
语法如下:
function ST_IsEmpty (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
0:非空;1:空。
- ST_ISSimple
判断几何体对象是否为简单几何体。
语法如下:
function ST_IsSimple (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
0:复杂几何体; 1:简单几何体。
- ST_X
获取几何体对象的X坐标。
语法如下:
function ST_X (
geo ST_geometry
)return int;
参数详解
- geo几何体对象,必须是POINT几何类型。
返回值
几何体对象的X坐标值。
- ST_Y
获取几何体对象的Y坐标。
语法如下:
function ST_Y (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象,必须是POINT几何类型。
返回值
几何体对象的Y坐标值。
- ST_MinX
获取几何对象X坐标的最小值。
语法如下:
function ST_MinX (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象X坐标的最小值。
- ST_MAXX
获取几何体对象的X坐标的最大值。
语法如下:
function ST_MAXX (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象X坐标的最大值。
- ST_MINY
获取几何体对象Y坐标的最小值。
语法如下:
function ST_MINY (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象Y坐标的最小值。
- ST_MAXY
获取几何体对象Y坐标的最大值。
语法如下:
function ST_MAXY (
geo ST_Geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象Y坐标的最大值。
- ST_StartPoint
获取几何体对象的起始点。
语法如下:
function ST_StartPoint (
geo ST_Geometry
)return ST_POINT;
参数详解
- geo几何体对象,必须为LINESTRING几何类型。
返回值
几何体对象的起始点。
- ST_EndPoint
获取几何体对象的终点。
语法如下:
function ST_EndPoint (
geo ST_geometry
)return ST_POINT;
参数详解
- geo几何体对象,必须为LINESTRING几何类型。
返回值
几何体对象的终点。
- ST_ISRing
获取几何体对象是否是环。
语法如下:
function ST_IsRing (
geo ST_geometry
)return int;
参数详解
- geo几何体对象,必须为LINESTRING几何类型。
返回值
0:不是环;1:是环。
- ST_ISClosed
获取几何体对象是否闭合。
语法如下:
function ST_IsClosed (
geo ST_geometry
)return int;
参数详解
- geo 几何体对象,必须为LINESTRING或MULTILINESTRING几何类型。但在处理multilinestring时,是对内部的linestring逐个调用st_isclosed,内部的线与线不是作为一个整体进行isclosed判断的。
返回值
0:不闭合;1:闭合。
- ST_Length
获取几何体对象的长度。
语法如下:
function ST_Length (
geo ST_geometry
)return int;
参数详解
- geo几何体对象,必须为LINESTRING或MULTILINESTRING几何类型。
返回值
几何体对象长度
- ST_Perimeter
获取几何体对象的周长。
语法如下:
function ST_Perimeter (
geo ST_geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象周长。
- ST_NumPoints
获取几何体对象的节点数。
语法如下:
function ST_NumPoints (
geo ST_geometry
)return int;
参数详解
- geo几何体对象。
返回值
几何体对象节点数。
- ST_PointN
获取几何体对象的第n个节点。
语法如下:
function ST_PointN (
geo ST_geometry,
n int
)return ST_Point;
参数详解
- geo几何体对象。必须为LINESTRING几何类型。
返回值
几何体对象的第n个节点。
- ST_Centroid
获取几何体对象的中心点。
语法如下:
function ST_Centroid (
geo ST_geometry
)return ST_Point;
参数详解
- geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。
返回值
几何体对象的中心点。
- ST_PointOnSurface
获取几何体对象表面上的一点。
语法如下:
function ST_PointOnSurface (
geo ST_geometry
)return ST_Point;
参数详解
- geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。
返回值
几何体对象表面上的一点。
- ST_Area
获取几何体对象的面积。
语法如下:
function ST_Area (
geo ST_geometry
)return double;
参数详解
- geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。
返回值
几何体对象的面积。
- ST_ExteriorRing
获取几何体对象的外环。
语法如下:
function ST_ExteriorRing (
geo ST_geometry
)return ST_Linestring;
参数详解
- geo几何体对象,必须是POLYGON几何类型。
返回值
几何体对象的外环。
- ST_NumInteriorRing
获取几何体对象的内环数。
语法如下:
function ST_NumInteriorRing (
geo ST_geometry
)return int;
参数详解
- geo几何体对象,必须是POLYGON几何类型。
返回值
几何体对象的内环数。
30 ST_Boundary
获取几何体对象的边界。
语法如下:
function ST_Boundary (
geo ST_Geometry
)return ST_geometry;
参数详解
- geo几何体对象。
返回值
几何体对象的边界。
- ST_Envelope
获取几何体对象的矩形范围。
语法如下:
function ST_Envelope (
geo ST_Geometry
)return ST_Polygon;
参数详解
- geo几何体对象。
返回值
几何体对象的矩形范围。
- ST_InteriorRingN
获取几何体对象的第n个内环。
语法如下:
function ST_InteriorRingN (
geo ST_geometry,
n int
)return ST_LineString;
参数详解
- geo几何体对象,必须是POLYGON几何类型。
- n第几个内环。
返回值
几何体对象的第n个内环。
33 ST_NumGeometries
获取几何对象个数。
语法如下:
function ST_NumGeometries (
geo ST_geometry
)return int
参数详解
- geo几何体对象。
返回值
几何体对象个数,非MULTI类几何体返回1。
- ST_GeometryN
获取第n个几何对象。
语法如下:
function ST_GeometryN (
geo ST_geometry,
n int
)return ST_Geometry
参数详解
- geo几何体对象。
- n第几个几何对象。
返回值
第n个几何对象。
2.2.3 空间关系判断函数
- ST_Equals
判断两个几何对象是否相同。
语法如下:
function ST_Equals (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象不相同;1:两个几何对象相同。
- ST_Disjoint
判断两个几何对象是否不相交。
语法如下:
function ST_Disjoint (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象相交;1:两个几何对象不相交。
- ST_Intersects
判断两个几何对象是否相交。
语法如下:
function ST_Intersects (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象不相交;1:两个几何对象相交。
- ST_Touches
判断两个几何对象是否接触,即存在边界点相同,内节点不相交。
语法如下:
function ST_Touches (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象不接触;1:两个几何对象接触。
- ST_Crosses
判断两个几何对象是否交叉,存在相同的点(不是几何对象完全一致)。不能处理面与面之间的交叉情况,可用于:点与线,点与面,线与面,线与线。
语法如下:
function ST_Crosses (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象不交叉;1:两个几何对象交叉。
举例说明
select dmgeo.ST_crosses(dmgeo.ST_MLineFromText('multilinestring ((0 5,4 1),(4 4,0 0))', 0),dmgeo.ST_MLineFromText('multilinestring ((1 0,1 2),(2 0, 0 4))', 0));
结果:
1
- ST_Within
判断对象是否完全包含,对象g1是否完全在g2的内部。
语法如下:
function ST_Within (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:g1不完全在g2内部;1:g1完全在g2内部。
- ST_Contains
判断对象是否包含,g2不存在点在g1的外边界,且至少存在一个g2的内节点在g1内部。
语法如下:
function ST_Contains (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:g1不包含g2;1:g1包含g2。
- ST_Overlaps
判断两个几何对象是存在重叠,但并不被对方完全包含。
语法如下:
function ST_Overlaps (
g1 ST_Geometry,
g2 ST_Geometry
) return int;
参数详解
- g1几何对象。
- g2几何对象。
返回值
0:两个几何对象不存在重叠;1:两个几何对象存在重叠。
- ST_Relate
判断两个几何对象是否满足DE-9IM字符串关系。
语法如下:
function ST_Relate (
g1 ST_Geometry,
g2 ST_Geometry,
pattern char(9)
) return int;
参数详解
- g1几何对象。
- g2几何对象。
- pattern:DE-9IM字符串。
返回值
0:g1,g2不满足pattern指定的关系;1:g1,g2满足pattern指定的关系。
2.2.4 几何运算函数
- ST_Distance
获取几何对象间的最短距离。
语法如下:
function ST_Distance (
g1 ST_Geometry,
g2 ST_Geometry
) return double;
参数详解
- g1几何对象。
- g2几何对象。
返回值
几何对象间最短距离。
- ST_Intersection
获取几何对象的交集。
语法如下:
function ST_Intersection (
g1 ST_Geometry,
g2 ST_Geometry
) return ST_Geometry;
参数详解
- g1几何对象。
- g2几何对象。
返回值
几何对象的交集。
- ST_Difference
获取几何对象的差集。
语法如下:
function ST_Difference (
g1 ST_Geometry,
g2 ST_Geometry
) return ST_Geometry;
参数详解
- g1几何对象。
- g2几何对象。
返回值
g1与g2的差集。
- ST_Union
获取几何对象的并集。
语法如下:
function ST_Union (
g1 ST_Geometry,
g2 ST_Geometry
) return ST_Geometry;
参数详解
- g1几何对象。
- g2几何对象。
返回值
g1与g2的并集。
- ST_SymDifference
获取几何对象的差异集。
语法如下:
function ST_SymDifference (
g1 ST_Geometry,
g2 ST_Geometry
) return ST_Geometry;
参数详解
- g1几何对象。
- g2几何对象。
返回值
g1与g2的差异集。
- ST_Buffer
获取代替几何对象g1的几何对象,其到g1的距离小于等于d。
语法如下:
function ST_Buffer (
g1 ST_Geometry,
d double
) return ST_Geometry;
参数详解
- g1几何对象。
- d距离。
返回值
几何对象g1以d为半径的外包几何对象。
- ST_ConvexHull
获取几何对象凸壳。
语法如下:
function ST_ConvexHull (
g1 ST_Geometry
) return ST_Geometry;
参数详解
- g1几何对象。
返回值
外包几何对象。
- ST_Split
获取几何对象被另一几何对象切割后的几何对象。
支持ST_LineString类型对象被ST_Point/ST_Multipoint、ST_LineString/ST_Multilinestring以及ST_Polygon/ST_Multipolygon类型对象切割。
支持ST_Polygon/ST_Multipolygon类型对象被ST_LineString/ST_Multilinestring类型对象切割。
语法如下:
FUNCTION ST_SPLIT (
G1 ST_GEOMETRY,
G2 ST_GEOMETRY
) RETURN ST_GEOMETRY;
参数详解
- g1被切割的几何对象。
- g2切割g1的几何对象。
返回值
切割结果的几何对象集合。
- ST_MakeValid
在不丢失顶点坐标的情况下,尝试使一个无效的几何对象有效。
支持的对象类型包括:ST_Point/ST_Multipoint、ST_LineString/ST_Multilinestring、ST_Polygon/ST_Multipolygon以及ST_GeomCollection。
语法如下:
FUNCTION ST_MAKEVALID (
G1 ST_GEOMETRY
) RETURN ST_GEOMETRY;
参数详解
- g1几何对象。
返回值
处理结果的几何对象。
- ST_AsGEOJSON
将几何对象转换成JSON格式。
语法如下:
FUNCTION ST_ASGEOJSON (
G1 ST_GEOMETRY
) RETURN CLOB;
参数详解
- g1几何对象。
返回值
JSON格式的几何对象。
- ST_Transform
将几何对象转换到新的空间参考坐标系。
语法如下:
FUNCTION ST_TRANSFORM (
G1 ST_GEOMETRY,
SRID INT
) RETURN ST_GEOMETRY;
参数详解
- g1几何对象。
- srid空间参考坐标系ID。
返回值
新空间参考坐标系中的几何对象。
- ST_SetSRID
设置几何对象的空间参考坐标系ID。
语法如下:
FUNCTION ST_SETSRID (
G1 ST_GEOMETRY,
SRID INT
) RETURN ST_GEOMETRY;
参数详解
- g1几何对象。
- srid空间参考坐标系ID。
返回值
空间参考坐标系ID为指定值的几何对象。
- ST_SimplifyPreserveTopology
获取几何对象的简化版本。使用Douglas-Peucker算法进行简化,避免构造无效的几何对象。
语法如下:
FUNCTION ST_ SimplifyPreserveTopology (
G1 ST_GEOMETRY,
TOLERANCE DOUBLE
) RETURN ST_GEOMETRY;
参数详解
- g1几何对象。
- tolerance简化阈值。
返回值
简化后的几何对象。
2.2.5 其他过程函数
- 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
);
参数详解
- V_SRID空间参考系ID。
- V_AUTH_NAME空间参考系名称。
- V_AUTH_SRID空间参考系代码。
- V_SRTEXT空间参考系的文本格式描述。
- ST_DEL_SPATIAL_REF
向SPATIAL_REF_SYS表中删除一条空间参考系信息。
语法如下:
procedure ST_DEL_SPATIAL_REF(
V_SRID INTEGER
);
参数详解
- V_SR ID空间参考系ID。
- ST_geo_valid_check
语法如下:
function ST_geo_valid_check(geo sysgeo.ST_Geometry) return int;
功能说明
检验空间类型对象数据是否是有效。
参数详解
- geo空间类型对象。
- ST_UPDATE_SRID
更新列的参考系SRID,可在GEOMETRY_COLUMNS表中查询到更新后列的SRID。
语法如下:
PROCEDURE ST_UPDATE_SRID(
V_SCH VARCHAR,
V_TAB VARCHAR,
V_COL VARCHAR,
NEW_SRID INTEGER
);
参数详解
- V_SCH待修改列所在表的模式名。
- V_TAB 待修改列所在表表名。
- V_COL 待修改列列名。
- NEW_SRID 用以更新的新值SRID。
2.3 创建、检测、删除语句
2.3.1 SP_INIT_GEO_SYS
创建或删除DMGEO系统包。
语法如下:
void
SP_INIT_GEO_SYS(
CREATE_FLAG int
)
参数详解
- CREATE_FLAG
为1时表示创建DMGEO包;为0表示删除该系统包。
返回值
无
举例说明
创建DMGEO系统包。
SP_INIT_GEO_SYS(1);
注意
- 不能在MPP全局模式下的存储过程中直接调用,在MPP LOCAL模式下可在存储过程中直接调用;
- 不能在存储过程中带参数进行动态调用。
2.3.2 SF_CHECK_GEO_SYS
系统的GEO系统包启用状态检测。
语法如下:
int
SF_CHECK_GEO_SYS ()
返回值
0:未启用;1:已启用
举例说明
获得GEO系统包的启用状态。
SELECT SF_CHECK_GEO_SYS;
2.4 JDBC访问DM空间类型数据
本章节主要介绍如何利用JDBC访问DM数据库中的空间类型数据。
2.4.1 使用说明
DM数据库中最基本的空间数据类型为ST_Geometry,而ST_Geometry的类型为STRUCT,因此JDBC对空间类型数据的访问方法与对STRUCT类型数据的访问方法相同。
JDBC连接DM数据库后,访问空间类型数据的方法如下:
数据库准备数据:
CREATE TABLE sub_types(
id int,
sub_mpolygon ST_Multipolygon
);
INSERT INTO sub_types VALUES (1,dmgeo.ST_MPolyFromText ('multipolygon(((10 10, 10 20, 20 20, 20 15, 10 10)), ((50 40, 50 50, 60 50, 60 40, 50 40)))' , 4269));
INSERT INTO sub_types VALUES (2,dmgeo.ST_MPolyFromText('multipolygon (((1 1, 1 2, 2 2, 2 1, 1 1)), ((3 3, 3 4, 4 4, 4 3, 3 3)))' , 4269));
COMMIT;
- 获取DM数据库中的空间类型数据。
使用标准JDBC功能函数getObject()检索数据表中的空间类型数据,getObject()返回对象类型为java.lang.Object,由于DM数据库中的空间数据类型实质为STRUCT类型,因此需将java.lang.Object类型对象强制转换为java.sql.Struct类型对象。
例1:获取sub_types表中的ST_Multipolygon类型数据。
ResultSet rs = stmt.executeQuery("select sub_mpolygon from sub_types;");
java.sql.Struct struct = (jav.sql.Struct)rs.getObject(1);
- 获取空间类型数据的成员属性信息。
获取java.sql.Struct类型对象中的成员属性需要使用getAttributes()方法。
例2:获取例1中查询结果对象struct的SRID、GEO_WKB以及GEO_TYPEID属性信息。
Object[] attrs = struct.getAttributes(); //获取结构体中的成员
int srid = (Integer)attrs[0]; //获取SRID属性信息
Blob blob = (Blob)attrs[1]; //获取GEO_WKB属性信息
int type = (Integer)attrs[2]; //获取GEO_TYPEID属性信息
- 解析GEO_WKB属性信息。
GEO_WKB属性信息的格式为标准WKB格式,可以使用通用的WKB解析工具进行解析。JTS是JAVA处理空间类型数据的通用组件,可用于解析GEO_WKB属性信息。JTS的详细介绍可参考https://github.com/locationtech/jts 。
例3:使用JTS解析GEO_WKB属性信息,获得org.locationtech.jts.geom.Geometry类型对象。
WKBReader reader = new WKBReader();
Geometry geometry = reader.read(blob.getBytes(1, (int)blob.length()));
也可使用JTS将org.locationtech.jts.geom.Geometry类型对象转换成WKB格式数据。
例4:将org.locationtech.jts.geom.Geometry类型对象转换成WKB格式数据。
WKBWriter writer = new WKBWriter();
byte[] bytes = writer.write(geometry);
- 创建java.sql.Struct类型的空间类型数据。
可以根据空间类型数据的属性信息创建java.sql.Struct类型对象。
例5:创建ST_Multipolygon类型的java.sql.Struct类型对象struct2。
Object[] attrs = new Object[3];
attrs[0] = srid;
attrs[1] = DmdbBlob.newInstanceOfLocal(bytes, (DmdbConnection)conn);
attrs[2] = 6;
//通过指定空间数据类型名称和结构体成员创建java.sql.Struct类型对象
java.sql.Struct struct2 = conn.createStruct("ST_MULTIPOLYGON", attrs);
- 将java.sql.Struct类型的空间类型数据插入数据表。
使用标准JDBC功能函数setObject()将java.sql.Struct类型对象绑定到SQL语句后,执行该SQL语句即可将java.sql.Struct类型的空间类型数据插入数据表。
例6:将java.sql.Struct类型对象struct2插入数据表sub_types。
PreparedStatement pstmt = conn.prepareStatement("insert into sub_types(sub_mpolygon) values(?)");
pstmt.setObject(1, struct2);
pstmt.execute();
2.4.2 举例说明
下面列出一个完整的JDBC访问DM空间类型数据的示例以供参考。
public static void test_spatial() throws SQLException, org.locationtech.jts.io.ParseException
{
//创建数据库连接
Connection conn = getConnection();
Statement stmt = conn.createStatement();
//获取数据表sub_types中的空间类型数据
ResultSet rs = stmt.executeQuery("select sub_mpolygon from sub_types;");
while (rs.next())
{
// 将空间类型数据转换为STRUCT类型后,获取结构体中的成员属性信息
Struct struct = (Struct)rs.getObject(1);
Object[] attrs = struct.getAttributes();
int srid = (Integer)attrs[0];
Blob blob = (Blob)attrs[1];
int type = (Integer)attrs[2];
// 解析GEO_WKB属性信息
WKBReader reader = new WKBReader();
Geometry geometry = reader.read(blob.getBytes(1, (int)blob.length()));
System.out.println(geometry);
// 创建ST_Multipolygon空间类型的struct类型对象
WKBWriter writer = new WKBWriter();
attrs[1] = DmdbBlob.newInstanceOfLocal(writer.write(geometry), (DmdbConnection)conn);
struct = conn.createStruct("ST_MULTIPOLYGON", attrs);
//将创建好的struct类型对象插入数据表sub_types
PreparedStatement pstmt = conn.prepareStatement("insert into sub_types(sub_mpolygon) values(?)");
pstmt.setObject(1, struct);
pstmt.execute();
}
rs.close();
stmt.close();
conn.close();
}