使用OGR庫建立DXF格式的資料和建立Shp格式的資料基本一樣,代碼除了註冊驅動不一樣之外,其他的完全一樣。
需要注意的是,OGR建立DXF格式需要data檔案夾下的head.dxf,所以首先要設定GDAL_DATA的目錄。使用下面代碼進行設定,也可以直接設定環境變數,但是比較麻煩,還是用代碼設定比較方便:
CPLSetConfigOption("GDAL_DATA","E:\\gdal\\data");
使用上面的設定之後,就可以建立DXF格式的向量資料了,此外還有問題就是,DXF格式不支援屬性工作表,如果建立屬性工作表的話,GDAL會提示建立屬性工作表失敗之類的資訊。下面是建立一個矩形的dxf檔案,代碼如下:
#include "ogrsf_frmts.h"int main(){//設定GDAL_DATA目錄CPLSetConfigOption("GDAL_DATA","E:\\gdal\\data");//定義DXF的驅動const char *pszDriverName = "DXF";//註冊OGR驅動OGRRegisterAll();OGRSFDriver *poDriver;poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName );if( poDriver == NULL ){printf( "%s driver not available.\n", pszDriverName );exit( 1 );}OGRDataSource *poDS; //建立檔案poDS = poDriver->CreateDataSource( "E:\\rect.dxf", NULL );if( poDS == NULL ){printf( "Creation of output file failed.\n" );exit( 1 );}OGRLayer *poLayer; //建立一個圖層,估計DXF可以建立很多個圖層poLayer = poDS->CreateLayer( "rect", NULL, wkbPolygon, NULL );if( poLayer == NULL ){printf( "Layer creation failed.\n" );exit( 1 );}//建立一個要素,由於DXF不支援屬性工作表,就不建立屬性工作表了OGRFeature *poFeature;poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );//建立一個矩形的多邊形OGRLinearRing Ring;Ring.addPoint(0,0);Ring.addPoint(0,100);Ring.addPoint(100,100);Ring.addPoint(100,0);Ring.closeRings();OGRPolygon polygon;polygon.addRing(&Ring);//將多邊形添加到要素中poFeature->SetGeometry( &polygon ); //將要素寫入圖層中if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ){printf( "Failed to create feature in dxf.\n" );exit( 1 );}//釋放要素OGRFeature::DestroyFeature( poFeature );//關閉資料集OGRDataSource::DestroyDataSource( poDS );}
執行完上面的代碼,會在E盤產生一個rect.dxf的檔案,使用QGIS開啟效果如下(電腦沒有安裝AutoCAD,不知道使用CAD開啟是什麼樣子):
此外,使用GDAL開啟dxf檔案有個bug,我提交給GDAL官方了,但是一直沒有解決。總的來說,OGR中的dxf驅動還是不太完善。希望能儘快完善,bug地址:http://trac.osgeo.org/gdal/ticket/4319