这个系列主要在以下三个方面进行介绍:
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空间存储类型主要包括以下几种: