面空间数据中网格索引和四叉树索引的结合及优化的一种方案

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

针对判断一个点落在面图层中哪个要素上的需求,在我之前的博客:WebGIS中一种根据网格索引判断点面关系的方法(http://www.cnblogs.com/naaoveGIS/p/5148185.html)中有详细的描述。其原理大致为:

            

其处理步骤为:

                    

2.当前网格索引的几个缺点

a.网格索引方案分为了一个索引文件和一个数据文件,任何请求进入时均会先读取索引文件,再读取数据文件,那么很容易出现资源争抢情况,不利于并发支持。

b.网格的大小会严重影响到查询效率,但是如果网格建立的足够小,那么索引文件不断增大,同样会导致磁盘寻址花费的时间增多。

c.数据的读取一定要经过两次IO,一次读索引,一次读数据,会影响读取效率。

3.方案的优化,基于网格索引的索引四叉树划分

四叉树、R树等均是空间索引常用的算法,这里我选择使用四叉索引来进行进一步优化。四叉树索引原理非常简单,即将一个范围根据深度,不断平分,如图所示:

                    

这里优化思路是:将要素首先进行四叉树平分,然后对每个叶子节点包含的范围再进行网格索引生成:

           

4.优化方案的详细描述

4.1索引的生成步骤

a.首先生成数据文件。

b.通过设置的四叉树深度,算出叶子节点的个数。然后通过获取到的要素四角坐标,算出叶子节点的四角范围:leafminx、leafminy、leafmaxx、leafmaxy。

c.根据要素个数和网格因子,算出整个范围内网格的个数,用整个范围的四角坐标与网格因子计算,得出一个网格的BlockXsize和BlokcYsize。

d.针对每个叶子节点,建立该节点的网格索引,索引中包含了网格与要素的对应关系。

生成文件截图:

                       

4.2数据读取

a.读取配置获取到要素的四角范围mapminx、mapminy、mapmaxx、mapmaxy、leafgeoxsize、leafgeoysize。

b.通过mapminx、mapminy、leafgeoxsize、leafgeoysize参数算出该XY坐标所在的网格索引编号。

c.读取该网格索引,获取到该索引的leafminx、leafminy、leafmaxx、leafmaxy、blockxsize、blockysize。

d.通过leafmaxx、leafmaxy以及blockxsize、blockysize算出XY所在网格索引的字节位置pos,将磁盘指针移动至该pos处。

e.获取到索引中包含的要素信息,比如要素所在的数据文件中的datapos。

f.读取数据文件,在该文件的datapos处将详细信息读取返回。

5.方案优点总结

a.将一个大索引文件分成多个索引文件,在大量随机点并发访问时,可以将压力负载至各文件上,减少同一文件读取时的资源争抢IO瓶颈。

b.每一个索引文件大小大大减小,读取会更快,磁盘寻址也会更快。

c.为增加网格命中单个(非多个)要素的概率,可以将每个网格的大小进一步缩小,其导致的网格索引增大会平摊至每个网格索引上,从而使副作用变小。

6.进一步优化

a.在读取索引基本信息后可以将该信息缓存至内存中,减少Config文件的IO次数。

b.生成索引时,如果一个网格只包含了一个要素的信息,可以将该信息也整合至网格索引中。这样,查询时,如果查询到的网格只包含单个要素,则可以直接在索引中将要素信息获取,而不需要再对数据索引做读取操作,减少对数据索引的IO次数。

                                                                         -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                             如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                                           

时间: 2024-09-26 17:27:34

面空间数据中网格索引和四叉树索引的结合及优化的一种方案的相关文章

用Python中的字典来处理索引统计的方法

  这篇文章主要介绍了用Python中的字典来处理索引统计的方法,字典的使用是Python学习当中的基础知识,本文则是相关的一个小实践,需要的朋友可以参考下 最近折腾索引引擎以及数据统计方面的工作比较多, 与 Python 字典频繁打交道, 至此整理一份此方面 API 的用法与坑法备案. 索引引擎的基本工作原理便是倒排索引, 即将一个文档所包含的文字反过来映射至文档; 这方面算法并没有太多花样可言, 为了增加效率, 索引数据尽可往内存里面搬, 此法可效王献之习书法之势, 只要把十八台机器内存全部

在Informix中创建并使用函数索引

随着数据量以惊人速度不断增长,数据库管理系统将继续关注性能问题.本文主要介绍一种名为函数索引(functional index)的性能调优技术.根据数据库使用情况的统计信息创建并使用函数索引,可以显著提升SELECT 查询的性能.通过本文了解如何在IBM Informix Dynamic Server 中创建和使用函数索引并最大限度提升查询性能. 简介 在选择数据库管理系统(DBMS)时,性能是一个关键的考虑因素.在执行SELECT.INSERT.UPDATE 和 DELETE 操作时,很多因素

如何在win7电脑中取消已创建的索引?

  win7 64位旗舰版系统已经面世很久了,想必大家都对win7旗舰版电脑中的索引功能十分的熟悉了吧?是的,很多用户都喜欢使用到win7旗舰版电脑中的索引功能,因为创建索引可以提高咱们搜索的效率,让操作变得更加的方便快捷.那么创建了那么多的索引,没用的是不是应该清理掉呢?下面,小编就来详细的介绍一下,如何在win7旗舰版电脑中取消已创建的索引? 1.首先,咱们单击打开win7旗舰版电脑的开始菜单,之后,咱们点击搜索框,就在开始菜单最下面的位置,之后,咱们在这个搜索框中输入索引.在出现的搜索结果

MySQL优化器中一个Count和覆盖索引的问题

   前天在微薄上发了个优化器的问题,从评论来看,还是需要简单说明一下.     现象说明        其实这里主要要说明的是一个优化器还需要改进的地方.   优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表-回到聚集索引取数据.   基本的做法是:在确定了一个索引后,将select_list和where中出现的所有字段都拿来判断一下,如果字段都存在于sta索引中,则可以使用覆盖索引.   第一个explan可以用上覆盖索引(Using

“/”应用程序中的服务器错误。索引超出了数组界限。

问题描述 "/"应用程序中的服务器错误.索引超出了数组界限. "/"应用程序中的服务器错误. 索引超出了数组界限. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.IndexOutOfRangeException: 索引超出了数组界限. 源错误: [没有相关的源行] 源文件: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727

oracle中如何使用视图,索引,存储过程。 就是说怎么去用或者用在什么地方,请指教

问题描述 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 解决方案 具体你去看书,这里只是简单说说:视图,相当于虚拟的表,你可以把不同的表连接起来得到一个视图,直接像表那样返回数据,而不用写复杂的查询了.索引,顾名思义,对表中的数据预处理,加快查询的速度.存储过程,一组预先写好的sql代码的集合,可以直接调用.存储过程因为是事先写好,并且编译的,所以更快,而且它像函数那样,

SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Scan))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正.   堆表单索引 首先我们构建我们测试需要实验环境,具体情况如下所示: DROP TABLE TEST    CRE

并发操作-a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊

问题描述 a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊 a,b同时查询表,结果是可以注册的,所以都执行了insert,但用户名相同,这样数据就不唯一了.是会这样吗,如何避免呢? 解决方案 把查询和插入放在同一事务中,可以保证整个事务中数据库数据的一致性,这样应该可以避免你说的问题. 上述并发一起的问题,根源在于查询与插入两个时间点数据库数据不一致导致. 解决方案二: 必须有有个不同的key,比如你可以增加一个字段,为userid,这个不会变,但用户名可以

索引库和索引库在搜索引擎中起到什么作用

摘要: 在网络公司做过程序开发的朋友都知道,我们通常用的数据库搜索技术就是把用户输入的词汇,跟数据库中的某个或多个字段里的内容进行比较,同样,搜索引擎的运行原理简单来讲也 在网络公司做过程序开发的朋友都知道,我们通常用的数据库搜索技术就是把用户输入的词汇,跟数据库中的某个或多个字段里的内容进行比较,同样,搜索引擎的运行原理简单来讲也就是这样: 用户输入一个词汇,搜索引擎从他的数据库中找到匹配的内容,再以有序的排列展现给用户,搜索引擎每天就是不厌其烦地不断重复这些操作.看似一切很正常,我们用数据来