GDAL1.11版本对SHP文件索引加速测试

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)。

时间: 2024-10-14 05:31:28

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

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

Shape文件由ESRI开发,一个ESRI(Environmental Systems Research Institute)的shape文件包括一个主文件,一个索引文件,和一个dBASE表.其中主文件的后缀就是.shp. Shape文件已经是一种开源的文件格式,官方早在2006年就出版了相应的白皮书,对整个文件的读写进行了详细的说明,这样也使得Shape文件应用的更加广泛.本人在移动GIS开发的过程中,借机对.shp文件进行了研究,并简单实现了通过JAVA语言对.shp文件的读写操作功能. =

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

问题: 最近在做利用geotools导入shp文件到Oracle表中,发现一个问题Oracle表名带下划线时导入失败,问题代码行: dsOracle.getFeatureWriterAppend(oracleTable, Transaction.AUTO_COMMIT); dsOracle为org.geotools.data.DataStore类型对象 解决方案: 网上查阅资料发现是Oracle11的java包ojdbc的版本问题,maven中搜索ojdbc发现最新版如下图 pom配置: <!-

arcgis10.2转shp文件中文乱码问题解决方案

从ArcGIS的数据源入手,自己升级ArcGIS for Desktop到10.2.0,然后用该版本ArcGIS软件重新导出数据,竟然还是乱码.经咨询ArcGIS技术支持,技术支持说必须保证shp文件中有一个.cpg文件.必须要用ArcGIS for Desktop 10.2.1及 以上版本,问题又滚回方案(1)了. 后在ArcGIS知乎平台上看到一篇关于shapefile与字符集编码设置的博客,按照其提供的方案,设置注册表默认字符,即可解决中文乱码问题.其关键步奏如下: 'dbfDefault

图解VC++2012编译安装GDAL1.11.0和入门例子

相关下载 http://pan.baidu.com/s/1o7OEMc6 gdal1.rar - 入门例子 GDAL书籍代码及数据.rar gdal1110.zip - 下载的源码 GDAL.rar - 构建成功后的内容 1 进入如下目录执行vcvars32.bat 2 切换到解压目录执行命令 nmake /f makefile.vc,进行编译:时间比较长:可能10几分钟: 完成编译: 3.设置输出目录 找到下载目录中的nmake.opt文件,例如本文的中的文件路径为: D:\gdal-1.11

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

为了学习数据库,自己去网上下载了最新版本的Windows64位的mysql 5.7.11,但是花了很长的时间在安装的问题上,同时也借鉴了几位前辈的博文来帮助自己解决在安装过程中遇到的问题,安装成功之后,我来总结一下Windows下安装这个版本的步骤,同时也借鉴了几位前辈的博文来帮助解决自己在安装过程中遇到的问题. http://my.oschina.net/happymzw/blog/645198?fromerr=dqUoSnO6 http://www.cnblogs.com/endv/p/52

PostGIS导入导出SHP文件常用命令

SHP导入POSTGIS数据库 引用 直接导入数据库 shp2pgsql  -I -s 2437 -W GBK shop_point.shp public.ntable | psql -U postgres -w -d jwsz 导出sql再导入数据库 shp2pgsql -s "2437" -W "GBK" -I D:\shop_point.shp newTable > D:\shop_point.sql psql -U postgres -f D:/sho

Arcgis Engine建立一个shp文件

这几天同事要求我在原来的项目的基础上添加一个生成shp文件的小功能,大体内容就是他给我提供文件夹路径名和图斑各个点的坐标(只是一个环),根据这些参数来生成一个shp文件.这个功能在刚来公司的时候实现过一次,但是后面一直没用就给忘记了(所以写的代码一定不要删呀,以后肯定用的着). 下面我贴一下建立shp文件的代码,欢迎大家指点. 1: private void CreateShpFile() 2: { 3: IWorkspaceFactory pWF = new ShapefileWorkspac

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

最近在看<linux内 核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了,头都大了只好匆匆看了个头尾(前面 几章和最后一章).看来即使有<九阴真经>这样的武功秘籍,内功不够也是修炼不出来神马来的.于是索性下了个0.11版本的kernel下来尝试编译一 把. linux-0.11.tar.gz 下载地址: 下面开始工作: 1. tar xvfz linux-0.11.tar.gz 2. cd linux-0.11 3. m

低版本ie保存文件时,文件名过长被截断

在工作中有一个下载文件的功能,遇到一个低版本ie保存文件时,文件名过长被截断的问题. asp.net MVC下载文件代码: 1 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath); 2 request.KeepAlive = false; 3 WebResponse response = request.GetResponse(); 4 Stream stream = response.GetR