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

首先是測试代码,功能非常easy。两个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. GDAL1.11版本对SHP文件索引加速测试

    GDAL库中对于矢量数据的读取中可以设置一些过滤器来对矢量图形进行筛选,对于Shapefile格式来说,如果数据量太大,设置这个过滤器时间慢的简直无法忍受.好在GDAL1.10版本开始支持读取Shap ...

  2. Coreseek:第二步建索引及測试

    1,建索引非常easy.一行代码 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf   person ...

  3. 一百万数据索引实例測试--mysql

    推荐书籍:http://pan.baidu.com/s/1sjJIyRV 任务描写叙述: 如果一高频查询例如以下  SELECT * FROM user WHERE area='amoy' AND s ...

  4. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  5. 微信或手机浏览器在线显示office文件(已測试ios、android)

    近期开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,可是ios版没有问题.原因是ios版使用的是safari浏览器 支持文档直接打开.可是andriod版使用的是腾讯浏览器x5 ...

  6. 软件測试系统文章(文件夹&amp;链接在此)

    前言 我会在此账号上写一系列关于软件測试的文章,故在此置顶软件測试系列文章的文件夹和链接,以方便大家阅读! 文件夹 软件測试系列之入门篇(一) 软件測试系列之了解篇(二) 软件測试系列之黑白盒(三) ...

  7. C#、C++用GDAL读shp文件(转载)

    C#.C++用GDAL读shp文件 C#用GDAL读shp文件 (2012-08-14 17:09:45) 标签: 杂谈 分类: c#方面的总结 1.目前使用开发环境为VS2008+GDAL1.81 ...

  8. 空间矢量数据(.shp文件)之JAVA操作

    Shape文件由ESRI开发.一个ESRI(Environmental Systems Research Institute)的shape文件包含一个主文件,一个索引文件,和一个dBASE表. 当中主 ...

  9. WFS: postgresql(postgis)和shp文件查询效率对比

    对GeoServer上的WFS的各种数据源查询效率感兴趣,做个测试.本次测试了Postgresql.geopackage.shp文件三种数据源的查询效率,无论是本机还是服务器环境,pg存储查询效率都比 ...

随机推荐

  1. 多线程:pthread_exit,pthread_join,pthread_self

    /*exit_join_id.c*/ #include<pthread.h> #include<stdio.h> void* eji(void* agr) { printf(& ...

  2. 生成ssl证书文件

    网上关于生成SSL证书文件的方法有很多,但我查了几个,发现有或多或少的错误,如下我图文并茂的展示,亲测无任何问题,分享给大家,谢谢. 1.创建根证书密钥文件(自己做CA)root.key openss ...

  3. 虚拟化之KVM virsh常用命令篇

    1,查看运行的虚拟机 virsh list 2,查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all 3,连接虚拟机 virsh console +域名(虚拟机的名称) 4,退出虚 ...

  4. tomcat-maven-plugin 插件使用

    配置 在pom.xm 加入以下xml. <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId&g ...

  5. win7 绿色版MySQL安装与配置

    操作步骤: 一.安装MySQL数据库 1.下载MySQL-5.6.17-winx64.zip文件.2.解压到指定目录,本例为D:\mysql-5.6.17-winx64.3.修改配置文件,my-def ...

  6. 几个因为hadoop配置文件不当造成的错误

    192.168.1.20: Exception in thread "main" java.lang.IllegalArgumentException 192.168.1.20: ...

  7. c语言中的经典算法

    c语言经典排序以及查找方法 冒泡排序 #include <stdio.h> int main() { int i, j, t, a[11]; /*定义变量及数组为基本整型*/ printf ...

  8. A child container failed during start 解决方案

    症状:A child container failed during start 适用问题描述:tomcat挂空可以正常运行,载入项目时挂掉. 相关操作:之前为了省事,由于两个servlet功能类似所 ...

  9. 如何测试sql语句性能,提高执行效率

    有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET ...

  10. Quartz2D介绍

    一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图 ...