本人log中所有未注明转载的文章和blog一般为本人原创或整理加工,
原创文章版权本人(lonefox)所有;转载文章版权归原作者所有;
欢迎转载,但请注明出处,保留作者和版权信息。
===================================
最近项目中使用GDAL/OGR库读写mif和tab文件, 经过几天的折腾,积累了点点经验,且记之.
1. OGRSFDriverRegistrar::Open(Path, FALSE);只能读文件
对于OGRSFDriverRegistrar::Open方法, ogr内置的mif/TAB读写库MITAB是不支持该方法的更新的,看下面的MITAB源码:
OGRDataSource *OGRTABDriver::Open(constchar* pszFilename,
intbUpdate )
{
OGRTABDataSource *poDS;
if( bUpdate )//请注意这儿,如果bUpdate为TRUE,则直接返回NULL
{
returnNULL;
}
//other code
}
OGRDataSource *OGRTABDriver::Open( const char * pszFilename,
int bUpdate )
{
OGRTABDataSource *poDS;
if( bUpdate )//请注意这儿,如果bUpdate为TRUE,则直接返回NULL
{
return NULL;
}
//other code
}
再深入源码,你会发现,通过Open方法传给IMapInfoFile类访问文件的方式是TABRead,而非TABWrite
也许你会说"这是OGRTABDriver的方法, 可以看看OGRMIFDriver的方法?", 遗憾, 我们只能用 RegisterOGRTAB(); 注册mif和tab通用的驱动,RegisterOGRMIF();是一个只有定义而没有函数实现的美丽谎言, 不知道OGR库留着这个定义的目的何在。也不存在OGRMIFDriver,OGRTABDriver通吃mif和tab文件。这也是我们的第二点。
2.只使用RegisterOGRTAB();注册tab/MIF文件读写驱动
原因上面已经提过。单凭RegisterOGRTAB();已足够。
mif和tab文件的读取都是通过Open方法,MITAB库内部会调用SmartOpen方法区分是mif/mid后缀或是tab后缀。
3.写mif/tab文件的方法
OGRSFDriver *pDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("MapInfo File");
OGRDataSource *pDSTAB = pDriver->CreateDataSource(strTabPath);//创建一个文件,根据扩展名自动判断是创建mif文件或tab文件
lonefox的解释: MITAB库在实现CreateDataS