空间数据库引擎探究(转自 http://www.goldenbg.com/article.asp?id=819)
把GIS数据放在RDBMS中,但是一般的RDBMS都没有提供GIS的数据类型(如点、线、多边形、以及这些feature之间的拓扑关系和投影坐标等相关信息),RDBMS只提供了少量的数据类型支持:int,float,double,Blog,Long ,char等,一般都是数字,字符串和二进制数据几种。并且RDBMS不仅没有提取对GIS数据类型的存储,也没有提供对这些基础类型的操作(如:判断包含关系,相邻、相交、求差、距离、最短路径等)。
为了实现GIS数据类型的存储和对GIS数据类型的操作支持。我们可以采用曲折的办法来达到这些目的。
1、 存储:把featrue以一个二进制的字段形式存储,同时建立对该二进制数据的描述信息(称为空间元数据)。
2、 操作:为每种feature建立一组函数包。
A、 读取时,先读取空间元数据,根据元数据把featrue的二进制数据填充到featrue对象的data部分中。
B、 写入时,先写入空间元数据,然后把featrue对像的data部分序列化为二进制数据,然后存储到feature字段中。
C、 空间运算:空间运算操作的内容为fatrue对象的data部分,而空间运算做为fatrue类成员函数。或者单独为每种feature建立相关的函数包。
下面我们先探究空间数据类型的存储。存储主要牵涉到的是GIS数据的元数据部分。我们需要管理好各种空间数据。
同种类型的featrue我们归为一类,我们称为featrue类,每个feature类对应着数据库中的一个二进制字段,每个feature对象对应着这个二进制字段的具体数值。为了把GIS的feature的属性数据和空间数据存储到一起,统一管理。我们建立这样几个概念。
数据集:对应着数据库中的一张表,这个表里有featrue的二进制字段和一般的属性字段,同时还包括每个feature对象的元数据字段如:周长、面积以及辅助字段。
数据源:对应着数据库中的一组表,由两部分组成:一部分是数据集,另一部分是对数据集描述的表(称空间元数据表)。通常是每个schma(或者数据库)下一组空间元数据表。
起辅助作用的数据库对象:包括为各个数据集建立的索引、触发器、序列……
空间元数据表包括:
A:描述每个数据集的表:这个表里的字段包括:每个数据集的包围盒。以及对该数据集所建的索引的类型,名称等。
B:描述数据集字段的表:这张表的字段包括:数据集名,字段名称,字段类型,字段别名、数据集别名、数据集类型等……
C:辅助对象的元数据表:包括描述索引与数据集之间关系的表,包括描述触发器与数据集之间关系的表,包括描述序列与数据集之间关系的表。描述数据集之间关系的表(如网路数据集,是由点类型的数据集与线类型的数据集组成,这就需要说明点与线之间的拓扑关系咯)
上面我们只讨论矢量的GIS数据类型的存储,下面我们来探究下栅格类型的GIS数据存储。
同样的也有栅格的数据集,只不过是字段的类型稍微改变了下而已。为了加快数据存取,我们应当使得GIS操作只存取它所需要的数据,以一张遥感影像为例,我们可以把一块大影像按一定规则切割为一系列的小图块,然后把这些小图块以二进制的形式存储到IMAGE字段里,同时把该小图块的偏移位置(有了其实位置,和偏移位置以及每个图块的大小就知道了该图块的地理范围了)作为表的属性字段存储下来。以后在取数据时,需要先查该图块的元数据内容,得出地理范围(或者干脆就把每个图块的地理范围存储下来),这样就知道在显示时需要取哪些记录,然后再把需要显示的记录的IMAGE的数据取出来,根据地理范围把数据拼接起来就可以了(矢量数据的显示与操作也是这么干)。图块大小的划定规则是比较重要的,这非常影响速度的。
一般来讲一个波段,对应着一个栅格数据集。在显示影像时,需要同时读取多个栅格数据集,在显示的时候把它们拼接到一起。
我们还需要描述这些栅格数据集的元数据表,比如,那几个栅格数据集是一组的对应着同一个影像文件,地理坐标的情况怎样,影像金字塔信息。
后面我们讨论下影像金字塔,为了加快数据显示,有些空间数据库引擎是对最原始的数据抽稀,按每一层金子塔抽稀为一个栅格数据集。抽稀一般采用幂级数的方式。这是一种以空间换时间的做法。
对于影像压缩技术,我没有研究过,等过段时间看看再说吧。
有了这些元数据表和feature表后,这就为展开GIS操作奠定了基础。
为了实现GIS数据类型的存储和对GIS数据类型的操作支持。我们可以采用曲折的办法来达到这些目的。
1、 存储:把featrue以一个二进制的字段形式存储,同时建立对该二进制数据的描述信息(称为空间元数据)。
2、 操作:为每种feature建立一组函数包。
A、 读取时,先读取空间元数据,根据元数据把featrue的二进制数据填充到featrue对象的data部分中。
B、 写入时,先写入空间元数据,然后把featrue对像的data部分序列化为二进制数据,然后存储到feature字段中。
C、 空间运算:空间运算操作的内容为fatrue对象的data部分,而空间运算做为fatrue类成员函数。或者单独为每种feature建立相关的函数包。
下面我们先探究空间数据类型的存储。存储主要牵涉到的是GIS数据的元数据部分。我们需要管理好各种空间数据。
同种类型的featrue我们归为一类,我们称为featrue类,每个feature类对应着数据库中的一个二进制字段,每个feature对象对应着这个二进制字段的具体数值。为了把GIS的feature的属性数据和空间数据存储到一起,统一管理。我们建立这样几个概念。
数据集:对应着数据库中的一张表,这个表里有featrue的二进制字段和一般的属性字段,同时还包括每个feature对象的元数据字段如:周长、面积以及辅助字段。
数据源:对应着数据库中的一组表,由两部分组成:一部分是数据集,另一部分是对数据集描述的表(称空间元数据表)。通常是每个schma(或者数据库)下一组空间元数据表。
起辅助作用的数据库对象:包括为各个数据集建立的索引、触发器、序列……
空间元数据表包括:
A:描述每个数据集的表:这个表里的字段包括:每个数据集的包围盒。以及对该数据集所建的索引的类型,名称等。
B:描述数据集字段的表:这张表的字段包括:数据集名,字段名称,字段类型,字段别名、数据集别名、数据集类型等……
C:辅助对象的元数据表:包括描述索引与数据集之间关系的表,包括描述触发器与数据集之间关系的表,包括描述序列与数据集之间关系的表。描述数据集之间关系的表(如网路数据集,是由点类型的数据集与线类型的数据集组成,这就需要说明点与线之间的拓扑关系咯)
上面我们只讨论矢量的GIS数据类型的存储,下面我们来探究下栅格类型的GIS数据存储。
同样的也有栅格的数据集,只不过是字段的类型稍微改变了下而已。为了加快数据存取,我们应当使得GIS操作只存取它所需要的数据,以一张遥感影像为例,我们可以把一块大影像按一定规则切割为一系列的小图块,然后把这些小图块以二进制的形式存储到IMAGE字段里,同时把该小图块的偏移位置(有了其实位置,和偏移位置以及每个图块的大小就知道了该图块的地理范围了)作为表的属性字段存储下来。以后在取数据时,需要先查该图块的元数据内容,得出地理范围(或者干脆就把每个图块的地理范围存储下来),这样就知道在显示时需要取哪些记录,然后再把需要显示的记录的IMAGE的数据取出来,根据地理范围把数据拼接起来就可以了(矢量数据的显示与操作也是这么干)。图块大小的划定规则是比较重要的,这非常影响速度的。
一般来讲一个波段,对应着一个栅格数据集。在显示影像时,需要同时读取多个栅格数据集,在显示的时候把它们拼接到一起。
我们还需要描述这些栅格数据集的元数据表,比如,那几个栅格数据集是一组的对应着同一个影像文件,地理坐标的情况怎样,影像金字塔信息。
后面我们讨论下影像金字塔,为了加快数据显示,有些空间数据库引擎是对最原始的数据抽稀,按每一层金子塔抽稀为一个栅格数据集。抽稀一般采用幂级数的方式。这是一种以空间换时间的做法。
对于影像压缩技术,我没有研究过,等过段时间看看再说吧。
有了这些元数据表和feature表后,这就为展开GIS操作奠定了基础。