zoukankan      html  css  js  c++  java
  • Inside GDALAllRegister之三: 注册指定驱动

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

    #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>
    


  • 相关阅读:
    String的转换问题
    springmvc maven搭建一
    top 使用心得
    spring 之AOP 和继承方法
    xml语法
    tomcat 相关
    json之注意
    javaScript 中创建json/转换字符串为json
    java基础之继承
    vim复制,删除
  • 原文地址:https://www.cnblogs.com/james1207/p/3258079.html
Copyright © 2011-2022 走看看