高效的使用空间SQL操作空间数据库系列之一

这个系列主要在以下三个方面进行介绍:

1. 为什么要使用空间SQL

2. 空间数据存储类型

3. 如何使用SQL操作GeoDatabase

首先先说一下为什么要使用空间SQL,一提起这个为什么,很多人的第一反应是”快” ,第二反应是”SQL是无所不能的” 。那我分别从这两个反应进行解释,首先是它快,它真的快吗,并不一定,

下面是两个例子:

第一个例子,使用了两个图层,一个是面图层,另一个是点图层,计算面图层下包括了多少个点,

其中点图层的记录为23w条,面图层为1条记录:

SQL> select  count(*) from testpoint;
 COUNT(*)
----------
231772

SQL> select count (*) from testpolygon;
 COUNT(*)
----------
    1

使用st_withins:

SQL> select a.objectid from testpoint a,testpolygon b where st_within(a.shape,b.shape)=1;
 
  OBJECTID
----------
    145049
    106929
    112156
     46694
     73958
    111209
     61971
     54117
 
8 rows selected.
 
Elapsed: 00:00:00.10
使用st_contains:
SQL> select a.objectid from testpoint a,testpolygon b where st_contains(b.shape,a.shape)=1;
 
  OBJECTID
----------
    106929
    111209
    112156
    145049
     46694
     54117
     61971
     73958
 
8 rows selected.
 
Elapsed: 00:00:07.14

使用两种方法的结果一样,但是时间却相差了7s多。

第二个例子,使用st_intersects方法计算出和某一条线相交的线对象的OBJECTID。

该线图层的记录数为270w条记录:

SQL> select count(*) from streets;
 
  COUNT(*)
----------
   2721089

第一个sql:

SQL> ed
Wrote file afiedt.buf
 
  1  select objectid from sde.streets t where sde.st_intersects(t.shape,sde.st_linestring('linestring (-122.37249 37.81789, -122.37177 37.81908)',9))=1
SQL> /
 
 OBJECTID
----------
   2513728
 
Elapsed: 00:00:00.01
 
第二个sql:

SQL> ed
Wrote file afiedt.buf
 
  1  select objectid from sde.streets t where sde.st_intersects(sde.st_linestring('linestring (-122.37249 37.81789, -122.37177 37.81908)',9),t.shape)=1
SQL> /
 
  OBJECTID
----------
   2513728
 
Elapsed: 01:34:37.53
 
使用同一个方法,但是输入的参数的顺序不一样,会导致时间相差1个半小时。
 
从上面两个例子可以看出,并不是所有的SQL都是快的,也有慢的,为什么会慢呢,在后续章节中会进行
详细的介绍。
 
 

那么SQL真的无所不能吗,答案当然是不能了。

SQL能做坐标转换吗,答案不能。

SQL能维护拓扑和网络结构吗,答案不能。

使用SQL添加进去的记录在ArcMap能显示出来吗,答案是不一定,看你的运气了。

那空间SQL到底适合于什么场景呢,在后续章节中会进行详细的介绍。

二. 空间数据存储类型

空间数据存储类型是什么呢,相信很多人在工作中或读书的时候都学过以下所列语言中的一种或者几种:

C:Struct, C++,C#,Java,Flex:Class

空间数据存储类型同c语言中的结构(struct)和面向对象编程语言中的类(class)是类似的。

它主要由以下几个部分构成的:

1. 属性,相当于类中的成员变量,这些属性是由DBMS中的常用数据类型所构成,如ST_GEOMETRY:

SQL> desc sde.st_geometry
 sde.st_geometry is NOT FINAL
 Name                                      Null
?    Type
 ----------------------------------------- -------- --------------
 ENTITY                                             NUMBER(38)
 NUMPTS                                           NUMBER(38)
 MINX                                               FLOAT(64)
 MINY                                               FLOAT(64)
 MAXX                                               FLOAT(64)
 MAXY                                               FLOAT(64)
 MINZ                                               FLOAT(64)
 MAXZ                                               FLOAT(64)
 MINM                                               FLOAT(64)
 MAXM                                               FLOAT(64)
 AREA                                               FLOAT(64)
 LEN                                                FLOAT(64)
 SRID                                               NUMBER(38)
 POINTS                                             BLOB

2.  函数和操作子,相当于类中的成员函数,如ST_GEOMETRY就包括以下的函数:

METHOD
------
 FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 GEOM_STR                       CLOB                    IN
 SRID                           NUMBER                     IN
 
METHOD
------
 MEMBER FUNCTION ST_AREA RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_LEN RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_LENGTH RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_ENTITY RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_NUMPTS RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MINX RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MAXX RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MINY RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MAXY RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MINM RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MAXM RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MINZ RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_MAXZ RETURNS NUMBER
 
METHOD
------
 MEMBER FUNCTION ST_SRID RETURNS NUMBER
 
METHOD
------
 STATIC FUNCTION GET_RELEASE RETURNS NUMBER
 
METHOD
------
 FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CENTER_X                       NUMBER                  IN
 CENTER_Y                       NUMBER                  IN
 CENTER_Z                       NUMBER                  IN
 CENTER_M                       NUMBER                  IN
 SEMIMAJORAXIS                  NUMBER                  IN
 SEMIMINORAXIS                  NUMBER                  IN
 ANGLE                          NUMBER                  IN
 NUMPTS                         NUMBER                  IN
 SRID                           NUMBER                  IN
 
METHOD
------
 FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CENTER_X                       NUMBER                  IN
 CENTER_Y                       NUMBER                  IN
 CENTER_Z                       NUMBER                  IN
 CENTER_M                       NUMBER                  IN
 RADIUS                         NUMBER                  IN
 NUMPTS                         NUMBER                  IN
 SRID                           NUMBER                  IN
 
METHOD
------
 FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 X                              NUMBER                  IN
 Y                              NUMBER                  IN
 Z                              NUMBER                  IN
 M                              NUMBER                  IN
 SRID                           NUMBER                  IN
 
在这些函数和操作子中,可以划分成以下4类:
 
A. Constructor构造函数
 
B. Accessor函数
 
C. Relational空间关系函数
 
D. Geometry函数
 
具体四种函数会在后续章节中介绍。
 
3. 空间索引
 
空间索引是空间存储类型所独有的一种加快空间数据访问的数据库对象,关于空间索引的详细信息会在后续
章节中详细介绍。

 

使用空间存储类型的原因主要有以下几个方面:

A. 空间数据和函数都存储在数据库中,可以提高访问的效率。

B. 空间操作子包括在空间类型中。

C. 常用的应用程序,如c,c++,c#,Java等语言可以直接操作空间数据类型。

ArcSDE所支持的GeoDatabase空间存储类型主要包括以下几种:

高效的使用空间SQL操作空间数据库系列之一_第1张图片

你可能感兴趣的:(sql,数据库,function,存储,float,Constructor)