虽然现在硬件发展很快,内存、CPU等硬件指标都有很大的提高,但要PC机上处理GIS海量数据,还是显得比较吃力,而核心问题就在GIS数据的存储和读取上,这里主要涉及到三个子问题:1,图元是按怎样的顺序存储在文件磁盘中的(抑或是随机无规律的);2,对这些图元建立怎样的空间索引,这种索引是稀疏的,还是稠密的;3,读取数据的策略,比如,采用多线程,横向上,对当前窗口周围数据进行预读取,纵向上,对缩放图层的数据进行预读取,还要对最不可能访问的数据,进行淘汰。下面结合ShapeFile文件,来说明前两点。

ShapeFile文件通常包含三个文件:.shp .shx .dbf,.shp存储了图元图形坐标数据,.dbf存储了图元属性数据,.shx存储了每个图元记录在.shp文件中的位置。同时.shp .shx .dbf记录顺序是一致的。在GIS中,总体上有两种类别的查询:

一、图元查属性,就是通过对图元.shp文件的查询,定位到对应的.dbf属性数据记录。而对.shp的查

询,需要对图形建立空间索引,以便加速图元查找的速度。确定需要查找的图元在.shp中的记录位

置,以确定是第多少条记录,由于三文件记录顺序是一致的,同时.dbf记录是等长的,可以迅速通

过计算得到对应的图元属性数据所在的位置,读取属性数据即可。

二、 属性查图元,就是通过对属性数据的查找,来定位到地图上相应的图形。而对.dbf的查询,为

了加快属性数据查找的速度,需要对.dbf文件的相关查询字段建立索引,比如B树索引。返回查询

到的第多少条记录或者记录集合,借助对.shx文件查找(三个文件记录顺序是一致的),直接找出

图形在.shp文件中的位置。

通过以上的分析知道,需要额外建立两个索引:对.shp图形建立的空间索引,对.dbf属性查询字段建立的索引。这两个索引既可以动态在内存中建立,也可以自己定义文件格式,物理地把索引给存储起来,以减少动态建立索引所花费的时间和内存开销。下面重点就.shp文件数据存储以及相应的空间索引的建立与存储,做详细介绍。

一、.shp文件的组织结构和空间索引的结构。

本文采用四叉树的方式来组织图元数据,如图,图中红色矩形方框是图元的MBR(最小外包矩形),采用改进的四叉树索引的方式,把每个图元的MBR分配到不同的节点上,然后按hilbert曲线的排序方式来组织数据,图元在文件磁盘上的排列顺序如下:

18、20、17、19、15、14、12、11、9、8、10、7、13、16、6、4、5、3、2、1、24、26、25、21、22、24  按这样的顺序(即从叶子节点开始,每采集两个子节点,就采集一个父节点,依次迭代上去)把图元数据一一写进文件,所有子节点都是按hilbert排列曲线的顺序来组织的,这样就兼顾了空间邻近的图元,在物理存储上也能尽量保持邻近,同时为了便于对这些数据建立空间稀疏索引,就采用了两个子节点一个父节点的存储顺序方式。那具体怎么建立稀疏空间索引呢?也就是把那棵四叉树,每个节点换成这样一种结构(MBR,对应图元集合在文件中迄始位置,图元集合的个数),稀疏空间索引就建立好了。我们可以把这样一种索引结构用自己定义的索引文件给保存下来,便于以后直接读取还原。

而对大范围的海量数据,需要建立大范围的网格索引,每个网格里关联这样一个线,面四叉树索引结构或者点网格索引结构,这里需要在网格索引的边界对线,面对象进行裁减,以至于不产生冗余数据。

在策略上,采用对象池技术,缓存最有可能被访问到的数据,同时采用线程池,缓存多个线程,提高CPU的工作效率。在横向,纵向两个方向上利用后台预读数据线程来预读数据,同时,为了保持对象池的大小,还要采取淘汰机制,把最不需要读取的数据淘汰出对象池。

这样一种组织方式和索引方式,在PC机运算海量数据,资源相对稀缺的情况下,只需要把空间索引调入内存,内存占用也不会太大,而且实现了大数据量的快速访问,因为空间索引数据量相对较小,数据组织是有规律的,空间索引是稀疏的。

二、属性数据的索引结构

属性查图元,需要建立属性数据的索引,可以采用基于有限状态自动机的Trie结构,建立属性词库,以支持对属性数据的模糊查找。

总结:本文从I/O这一角度,提出了一种新的数据组织与访问方式,为海量数据快速访问提供了一条途径,为了进一步提高效率,把所有图层合并为一个文件,定义新的文件格式,矢量数据的压缩都是进一步提高效率的重要方面,需要作进一步的考虑。

参考文献:

a new algorithm for encoding and decoding the Hilbert order  Ningtao Chen

Nengchao Wang  Baochang Shi  华中科技大学 2006

一种基于改进四叉树的GIS空间选择查询算法 董 鹏 杨崇俊 芮小平 高积粮 计算机工程与应用

空间数据检索在嵌入式GIS中的应用  夏颖 张曙光 张航  计算机应用 2002.12

转自:http://www.gisvip.com/article/2009/0623/article_116.html

GIS海量数据的存储和读取相关推荐

  1. 海量数据的存储和访问解决方案

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV ...

  2. 大数据技术——从海量数据的存储到海量数据的计算

    目录 海量数据的存储 海量数据的计算 大数据处理的主要应用场景 前言:大数据技术诞生之初,就是为了解决海量数据的存储和计算问题. 大数据起源于Google. Google是当时世界上(尽管目前也是)最 ...

  3. paip.odbc DSN的存储与读取

    paip.odbc DSN的存储与读取 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/atti ...

  4. Python Json存储与读取

    前言 Python 中的文件数据存储和读取可以说是非常方便了,这里记录一下 JSon 数据的存储和读取,需要用到的模块就是 json,该模块能够将简单的 Python 数据结构转储到文件中,并在程序再 ...

  5. .Net下二进制形式的文件(图片)的存储与读取 [ZT]

    .Net下图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径: ...

  6. 使用SharedPreferences存储和读取数据

    转:http://www.worlduc.com/blog2012.aspx?bid=19403392 1.任务目标 (1)掌握Android中SharedPreferences的使用方法. 2.任务 ...

  7. C++ STL容器vector篇(三) vector容器大小和数组大小, 插入和删除元素, 存储和读取元素

    vector容器的大小(capacity)和存放数据的大小(size) #include <iostream> #include <vector>using namespace ...

  8. .net 数据存储 mysql_asp.net实现存储和读取数据库图片

    本文实例为大家分享了asp.net存储和读取数据库图片的具体代码,供大家参考,具体内容如下 1. 创建asp.net web窗体项目 代码如下: 上传图片 展示图片 效果图如下: 2. 创建数据库 数 ...

  9. php如何从mongo获取视频文件,使用mongodb对文件(图片、音频、视频)的存储、读取操作...

    使用mongodb对文件(图片.音频.视频)的存储.读取操作 实现代码示例: package mongo.util; import java.io.File; import java.io.IOExc ...

最新文章

  1. css html 优化,CSS Animation性能优化
  2. mysql超详细教程_MySQL8.0.23安装超详细教程
  3. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
  4. 操作系统(李治军) L12内核级线程的实现
  5. 好用的书法字体素材,可以用于各种项目;从商标和品牌到邀请、海报等
  6. 如何完全卸载OneDrive (Windows 10 64bit)
  7. C# 在服务器生成文件/文件夹并压缩下载到本地
  8. 如何在Java语言编程中,如何输入一个char型字符
  9. 计算机技术专业求职简历,计算机技术专业求职简历模板
  10. NDK not configured
  11. c语言大写字母A变小写a流程图,大小写字母转换
  12. dev-c++文件名取名问题(踩坑)
  13. 拉结尔微信开到多少服务器了,拉结尔微信渠道服
  14. (二)Gluster 架构部分(节-1)
  15. Python math 模块与 cmath 模块
  16. 无线系列 - 5G大规模MIMO阵列仿真及混合波束成形设计
  17. 中小企业如何危中求机?接住这套私域流量低成本解决方案!
  18. mysql报1142错误
  19. C语言展开法和全排列法实现n阶行列式计算
  20. 超详细总结,带你实现 Linux 命令自由

热门文章

  1. “工作12年,还是输给小年轻”:IT人的中年职场保卫战,该如何打赢?
  2. Linux Examination
  3. Java程序员被逼迫,挣着卖白菜的钱,操着卖白粉的心,2021年Java常见面试题
  4. VC++控制程控电源2306读取电流
  5. 第四方支付平台有哪些?
  6. C++设计模式----装饰器模式
  7. VMware虚拟机下安装RedHat Linux 9.0
  8. Lorry翻译(day 2)
  9. python怎么做游戏主播_当游戏主播需要什么条件
  10. Swing 入门介绍