DMGEO 包

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可实例化的子类

相关类型的继承关系如下图所示(带*号的表示抽象父类):

继承关系

如下详细介绍各数据类型:

  1. 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()几何体内环数。
  1. 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()点类构造方法。
  1. 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()几何线基类构造方法。
  1. 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()几何线类构造方法。
  1. 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()几何面基类构造方法。
  1. 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()几何面类构造方法。
  1. 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()几何体集合类构造方法。
  1. 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()多点类构造方法。
  1. 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()多线基类构造方法。
  1. 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几何类对象。
  1. 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()多面基类构造方法。
  1. 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。

  1. ST_GeomFromText

根据wkt信息和srid信息构造空间数据基础类。

语法如下:

function ST_GeoMFromText(

  wkt clob,

  srid int

)return ST_Geometry;

参数详解

  • wkt几何对象文本描述信息。
  • srid空间参考坐标系ID。
  1. 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);
  1. 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);
  1. 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);
  1. 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 );
  1. 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);
  1. 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);
  1. ST_GeomFromWKB

根据wkb信息和srid信息构造空间数据基础类对象。

语法如下:

function ST_GeomFromWKB (

  wkB Blob,

  srid int

)return ST_GEOMETRY;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_PointFromWKB

根据wkb信息和srid信息构造点类。

语法如下:

function ST_PointFromWKB (

  wkB Blob,

  srid int

)return ST_Point;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_LineFromWKB

根据wkb信息和srid信息构造线类。

语法如下:

function ST_LineFromWKB (

  wkB Blob,

  srid int

)return ST_Linestring;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_PolyFromWKB

根据wkb信息和srid信息构造面类。

语法如下:

function ST_PolyFromWKB (

  wkB Blob,

  srid int

)return ST_Polygon;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_MPointFromWKB

根据wkb信息和srid信息构造多点类。

语法如下:

function ST_MPointFromWKB (

  wkB Blob,

  srid int

)return ST_Multipoint;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_MLineFromWKB

根据wkb信息和srid信息构造多线类。

语法如下:

function ST_MLineFromWKB (

  wkB Blob,

  srid int

)return ST_Multilinestring;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. ST_MPolyFromWKB

根据wkb信息和srid信息构造多面类。

语法如下:

function ST_MPolyFromWKB (

  wkB Blob,

  srid int

)return ST_Multipolygon;

参数详解

  • wkb几何对象序列化描述信息。
  • srid空间参考坐标系ID。
  1. 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))
  1. 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)
  1. 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))
  1. 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))
  1. 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 几何信息获取函数

  1. ST_Dimension

获取几何体对象的几何维度。

语法如下:

function ST_Dimension (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象的几何维度

  1. ST_CoordDim

获取几何体对象的坐标维度。

语法如下:

function ST_CoordDim (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象的坐标维度

  1. ST_GeometryType

获取几何体对象的类型。

语法如下:

function ST_GeometryType (

  geo ST_Geometry

)return varchar(20);

参数详解

  • geo几何体对象。

返回值

几何体对象的类型。

  1. ST_AsText

获取几何体对象的wkt格式文本描述信息。

语法如下:

function ST_AsText (

  geo ST_Geometry

)return clob;

参数详解

  • geo几何体对象。

返回值

几何体对象的文本表示形式。

  1. ST_AsText

获取指定坐标精度的几何体对象wkt格式文本描述信息。

语法如下:

function ST_AsText (

  geo ST_Geometry,

  v_precision int

)return clob;

参数详解

  • geo几何体对象。
  • v_precision坐标精度,即小数位的个数,精度取值范围1~16,缺省为16。

返回值

指定精度的几何体对象文本表示形式。

  1. ST_AsBinary

获取几何体对象的wkb格式序列化描述信息。

语法如下:

function ST_AsBinary (

  geo ST_Geometry

)returnblob;

参数详解

  • geo几何体对象。

返回值

几何体对象的序列化表示形式。

  1. ST_SRID

获取几何体对象的空间参考坐标系ID。

语法如下:

function ST_SRID (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象的空间参考坐标系。

  1. ST_ISValid

几何体对象是否是合法对象。

语法如下:

function ST_IsValid(

  geo sysgeo.ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

0:非法;1:合法。

  1. ST_ISEmpty

获取几何体对象是否为空。

语法如下:

function ST_IsEmpty (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

0:非空;1:空。

  1. ST_ISSimple

判断几何体对象是否为简单几何体。

语法如下:

function ST_IsSimple (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

0:复杂几何体; 1:简单几何体。

  1. ST_X

获取几何体对象的X坐标。

语法如下:

function ST_X (

  geo ST_geometry

)return int;

参数详解

  • geo几何体对象,必须是POINT几何类型。

返回值

几何体对象的X坐标值。

  1. ST_Y

获取几何体对象的Y坐标。

语法如下:

function ST_Y (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象,必须是POINT几何类型。

返回值

几何体对象的Y坐标值。

  1. ST_MinX

获取几何对象X坐标的最小值。

语法如下:

function ST_MinX (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象X坐标的最小值。

  1. ST_MAXX

获取几何体对象的X坐标的最大值。

语法如下:

function ST_MAXX (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象X坐标的最大值。

  1. ST_MINY

获取几何体对象Y坐标的最小值。

语法如下:

function ST_MINY (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象Y坐标的最小值。

  1. ST_MAXY

获取几何体对象Y坐标的最大值。

语法如下:

function ST_MAXY (

  geo ST_Geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象Y坐标的最大值。

  1. ST_StartPoint

获取几何体对象的起始点。

语法如下:

function ST_StartPoint (

  geo ST_Geometry

)return ST_POINT;

参数详解

  • geo几何体对象,必须为LINESTRING几何类型。

返回值

几何体对象的起始点。

  1. ST_EndPoint

获取几何体对象的终点。

语法如下:

function ST_EndPoint (

  geo ST_geometry

)return ST_POINT;

参数详解

  • geo几何体对象,必须为LINESTRING几何类型。

返回值

几何体对象的终点。

  1. ST_ISRing

获取几何体对象是否是环。

语法如下:

function ST_IsRing (

  geo ST_geometry

)return int;

参数详解

  • geo几何体对象,必须为LINESTRING几何类型。

返回值

0:不是环;1:是环。

  1. ST_ISClosed

获取几何体对象是否闭合。

语法如下:

function ST_IsClosed (

  geo ST_geometry

)return int;

参数详解

  • geo 几何体对象,必须为LINESTRING或MULTILINESTRING几何类型。但在处理multilinestring时,是对内部的linestring逐个调用st_isclosed,内部的线与线不是作为一个整体进行isclosed判断的。

返回值

0:不闭合;1:闭合。

  1. ST_Length

获取几何体对象的长度。

语法如下:

function ST_Length (

  geo ST_geometry

)return int;

参数详解

  • geo几何体对象,必须为LINESTRING或MULTILINESTRING几何类型。

返回值

几何体对象长度

  1. ST_Perimeter

获取几何体对象的周长。

语法如下:

function ST_Perimeter (

  geo ST_geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象周长。

  1. ST_NumPoints

获取几何体对象的节点数。

语法如下:

function ST_NumPoints (

  geo ST_geometry

)return int;

参数详解

  • geo几何体对象。

返回值

几何体对象节点数。

  1. ST_PointN

获取几何体对象的第n个节点。

语法如下:

function ST_PointN (

  geo ST_geometry,

  n int

)return ST_Point;

参数详解

  • geo几何体对象。必须为LINESTRING几何类型。

返回值

几何体对象的第n个节点。

  1. ST_Centroid

获取几何体对象的中心点。

语法如下:

function ST_Centroid (

  geo ST_geometry

)return ST_Point;

参数详解

  • geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。

返回值

几何体对象的中心点。

  1. ST_PointOnSurface

获取几何体对象表面上的一点。

语法如下:

function ST_PointOnSurface (

  geo ST_geometry

)return ST_Point;

参数详解

  • geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。

返回值

几何体对象表面上的一点。

  1. ST_Area

获取几何体对象的面积。

语法如下:

function ST_Area (

  geo ST_geometry

)return double;

参数详解

  • geo几何体对象,必须是POLYGON或MULTIPOLYGON几何类型。

返回值

几何体对象的面积。

  1. ST_ExteriorRing

获取几何体对象的外环。

语法如下:

function ST_ExteriorRing (

  geo ST_geometry

)return ST_Linestring;

参数详解

  • geo几何体对象,必须是POLYGON几何类型。

返回值

几何体对象的外环。

  1. 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几何体对象。

返回值

几何体对象的边界。

  1. ST_Envelope

获取几何体对象的矩形范围。

语法如下:

function ST_Envelope (

  geo ST_Geometry

)return ST_Polygon;

参数详解

  • geo几何体对象。

返回值

几何体对象的矩形范围。

  1. 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。

  1. ST_GeometryN

获取第n个几何对象。

语法如下:

function ST_GeometryN (

  geo ST_geometry,

  n int

)return ST_Geometry

参数详解

  • geo几何体对象。
  • n第几个几何对象。

返回值

第n个几何对象。

2.2.3 空间关系判断函数

  1. ST_Equals

判断两个几何对象是否相同。

语法如下:

function ST_Equals (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:两个几何对象不相同;1:两个几何对象相同。

  1. ST_Disjoint

判断两个几何对象是否不相交。

语法如下:

function ST_Disjoint (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:两个几何对象相交;1:两个几何对象不相交。

  1. ST_Intersects

判断两个几何对象是否相交。

语法如下:

function ST_Intersects (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:两个几何对象不相交;1:两个几何对象相交。

  1. ST_Touches

判断两个几何对象是否接触,即存在边界点相同,内节点不相交。

语法如下:

function ST_Touches (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:两个几何对象不接触;1:两个几何对象接触。

  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
  1. ST_Within

判断对象是否完全包含,对象g1是否完全在g2的内部。

语法如下:

function ST_Within (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:g1不完全在g2内部;1:g1完全在g2内部。

  1. 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。

  1. ST_Overlaps

判断两个几何对象是存在重叠,但并不被对方完全包含。

语法如下:

function ST_Overlaps (

  g1 ST_Geometry,

  g2 ST_Geometry

) return int;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

0:两个几何对象不存在重叠;1:两个几何对象存在重叠。

  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 几何运算函数

  1. ST_Distance

获取几何对象间的最短距离。

语法如下:

function ST_Distance (

  g1 ST_Geometry,

  g2 ST_Geometry

) return double;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

几何对象间最短距离。

  1. ST_Intersection

获取几何对象的交集。

语法如下:

function ST_Intersection (

  g1 ST_Geometry,

  g2 ST_Geometry

) return ST_Geometry;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

几何对象的交集。

  1. ST_Difference

获取几何对象的差集。

语法如下:

function ST_Difference (

  g1 ST_Geometry,

  g2 ST_Geometry

) return ST_Geometry;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

g1与g2的差集。

  1. ST_Union

获取几何对象的并集。

语法如下:

function ST_Union (

  g1 ST_Geometry,

  g2 ST_Geometry

) return ST_Geometry;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

g1与g2的并集。

  1. ST_SymDifference

获取几何对象的差异集。

语法如下:

function ST_SymDifference (

  g1 ST_Geometry,

  g2 ST_Geometry

) return ST_Geometry;

参数详解

  • g1几何对象。
  • g2几何对象。

返回值

g1与g2的差异集。

  1. ST_Buffer

获取代替几何对象g1的几何对象,其到g1的距离小于等于d。

语法如下:

function ST_Buffer (

  g1 ST_Geometry,

  d double

) return ST_Geometry;

参数详解

  • g1几何对象。
  • d距离。

返回值

几何对象g1以d为半径的外包几何对象。

  1. ST_ConvexHull

获取几何对象凸壳。

语法如下:

function ST_ConvexHull (

  g1 ST_Geometry

) return ST_Geometry;

参数详解

  • g1几何对象。

返回值

外包几何对象。

  1. 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的几何对象。

返回值

切割结果的几何对象集合。

  1. 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几何对象。

返回值

处理结果的几何对象。

  1. ST_AsGEOJSON

将几何对象转换成JSON格式。

语法如下:

FUNCTION ST_ASGEOJSON (

  G1	ST_GEOMETRY

) RETURN CLOB;

参数详解

  • g1几何对象。

返回值

JSON格式的几何对象。

  1. ST_Transform

将几何对象转换到新的空间参考坐标系。

语法如下:

FUNCTION ST_TRANSFORM (

  G1	ST_GEOMETRY,

  SRID	INT

) RETURN ST_GEOMETRY;

参数详解

  • g1几何对象。
  • srid空间参考坐标系ID。

返回值

新空间参考坐标系中的几何对象。

  1. ST_SetSRID

设置几何对象的空间参考坐标系ID。

语法如下:

FUNCTION ST_SETSRID (

  G1	ST_GEOMETRY,

  SRID	INT

) RETURN ST_GEOMETRY;

参数详解

  • g1几何对象。
  • srid空间参考坐标系ID。

返回值

空间参考坐标系ID为指定值的几何对象。

  1. ST_SimplifyPreserveTopology

获取几何对象的简化版本。使用Douglas-Peucker算法进行简化,避免构造无效的几何对象。

语法如下:

FUNCTION ST_ SimplifyPreserveTopology (

  G1  ST_GEOMETRY,

  TOLERANCE	 DOUBLE

) RETURN ST_GEOMETRY;

参数详解

  • g1几何对象。
  • tolerance简化阈值。

返回值

简化后的几何对象。

2.2.5 其他过程函数

  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

);

参数详解

  • V_SRID空间参考系ID。
  • V_AUTH_NAME空间参考系名称。
  • V_AUTH_SRID空间参考系代码。
  • V_SRTEXT空间参考系的文本格式描述。
  1. ST_DEL_SPATIAL_REF

向SPATIAL_REF_SYS表中删除一条空间参考系信息。

语法如下:

procedure ST_DEL_SPATIAL_REF(

  V_SRID INTEGER

);

参数详解

  • V_SR ID空间参考系ID。
  1. ST_geo_valid_check

语法如下:

function ST_geo_valid_check(geo sysgeo.ST_Geometry) return int;

功能说明

检验空间类型对象数据是否是有效。

参数详解

  • geo空间类型对象。
  1. 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);
注意
  1. 不能在MPP全局模式下的存储过程中直接调用,在MPP LOCAL模式下可在存储过程中直接调用;
  2. 不能在存储过程中带参数进行动态调用。

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;
  1. 获取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);
  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属性信息
  1. 解析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);
  1. 创建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);
  1. 将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();

}
微信扫码
分享文档
扫一扫
联系客服