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

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

一、继承实现Driver、DataSource、Layer

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

 1  int  OGRSPFDataSource::Open( const char *pszFilename, int bUpdate )
 2  {
 3  // -------------------------------------------------------------------- 
 4   //      Does this appear to be an .spf file?                           
 5   // --------------------------------------------------------------------
 6    if( !EQUAL( CPLGetExtension(pszFilename), "spf" ) )
 7       return FALSE;
 8    if( bUpdate )
 9    {
10       CPLError( CE_Failure, CPLE_OpenFailed, 
11                  "Update access not supported by the SPF driver." );
12       return FALSE;
13    }
14    std::cout <<"OGRSPFDataSource::Open( const char *pszFilename, int bUpdate )"<<std::endl;
15    std::cout <<"Trying to open the datasource "<<pszFilename<< " ."<<std::endl;
16    return TRUE;
17  }

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

 1 #ifndef _OGR_SPF_H_INCLUDED
 2 #define _OGR_SPF_H_INCLUDED
 3  
 4 class OGRSPFDriver : public OGRSFDriver
 5 {
 6      ...
 7 }
 8    
 9 class OGRSPFDataSource : public OGRDataSource
10 {
11     ...
12 }
13   
14 class OGRSPFLayer : public OGRLayer
15 {
16       ...
17 }
18  #endif /* ndef _OGR_SPF_H_INCLUDED */

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

1 void RegisterOGRSPF()
2  {
3     OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRSPFDriver );
4  }

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

二、修改编译配置文件

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

1 #makefile.vc文件
2 
3 OBJ = ogrspfdatasource.obj ogrspfdriver.obj ogrspflayer.obj
4 EXTRAFLAGS =    -I.. -I..\..
5 GDAL_ROOT    =    ..\..\..
6 !INCLUDE $(GDAL_ROOT)\nmake.opt
7 default:    $(OBJ)
8 clean: 
9     -del *.obj *.pdb
1 #GUNmakefile文件
2 include ../GDALmake.opt
3 OBJ    =    ogrspfdatasource.o ogrspfdriver.o ogrspflayer.o
4 CPPFLAGS    :=    -I.. -I../.. $(GDAL_INCLUDE) $(CPPFLAGS)
5 default:    $(O_OBJ:.o=.$(OBJ_EXT))
6 clean: 
7     rm -f *.o $(O_OBJ)
8 $(O_OBJ):    ogr_spf.h

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

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

1 #ifdef SPF_ENABLED 
2     RegisterOGRSPF(); 
3 #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命令查看:

无标题

无标题2

 转自:http://www.cnblogs.com/geosky/archive/2013/05/11/new_ogr_driver.html 

posted @ 2013-05-11 10:39  geosky  阅读(1931)  评论(0编辑  收藏  举报