SQL2008空间数据类型--欧氏几何2类与方法

2  类与方法

在上一篇博客中说道了几何数据类型(点、线、面和集合)的定义,既然几何数据类型是通过CLR来扩展出来的,学习过C#的都知道,一个对象下面会有属性和方法,那么几何数据类型对应的也有其属性和方法。下图就能够反映出这些几何对象的类关系。

image

由于我自己本身对C#比较熟悉(其实其他语言也就不怎么会了),这里我就按照C#的方式来讲一下。

首先要将的是函数。函数分为几种:构造函数、静态函数和实例下的函数。

2.1先说构造函数:

构造geometry对象及其下面的子对象有多种构造函数:通过熟知文本WKT构造、通过熟知二进制WKB构造和通过GML构造。如下语句就是通过WKT构造一个geometry对象。

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT (1 2)', 0);

除了构造geometry对象外,每个子类也有自己的构造函数,下表给出了每个类的通过WKT构造的函数,通过WKB构造的函数类似,这里就不给出了。

image

该表取自OGC官方文档,在SQL2008中使用时函数名前面有ST前缀。比如同样构造一个点1,2 对应是SQL为:

SET @g = geometry::STPointFromText('PoINT (1 2)',0);

构造函数必须与给出的WKT类型对应,这里完全可以认为是C#中做的一个类型转换,如果类型不对应强制转换必然失败,比如:

SET @g = geometry::STLineFromText('PoINT (1 2)',0);--错误的代码

2.2通过构造函数实例化了一个对象后,接下来我们就要调用这个对象的方法了。

由于Geometry类是其他类的父类,所以先说该类的实例方法,这些方法将在其继承的类中同样适用。

  • STAsText 返回实例的WKT表示形式
  • ToString 返回实例的WKT表示形式
  • STAsTextZM 返回实例的WKT表示形式 ,包括Z和M值
  • STAsBinary 返回实例的WKB表示形式
  • STAsGml 返回实例的GML表示形式
  • STGeometryType 返回几何图形的实例类型,字符串,如LineString、Polygon等 ,相当于C#中的GetType().ToString()方法
  • InstanceOf 确定几何图形是否为给定的实例类型,其实就相当于C#中的is关键字。比如SELECT @g.InstanceOf('GEOMETRYCOLLECTION');
  • STIsValid 确定几何图形实例对其实例类型而言格式是否正确,有些申明虽然符合语法但是不符合OGC规定,所以需要用这个来校验。比如SET @g = geometry::STGeomFromText('LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)', 0);就是校验会失败的定义。
  • MakeValid 将几何图形实例转换成具有实例类型的格式正确的几何图形实例,比如上面提到的校验失败的实例就可以使用SET @g=@g.MakeValid();这样系统会将实例转换为MULTILINESTRING ((0 2, 1 1, 2 2), (1 1, 1 0))
  • STDimension 返回实例的最大维度,点是0维,线是1维,面是2维,如果是集合就要看几何中最大的纬度了。比如SELECT @g.STDimension();
  • STSrid是属性,返回实例的SRID值。如:SELECT @g.STSrid
  • STIsEmpty确定实例是否为空,如果为空则返回1,否则返回0。注意这里的空并不是NULL的意思哈。比如SET @g = geometry::STGeomFromText('POLYGON EMPTY', 0); SELECT @g.STIsEmpty();
  • STIsSimple确定实例是否是简单的。所谓简单就是指满足:1.实例的每个图形不能与自身相交,但其终点除外。2.实例的任何两个图形不可在某个点上相交,但两个边界上的点除外。如图左边LineString(1 0,1 2,2 1,0 1)自身相交不是简单的,右边MultiLineString((0 0,0 2,2 2,2 0),(3 0,1 1))两个图形相交也不是简单的。

image

  • STBoundary 返回实例的边界。这里的边界是:1.点和点集合没有边界,返回空几何图形;2.线和线集合边界由起始点和终点形成,并删除那些出现次数为偶数的点,返回MultiPoint类型;3.面和面集合的边界是其环的集合,返回MultiLineString类型。
  • STEnvelope 返回实例的包络线。包络线是一个由实例的最小和最大坐标 (X,Y) 形成的轴对齐矩形,返回一个Polygon类型。对于线和面都好确定最大最小坐标,那么点怎么确定啊?点的包络线实际上就是一个无限小的矩形,比如Point(1 1)的包络线就是POLYGON ((0.999999 0.999999, 1.000001 0.999999, 1.000001 1.000001, 0.999999 1.000001, 0.999999 0.999999))

以上说的就是geometry的方法,接下来说一下子类的方法。

Point类的方法:

  • STX是Point类的属性,返回点实例的 X 坐标。使用如:SELECT @g.STX;
  • STY是Point类的属性,返回点实例的 Y 坐标。使用如:SELECT @g.STY;

Curve类的方法:

  • STStartPoint 返回实例的起始点,也就是定义的第一个点,返回Point类型。
  • STEndpoint 返回实例的终点,也就是定义的最后一个点,返回Point类型。
  • STIsClosed 确定实例是否闭合,也就是起点和终点相同。返回bit类型。
  • STIsRing 确定实例是否为环,所谓环就是要求既是简单的又是闭合的Curve。返回bit类型
  • STLength 返回实例的长度,返回float类型。

LineString类的方法:

  • STNumPoints 返回构成实例的点数。也就是申明LineString时的点的个数,重复的点要重复计数。
  • STPointN 返回实例中的特定点。显然,@g.STStartPoint() 就是@g.STPointN (1),而@g.STEndpoint() 就是@g.STPointN (@g.STNumPoints ())

Surface类的方法:

  • STCentroid 返回多边形实例的几何中心点。也就是返回其重心的坐标,Point类型。
  • STPointOnSurface 返回位于实例上的某个任意点,返回Point类型。这里说的是任意点,但是对于一个图形好像返回的总是同一个点,并不是随机的,只能说返回的点是在图形内,但是具体怎么算的我就不知道了。
  • STArea 返回实例的面积,这个就不用多说了吧,如果中间带孔是要扣除孔的面积的。返回float类型。

PolyGon类的方法:

  • STExteriorRing 返回多边形实例的外环。也就是STBoundary 方法再去掉中间的孔的边界。返回LineString。
  • STNumInteriorRing 返回多边形的内环数。也就是孔的数量。返回int。
  • STInteriorRingN 返回多边形的指定内环。也就是找到其中的一个孔的环,返回的是LineString类型。

GemoColllection类的方法:

  • STNumGeometries 返回几何图形集合实例中的几何图形数目,如果是Point等非集合的实例,则返回1,空实例返回0.使用如:SELECT @g.STNumGeometries();相当于C#中一个数组的Length属性或集合的Count属性。
  • STGeometryN 返回几何图形集合实例中的特定几何图形实例,传入参数n表示要取第几个图形,从1开始计数。对于Point等非集合对象传入1则返回本身。使用如:SELECT @g.STGeometryN(1)。相当于C#中的[n]

MultiCurve类的方法:

  • STIsClosed 确定实例是否闭合,也就是起点和终点相同。返回bit类型,必须集合中的所有Curve都Close了才返回1,否则返回0。
  • STLength 返回实例中所有Curve的长度的总和,返回float类型。

MultiSurface类的方法:

  • STCentroid 返回多边形集合的重心的坐标,Point类型。
  • STPointOnSurface 返回位于集合某实例上的某个任意点,返回Point类型。
  • STArea 返回集合中所有多边形的面积的总和,返回float类型。

这里就把每个类和类下面的方法介绍完了,下一次就讲讲两个对象之间的关系和操作了。


 


 

 

     


     

posted @ 2008-03-20 03:17  深蓝  阅读(806)  评论(0编辑  收藏  举报

我要啦免费统计