zoukankan      html  css  js  c++  java
  • 再说空间数据库索引

      网上对GIS空间数据库索引的介绍已经不少,但觉得理论上的文章比较多,但是对于自己设计空间数据库的朋友来说可能还是比较迷茫,因为我就是这么过来的。我是GIS专业的,而且毕业后也做GIS的开发,两年前开始在开源的基础上做自己的GIS平台。在比较长一段时间里,对空间数据库的索引还是想不透理不清,当时也查了很多关于空间索引的资料,像四叉树、R树索引等等,这些都能理解,在内存中创建这样的空间索引也不是问题。但是在关系数据库中呢?怎么保存索引、空间查询的时候怎么构造SQL语句?

      后来看了很多资料,也参考了SuperMap、ArcSDE的空间数据库表结构,还是实现了自己的空间数据库,空间索引部分就用了网格索引。但是查询的效率只能所过得去,还能用。为此不久前花时间认真研究了一下ArcSDE的空间数据库,然后根据研究所得修改了自己的表结构和查询方法,果然效率提高了不少,经测试对比一个40多万条记录的多边形数据集,单查询效率来说跟ArcSDE For SQLServer(9.2版本)差不多了。我是从下面三方面研究ArcSDE的:

      首先是表的索引部分,它对S表的全部字段都做了聚集索引,索引顺序是:gx、gy、eminx、eminy、emaxx、emaxy、fid,f表只对Fid做了索引。s表是索引表,gx和gy分别是网格的x、y方向的编号。按这种方式创建索引,也就是根据对象的位置做了排序,空间查询速度就快。

      第二是查询语句,使用SQL Server Profiler跟踪ArcSDE执行空间查询的语句,整理后为下面的语句:

    SELECT S_.eminx,S_.eminy,S_.emaxx,S_.emaxy ,SHAPE.fid
    F_fid,SHAPE.numofpts F_numofpts,SHAPE.entity F_entity,SHAPE.points F_points
    FROM (
    SELECT DISTINCT sp_fid,eminx,eminy,emaxx,emaxy
    FROM SDE.DBO.s4 SP_  WHERE 
    ((SP_.gx >= 142999 AND SP_.gx <= 143006 AND SP_.gy >= 305816 AND SP_.gy <= 305820   )
    OR (SP_.gx >= 16805815 AND SP_.gx <= 16805817 AND SP_.gy >= 16838379 AND SP_.gy <= 16838380 ))
    AND SP_.eminx <= 58632814965 AND SP_.eminy <= 125386431847 AND SP_.emaxx >= 58629906932 AND SP_.emaxy >= 125384733936) S_ , SDE.DBO.f4 SHAPE
    WHERE S_.sp_fid = SHAPE.fid

    其中红色部分是对网格的过滤,这个图层的所有设置了两层网格,所以会有Or连接起来的两个部分;蓝色部分是几何对象范围的相交查询。当然,它的网格计算方式是怎么样的我就不知道了,而且为什么查询矩形的值是这个样子也搞不清楚,“58632814965 ”这个数字明显不是坐标,肯定进过转换的。之前我自己的空间查询语句只有网格的部分,后面的相交查询没有,而且只有一层网格。加上对象矩形的相交查询,初步得到的记录就会比较少,减少后期过滤的记录。

      第三是网格大小计算,以前网格的计算是参考瓦片地图的哪种方式做的,而且算法不好得到的结果不合理。后来网上找到ArcSDE网格大小优化的资料,根据上面的例子重写了这部分。参考:http://blog.csdn.net/yanleigis/article/details/2669751

      通过这次ArcSDE的研究,让我对空间数据库索引的理解更进一步。在关系数据库中,空间索引一般都是网格索引,这中索引容易在数据库中存储;空间数据库的查询效率更多的还是依赖数据库系统的索引机制,然后就是网格大小的计算和多层网格的应用,只有合适的网格划分才能达到最好效果。


    《远景地理信息系统|RemoteGIS》

     RemoteGIS是基于HTML5开发的高性能WEBGIS,支持百万级别矢量数据。

     详细介绍和在线演示地址:www.remotegis.net


  • 相关阅读:
    AC自动机模板
    2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)
    Codeforces126B
    Codeforces182D
    Codeforces149E
    POJ3080
    POJ2752
    HDU4745
    HDU4737
    POJ1226
  • 原文地址:https://www.cnblogs.com/shawy/p/2130079.html
Copyright © 2011-2022 走看看