Inside GDALAllRegister之三: 注册指定驱动

时间:2021-07-28 19:58:03

现在来仔细分析如何注册一个驱动的代码,看下面代码:

#ifdef FRMT_vrt
GDALRegister_VRT();
#endif

编译时指定或者取消FRMT_vrt,可以控制这条语句是否编译到可执行程序中。 在windows上面的用VC++编译器时,可以修改frmts/makefile.vc文件的EXTRAFLAGS值,比如:

EXTRAFLAGS  =-DFRMT_nitf -DFRMT_gtiff -DFRMT_jpeg


因此,我的程序只注册了这三个驱动。

现在看注册函数内部都怎么实现的。迅速看了一下void GDALRegister_GTiff() 函数的代码,主要是创建一个GDALDriver对象,设置属性,然后调用GetGDALDriverManager()->RegisterDriver(poDriver) 将其添加进去。所以,现在可以回答register是什么的问题。就是为每一个driver,创建一个driver对象,添加到singleton对象GDALDriverManager中去。

注意GDALDriverManger的类声明在gdal_priv.h文件中,里面用了双指针保存所有的Driver的指针以方便象数组一样访问,同时用了<key, value> 结构的map也保存了Driver指针,便于用字符串查找。

class CPL_DLL GDALDriverManager : public GDALMajorObject{    int         nDrivers;    GDALDriver  **papoDrivers;    char        *pszHome;    typedef std::map<CPLString, GDALDriver *> NameDriverMap;    NameDriverMap m_NameDriverMap;


GDAL的函数注释都写在cpp文件中,这点很好。我一直都想这么干,这样维护代码的时候都方便啊,不用文件跳来跳去。

int GDALDriverManager::RegisterDriver( GDALDriver * poDriver ) 函数代码实现不复杂,就是存放到容器中。


大的算法就这么简单,现在来细看driver里面存放了什么值,代码:

        poDriver->SetDescription( "GTiff" );        poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "GeoTIFF" );        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "frmt_gtiff.html" );        poDriver->SetMetadataItem( GDAL_DMD_MIMETYPE, "image/tiff" );        poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "tif" );        poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES,                                    "Byte UInt16 Int16 UInt32 Int32 Float32 "                                   "Float64 CInt16 CInt32 CFloat32 CFloat64" );        poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST,                                    szCreateOptions );        poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" );        poDriver->pfnOpen = GTiffDataset::Open;        poDriver->pfnCreate = GTiffDataset::Create;        poDriver->pfnCreateCopy = GTiffDataset::CreateCopy;        poDriver->pfnUnloadDriver = GDALDeregister_GTiff;        poDriver->pfnIdentify = GTiffDataset::Identify;

前面一部分是设置元数据,重要的就是szCreateOptions,这是一个XML字符串,里面信息很多,等到具体理解了GTiff格式才能更进一步明白其含义。本文末尾会贴出来我的程序中用到的szCreateOptions的值。

然后就是设置一些函数指针,有Open, Create, CreateCopy等等。


<CreationOptionList>  <Option name="COMPRESS" type="string-select">    <Value>NONE</Value>     <Value>LZW</Value>     <Value>PACKBITS</Value>     <Value>JPEG</Value>     <Value>CCITTRLE</Value>     <Value>CCITTFAX3</Value>     <Value>CCITTFAX4</Value>     <Value>DEFLATE</Value>   </Option>  <Option name="PREDICTOR" type="int" description="Predictor Type" />   <Option name="JPEG_QUALITY" type="int" description="JPEG quality 1-100" default="75" />   <Option name="ZLEVEL" type="int" description="DEFLATE compression level 1-9" default="6" />   <Option name="NBITS" type="int" description="BITS for sub-byte files (1-7), sub-uint16 (9-15), sub-uint32 (17-31)" />   <Option name="INTERLEAVE" type="string-select" default="PIXEL">    <Value>BAND</Value>     <Value>PIXEL</Value>   </Option>  <Option name="TILED" type="boolean" description="Switch to tiled format" />   <Option name="TFW" type="boolean" description="Write out world file" />   <Option name="RPB" type="boolean" description="Write out .RPB (RPC) file" />   <Option name="BLOCKXSIZE" type="int" description="Tile Width" />   <Option name="BLOCKYSIZE" type="int" description="Tile/Strip Height" />   <Option name="PHOTOMETRIC" type="string-select">    <Value>MINISBLACK</Value>     <Value>MINISWHITE</Value>     <Value>PALETTE</Value>     <Value>RGB</Value>     <Value>CMYK</Value>     <Value>YCBCR</Value>     <Value>CIELAB</Value>     <Value>ICCLAB</Value>     <Value>ITULAB</Value>   </Option>  <Option name="SPARSE_OK" type="boolean" description="Can newly created files have missing blocks?" default="FALSE" />   <Option name="ALPHA" type="boolean" description="Mark first extrasample as being alpha" />   <Option name="PROFILE" type="string-select" default="GDALGeoTIFF">    <Value>GDALGeoTIFF</Value>     <Value>GeoTIFF</Value>     <Value>BASELINE</Value>   </Option>  <Option name="PIXELTYPE" type="string-select">    <Value>DEFAULT</Value>     <Value>SIGNEDBYTE</Value>   </Option>  <Option name="BIGTIFF" type="string-select" description="Force creation of BigTIFF file">    <Value>YES</Value>     <Value>NO</Value>     <Value>IF_NEEDED</Value>     <Value>IF_SAFER</Value>   </Option>  <Option name="ENDIANNESS" type="string-select" default="NATIVE" description="Force endianness of created file. For DEBUG purpose mostly">    <Value>NATIVE</Value>     <Value>INVERTED</Value>     <Value>LITTLE</Value>     <Value>BIG</Value>   </Option>  <Option name="COPY_SRC_OVERVIEWS" type="boolean" default="NO" description="Force copy of overviews of source dataset (CreateCopy())" /> </CreationOptionList>