您的位置:首页 > 其它

扩展OGR格式驱动(一)-无需外部依赖库

2013-05-11 10:39 162 查看
GDAL/OGR官方网站中给了编写栅格和矢量数据新格式的教程,OGR Driver Implementation Tutorial,但是没有给出具体的编译过程,这篇博文记录如何将新建的格式编入gdal/ogr。

一、继承实现Driver、DataSource、Layer

(1) 实现部分参考OGR Driver Implementation Tutorial,这个教程很详细,另外也可以阅读ogr某些格式的源码了解这一过程。下面这个是一个更为简单的Open方法实现:

int  OGRSPFDataSource::Open( const char *pszFilename, int bUpdate )
{
// --------------------------------------------------------------------
//      Does this appear to be an .spf file?
// --------------------------------------------------------------------
if( !EQUAL( CPLGetExtension(pszFilename), "spf" ) )
return FALSE;
if( bUpdate )
{
CPLError( CE_Failure, CPLE_OpenFailed,
"Update access not supported by the SPF driver." );
return FALSE;
}
std::cout <<"OGRSPFDataSource::Open( const char *pszFilename, int bUpdate )"<<std::endl;
std::cout <<"Trying to open the datasource "<<pszFilename<< " ."<<std::endl;
return TRUE;
}


(2) 这一部分实现后应该形成ogr_spf.h、ogrspfdatasource.cpp、ogrspfdriver.cpp、ogrspflayer.cpp四个源文件,其中头文件ogr_spf.h中最好加上宏定义:

#ifndef _OGR_SPF_H_INCLUDED
#define _OGR_SPF_H_INCLUDED

class OGRSPFDriver : public OGRSFDriver
{
...
}

class OGRSPFDataSource : public OGRDataSource
{
...
}

class OGRSPFLayer : public OGRLayer
{
...
}
#endif /* ndef _OGR_SPF_H_INCLUDED */


ogrspfdriver.cpp文件中则需要添加驱动注册函数定义:

void RegisterOGRSPF()
{
OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRSPFDriver );
}


(3) 修改完成后在ogr\ogrsf_frmts文件夹下创建spf文件夹,将这四个源文件放入其中。

二、修改编译配置文件

(1) 从其他格式文件夹下拷贝makefile.vc和GUNmakefile文件到spf目录下,使用VS或记事本打开修改:

#makefile.vc文件

OBJ = ogrspfdatasource.obj ogrspfdriver.obj ogrspflayer.obj
 EXTRAFLAGS =    -I.. -I..\..
GDAL_ROOT    =    ..\..\..
!INCLUDE $(GDAL_ROOT)\nmake.opt
default:    $(OBJ)
clean:
-del *.obj *.pdb


#GUNmakefile文件
include ../GDALmake.opt
OBJ    =    ogrspfdatasource.o ogrspfdriver.o ogrspflayer.o
 CPPFLAGS    :=    -I.. -I../.. $(GDAL_INCLUDE) $(CPPFLAGS)
default:    $(O_OBJ:.o=.$(OBJ_EXT))
clean:
rm -f *.o $(O_OBJ)
$(O_OBJ):    ogr_spf.h


(2)修改ogrsf_frmts.h和ogrregisterall.cpp文件

在ogrregisterall.cpp中void OGRRegisterAll()函数中添加下面的代码:

#ifdef SPF_ENABLED
RegisterOGRSPF();
#endif


在ogrsf_frmts.h中添加:

void CPL_DLL RegisterOGRSPF();


(3) 修改makefile.vc

打开ogr\ogrsf_frmts\generic\makefile.vc,在BASEFORMATS中添加-DSPF_ENABLED;

打开\ogr\ogrsf_frmts\makefile.vc,在DIRLIST中添加spf,在lib /out:中添加spf\*.obj;

三、检验编译后结果

保存所有修改重新编译gdal/ogr库,在bin下使用ogrinfo --formats命令查看:









转自:/article/5727977.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: