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>
Inside GDALAllRegister之三: 注册指定驱动的更多相关文章
- Inside GDALAllRegister之一: 五大部分
基本信息 在GDAL的Tutorial中开篇即提到GDALAllRegister函数,它会注册所有已知的驱动,包括动态库自动加载的驱动.最关键是这句话: If for some application ...
- jdbc如何注册数据库驱动Driver的?
1. 先看看原生jdbc执行sql的步骤 // 在程序启动的时候需要注册一次mysql驱动,必须引入 mysql-connnector-java 的包 Class.forName("com. ...
- Linux make menuconfig查找并快速跳转指定驱动选项
/********************************************************************** * Linux make menuconfig查找并快速 ...
- Inside GDALAllRegister之二: 自动加载驱动
代码 GetGDALDriverManager()->AutoLoadDrivers(); 包含了两部分: 首先获得GDALDriverManager的singleton对象的指针,这点之 ...
- Linux驱动 - SPI驱动 之三 SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...
- 注册jdbc驱动的三种方式
java.sql.DriverManger类简介 java的驱动管理类.管理一组 JDBC 驱动程序. javax.sql.DataSource 接口是 JDBC 2.0 API 中的新增内容,它 ...
- Inside GDALAllRegister之四: 跳过driver
这个函数很短小: /** * \brief This method unload undesirable drivers. * * All drivers specified in the space ...
- [驱动注册]platform_driver_register()与platform_device_register()
[驱动注册]platform_driver_register()与platform_device_register() 设备与驱动的两种绑定方式:在设备注册时进行绑定及在驱动注册时进行绑定. ...
- i2c总线驱动,总线设备(适配器),从设备,从设备驱动的注册以及匹配
常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 随笔分类 ARM裸机(13) C(8) C++(8) GNU-ARM汇编 Linux驱动(24) Linux应用编程(5) Makefile ...
随机推荐
- 【BZOJ 2665】 2665: [cqoi2012]编号(暴力?)
2665: [cqoi2012]编号 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 347 Solved: 217 Description 你需要给一 ...
- 【UOJ #105】【APIO2014】Beads and wires
http://uoj.ac/problem/105 好神的dp啊. 确定一个点为根之后,蓝线只能是竖着的,不能横跨兄弟. 枚举每个点为根进行树形dp是\(O(n^2)\)的,\(f(x,0/1)\)表 ...
- 整数求和 Exercise07_21
import java.util.Scanner; public class Exercise07_21 { /** * @param 冰樱梦 * 时间:2018年12月 * 题目:整数求和 */ p ...
- Codeforces Beta Round #4 (Div. 2 Only) B. Before an Exam dp
B. Before an Exam 题目连接: http://www.codeforces.com/contest/4/problem/B Description Tomorrow Peter has ...
- UESTC 2015dp专题 A 男神的礼物 区间dp
男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descri ...
- tomcat使用Eclipse进行远程调试(线上调试)
什么是远程调试,就是在A机器上利用Eclipse单步跟踪调试B机器上的Web应用,当然调试A机器上Web应用也是没有问题的,90%我都是调试本机的Web应用,远程调试的意义我想我不用说了,大家都会想到 ...
- HDUJ 1392 Surround the Trees 凸包
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- [js插件]分享一个文章内容信息提示插件Colortip
引用 项目中需要一个信息提示的功能,就上网找了一个插件,发现colortip实现比较简单,就定了这个插件. 实现过程 官网:http://tutorialzine.com/2010/07/colort ...
- 【转】OpenCV Mat数据结构
转载自xiahouzuoxin原文 OpenCV基础篇之Mat数据结构 程序及分析 /* * FileName : MatObj.cpp * Author : xiahouzuoxin @163.co ...
- 资源合并fis-postpackager-simple插件的使用
FIS默认只会进行文件打包,不会对页面中的静态资源引用进行替换,这时可以利用fis-postpackager-simple插件进行资源替换. 安装: npm install -g fis-postpa ...