GDAL库中对于矢量数据的读取中可以设置一些过滤器来对矢量图形进行筛选,对于Shapefile格式来说,如果数据量太大,设置这个过滤器时间慢的简直无法忍受。好在GDAL1.10版本开始支持读取Shapefile文件的空间索引文件(.sbn / .sbx)来进行加速。下面就同样的数据同样的代码来对GDAL1.9.0和GDAL1.11.0两个版本进行测试时间,比较下速度(看到结果你肯定会张大嘴巴的~~)。

首先是测试代码,功能很简单,两个shp文件,一个点文件,一个面文件。面文件很大,需要根据点文件中的点来查询到对应的面文件中的图形。在此感谢“午夜风”提供的数据进行测试。图1是使用ArcMap打开两个数据显示的效果,图2是两个数据的数据量以及要素个数。

图1 使用ArcMap打开的效果

图2 两个数据的数据量和要素个数

下面是测试代码,只贴出来关键部分的函数。

void SearchSampleDataFromSHP_liml()
{const char* pszPoints = "C:\\Users\\LiMinlu\\Desktop\\SHP\\C5Pointnew.shp";const char* pszPolygs = "C:\\Users\\LiMinlu\\Desktop\\SHP\\C5.shp";// 注册驱动以及配置项CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");CPLSetConfigOption("SHAPE_ENCODING","");OGRRegisterAll();//打开两个数据OGRSFDriver* poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("ESRI Shapefile");OGRDataSource* pPntDS = poDriver->Open(pszPoints, false);if (pPntDS==NULL){cout<<"打开文件:" <<pszPoints << "失败"<<endl;return ;}OGRDataSource* pPlgDS = poDriver->Open(pszPolygs, false);if (pPlgDS==NULL){cout<<"打开文件:" <<pszPolygs << "失败"<<endl;return ;}OGRFeature *pPntFeature = NULL, *pPlgFeature = NULL;OGRLayer* pPntLayer = pPntDS->GetLayer(0);pPntLayer->ResetReading();pPntFeature = pPntLayer->GetFeature(0);int nFeildCount = pPntFeature->GetFieldCount();int nFeatureCount = pPntLayer->GetFeatureCount();OGRLayer* pPlgLayer = pPlgDS->GetLayer(0);pPlgLayer->ResetReading();pPlgFeature = pPlgLayer->GetFeature(0);int nPlgFeildCount = pPlgFeature->GetFieldCount();for (int i=0;i<nFeatureCount; i++){pPntFeature = pPntLayer->GetFeature(i);double dValue = pPntFeature->GetFieldAsDouble(nFeildCount-1);OGRPoint *pPoint = (OGRPoint *)pPntFeature->GetGeometryRef();//设置面图层的过滤属性pPlgLayer->ResetReading();pPlgLayer->SetSpatialFilter((OGRGeometry*)pPoint); pPlgFeature = pPlgLayer->GetNextFeature();if(pPlgFeature == NULL){OGRFeature::DestroyFeature(pPntFeature);continue;}OGRFeature::DestroyFeature(pPntFeature);OGRFeature::DestroyFeature(pPlgFeature);}OGRDataSource::DestroyDataSource(pPntDS);OGRDataSource::DestroyDataSource(pPlgDS);
}

下面是main函数以及输出时间的一个小函数。

void ShowTime()
{time_t t = time(0); char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X", localtime(&t) ); puts( tmp );
}int _tmain(int argc, _TCHAR* argv[])
{ShowTime();SearchSampleDataFromSHP_liml();ShowTime();system("pause");return 0;
}

首先来看看使用GDAL1.9.0版本的时间,处理时间如图3所示。(注意,以下测试时间全部使用Release版本进行测试所得)

图3 使用GDAL1.9.0所用时间

再看看GDAL1.11.0所用的时间,处理时间如图4所示。

图4 使用GDAL1.11.0所用时间

由上面两个处理时间可以看到,在GDAL1.11.0版本处理时间大幅度提高(100倍啊),所以用到了空间索引这块的同学还是将GDAL的版本更新一下吧。

我们知道shapefile文件一般必须的是3个文件,后缀名是shp、dbf和shx。如果数据有投影信息的话再加一个prj文件。这种标准的shp文件是我们常用的,使用GDAL创建的话也会生成这么几个文件。但是当用ArcMap打开的时候,会自动多出来几个文件,后缀名是sbn和sbx,可能还有个xml文件。如图2所示。这两个文件就是ArcMap自动生成的空间索引文件(ESRI spatial index files)。

按照GDAL的官方文档说明,目前GDAL库只支持读取空间索引文件,还不支持创建,所以如果要处理大数据量的shp文件,可以先用ArcMap打开让其创建好空间索引文件再用GDAL处理。此外GDAL还支持读写UMN MapServer使用的四叉树索引文件(.qix)。具体可以参考GDAL官网中的Shapefile格式页面(网址是:http://www.gdal.org/drv_shapefile.html)。

GDAL1.11版本对SHP文件索引加速测试相关推荐

  1. MATLAB--读取2.11版本卫星观测值文件

    卫星观测值文件简介 头文件数据 我们需要读取第一行的版本号2.11,第11行的观测值类型.其余数据无需读写 观测值数据 上图为一个时刻的观测值数据,以上图数据为例,75行到108行数据为一组数据,观测 ...

  2. Shp文件导入MySql数据库工具包,只是针对于8.0+以上版本定制开发

    由于最新的geotools工具类不支持8.0+以上的MySQL数据库,故而开发该工具用于数据处理.采用javaFX开发的一个很简单的数据导入工具,对于5.0+的版本,大家参考网上的相关代码即可,也可在 ...

  3. .shp文件的存储结构是怎样的?底层读取shapefile文件

    .shp文件的存储结构是怎样的?底层读取shapefile文件 基础知识 shp的存储结构 python 字节流读取Shp文件 基础知识 大家都比较熟悉shp文件,它是GIS软件可以读取的矢量文件.但 ...

  4. shp文件导入Oracle并发布到Geoserver

    将shp文件导入oracle中,并发布到geoserver上 1. 环境准备 1.1 环境介绍 Oracle 11g Geoserver 2.11.1 1.2 软件准备 首先需要安装支持空间数据的or ...

  5. shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言

    博客背景和目的 最近在用C++写一个底层的东西,需要读取和创建shp文件.虽然接触shp文件已经几年了,但是对于shp文件内到底包含什么东西一直是一知半解.以前使用shp文件都是利用软件(如ArcGI ...

  6. Geotools简介以及quickstsrt加载shp文件并显示

    场景 Geotools Geotools是一个java类库,它提供了很多的标准类和方法来处理空间数据,同时这个类库是构建在OGC标准之上的,是OGC思想的一种实现. 而OGC是国际标准,所以geoto ...

  7. osm服务器 显示乱码,怎样获得osm上的行政区划shp文件

    2018.4.18 :刚刚发现我这里的wifi(电信的宽带)打不开下面的其中几个网站,需要使用网络工具才行.  但是用手机流量(联通)是可以直接打开的. 2018.1.25 :方法二的网站又恢复了. ...

  8. shp文件中polyline是什么_shp文件的读取

    首先了解一下shp文件的一些简单知识 Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件. Shapefile将空间特征表中的非拓扑几何对象 ...

  9. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

最新文章

  1. 卡尔曼滤波器的特殊案例
  2. .on(#39;click#39;)与.click()之间的区别
  3. Hdu-6249 2017CCPC-Final G.Alice’s Stamps 动态规划
  4. oralce创建用户
  5. 前沿实践:垃圾回收器是如何演进的?
  6. mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库
  7. aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案
  8. vue.js 使用axios实现下载功能
  9. 为什么要返回function_宇宙飞船返回时,为什么要冒着烧毁的风险加速穿过大气层?...
  10. java实现最小二乘法
  11. javacore分析工具_线上死锁定位分析
  12. 万年历c语言 输出单月,求帮忙差错,打印万年历,输入某年某月,打印该月日历...
  13. android studio更改代码字体,Android Studio怎么改变代码字体大小?
  14. Matlab实现图像高斯滤波(公开代码)
  15. SSH使用教程( Bitvise Tunnelier+Chrome+Proxy Switchy)
  16. 怎么用PS为一寸证件照更换底色背景色
  17. 基于java web的实验室设备管理系统的设计与实现
  18. 基于Cocos2d-x实现的畜不及防鬼畜音乐节奏游戏
  19. rosetta_ddg 使用-rosetta 2020版
  20. 爱班级电脑端下载|二维码签到

热门文章

  1. python urllib下载文件怎么停止_python下载文件的三种方法
  2. 普林斯顿大学计算机科学研究生条件,普林斯顿大学之计算机科学系
  3. 洛希极限 (10 分)
  4. Angular在FormGroup中使用ngModel失效报错问题的解决办法
  5. java 获取xml 版本号_java解析xml获取对应值
  6. 组网胖模式_胖AP和瘦AP的区别,组网优缺点分析
  7. 接触网作业车司机许新峰的春运
  8. 【hyddd驱动开发学习】DDK与WDK
  9. Noip 2016 Day1 题解
  10. mysql 容灾 灾备 备份