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. GDAL1.11版本号对SHP文件索引加速測试

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

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

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

  3. geotools导入shp文件到Oracle数据库时表名带下划线的问题解决

    问题: 最近在做利用geotools导入shp文件到Oracle表中,发现一个问题Oracle表名带下划线时导入失败,问题代码行: dsOracle.getFeatureWriterAppend(or ...

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

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

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

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

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

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

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

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

  8. 在Windows下安装64位压缩包版mysql 5.7.11版本的方法

    为了学习数据库,自己去网上下载了最新版本的Windows64位的mysql 5.7.11,但是花了很长的时间在安装的问题上,同时也借鉴了几位前辈的博文来帮助自己解决在安装过程中遇到的问题,安装成功之后 ...

  9. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...

随机推荐

  1. final、finally与finalize的区别

    1. final  在java中,final可以用来修饰类,方法和变量(成员变量或局部变量).下面将对其详细介绍. 1.1 修饰类 当用final修饰类的时,表明该类不能被其他类所继承.当我们需要让一 ...

  2. java线程池的使用

    一.简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.uti ...

  3. html表单验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. MySQL Innodb如何找出阻塞事务源头SQL

    在MySQL数据库中出现了阻塞问题,如何快速查找定位问题根源?在实验开始前,我们先梳理一下有什么工具或命令查看MySQL的阻塞,另外,我们也要一一对比其优劣,因为有些命令可能在实际环境下可能并不适用. ...

  5. Access restriction: The type VerticalTextSpinner is not accessible due to restriction on required library........

    查了下竟然是编译器报错,orz了. Access restriction: 访问限制 on required library: 在依赖库(第三方包) 那就简单了,取消限制就好, eclipse的Win ...

  6. Restful中 @RequestParam,@PathParam,@PathVariable等注解区别

    @RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @P ...

  7. DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)

    这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...

  8. hiredis的各种windows版本

    hiredis的各种windows版本(金庆的专栏 2016.12)hiredis 是内存数据库 redis 的客户端C库, 不支持Windows.hiredis的Windows移植版本有许多:des ...

  9. 计算机网络之IP地址

    IP地址的分类 整个的因特网就是一个单一的.抽象的网络.IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围内唯一的32位的标识符. 所谓分类的IP地址,就是将IP地址划分为 ...

  10. android Handler机制之ThreadLocal详解

    概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...