文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/

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

转载于:https://www.cnblogs.com/naaoveGIS/p/6641449.html

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

  1. GIS空间索引(2)--格网索引与四叉树索引

    在介绍空间索引之前,先谈谈什么叫"索引".对一个数据集做"索引",是为了提高对这个数据集检索的效率.书的"目录"就是这本书内容的" ...

  2. 网格索引 和四叉树索引

    参考链接:https://blog.csdn.net/zhshulin/article/details/19031177 问题:在一个平面层上面,给出一个矩形,找出这个矩形里的所有点. 暴力法:遍历所 ...

  3. geotools应用-JTS生产四叉树索引和R树索引

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 geotools介绍 geotools官网https://geotools.org/ Geotools是一个java类 ...

  4. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景

    1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...

  5. Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引

    hbase-day05 1.bulkLoad实现批量导入 优点: 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bul ...

  6. mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化

    本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...

  7. Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面

    Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录

  8. 如何获取NumPy数组中N个最大值的索引?

    本文翻译自:How do I get indices of N maximum values in a NumPy array? NumPy proposes a way to get the ind ...

  9. php 获取日期标签的值,在php中获取标签的选定索引值

    我试图从< select>中获取所选值在 PHP中标记,但我收到错误. 这就是我所做的, HTML Select Male Female PHP脚本 $Gender = $_POST[&q ...

  10. mysql中groupby会用到索引吗_mysql order by 与索引的使用

    测试数据表 user_group 表结构: id int(10) primarey key auto_increment user_id int(10) (唯一) group_id mediumint ...

最新文章

  1. Windows Android SDK下载安装,配置,异常问题解决教程
  2. 利用Hyperledger Fabric开发你的第一个区块链应用
  3. zoj 3632 Watermelon Full of Water
  4. 对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考
  5. 2019北妈和你:活着就意味必须要做点什么,请好好努力
  6. 做了项目才知道的Cookie和Session
  7. 【面经】关于Transformer,面试官们都怎么问
  8. 用Excel和Python编程完成线性规划问题的求解
  9. 北京内推 | 微软亚洲研究院机器学习组招聘AI药物发现研究实习生
  10. 《沧海一声笑》简谱图修正版
  11. Anbox源码分析(四)——Anbox渲染原理(源码分析)
  12. SAP按库存生产在制品分析
  13. English trip 自习内容 英语时态
  14. Python中的多线程是假的多线程
  15. 基于腾讯云的 Rust 和 WebAssembly 函数即服务
  16. 使用 VMware 16 RHEL7.7 虚拟机静默安装 Oracle 19c RAC
  17. Kali学习 | 漏洞利用:4.4 控制Meterpreter
  18. NBA16大亿元合同:鲨鱼飞侠双份肥约 大将军败坏亿元
  19. DDR2/3的进阶之创建MIG
  20. 计算机网络体系结构-移动IP

热门文章

  1. C++:数组的输入、排序与去重操作
  2. Mysql的SQL语句汇总
  3. c语言 有关文件读/写函数 详解
  4. linux gdb 执行命令,Linux中gdb命令起什么作用呢?
  5. java技术分享ppt_精美PPT制作培训 | 技术二部内部分享
  6. python 评分卡
  7. c语言中的双周期指令,时钟周期 机器周期 指令周期的概念
  8. PHP给下载链接添加内容信息,PHP自动给文章内容添加关联链接方法和示例
  9. 2021-09-03相同的树
  10. git branch/git checkout建立分支