文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/html
针对判断一个点落在面图层中哪一个要素上的需求,在我以前的博客:WebGIS中一种根据网格索引判断点面关系的方法(http://www.cnblogs.com/naaoveGIS/p/5148185.html)中有详细的描述。其原理大体为:算法
其处理步骤为:缓存
a.网格索引方案分为了一个索引文件和一个数据文件,任何请求进入时均会先读取索引文件,再读取数据文件,那么很容易出现资源争抢状况,不利于并发支持。微信
b.网格的大小会严重影响到查询效率,可是若是网格创建的足够小,那么索引文件不断增大,一样会致使磁盘寻址花费的时间增多。并发
c.数据的读取必定要通过两次IO,一次读索引,一次读数据,会影响读取效率。优化
四叉树、R树等均是空间索引经常使用的算法,这里我选择使用四叉索引来进行进一步优化。四叉树索引原理很是简单,即将一个范围根据深度,不断平分,如图所示:spa
这里优化思路是:将要素首先进行四叉树平分,而后对每一个叶子节点包含的范围再进行网格索引生成:指针
a.首先生成数据文件。htm
b.经过设置的四叉树深度,算出叶子节点的个数。而后经过获取到的要素四角坐标,算出叶子节点的四角范围:leafminx、leafminy、leafmaxx、leafmaxy。blog
c.根据要素个数和网格因子,算出整个范围内网格的个数,用整个范围的四角坐标与网格因子计算,得出一个网格的BlockXsize和BlokcYsize。
d.针对每一个叶子节点,创建该节点的网格索引,索引中包含了网格与要素的对应关系。
生成文件截图:
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处将详细信息读取返回。
a.将一个大索引文件分红多个索引文件,在大量随机点并发访问时,能够将压力负载至各文件上,减小同一文件读取时的资源争抢IO瓶颈。
b.每个索引文件大小大大减少,读取会更快,磁盘寻址也会更快。
c.为增长网格命中单个(非多个)要素的几率,能够将每一个网格的大小进一步缩小,其致使的网格索引增大会平摊至每一个网格索引上,从而使反作用变小。
a.在读取索引基本信息后能够将该信息缓存至内存中,减小Config文件的IO次数。
b.生成索引时,若是一个网格只包含了一个要素的信息,能够将该信息也整合至网格索引中。这样,查询时,若是查询到的网格只包含单个要素,则能够直接在索引中将要素信息获取,而不须要再对数据索引作读取操做,减小对数据索引的IO次数。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^