GDAL/OGR创建DXF文件中多图层的方法 .

来源:互联网 发布:windows hiberfil.sys 编辑:程序博客网 时间:2024/06/06 03:49

转载自博客:http://blog.csdn.net/ivan_ljf/article/details/9177977

有人认为新建多个OGRLayer就可以将类别分开,这种观点是错误的,OGRLayer和DXF中的图层不是一个概念。

在写DXF文件时,不支持创建多个ORGLayer图层,一个OGRDXFWriterDS对应一个OGRDXFWriterLayer在new OGRDXFWriterLayer时,OGRDXFWriterLayer构造函数中,会创建DXF标准字段也就是OGRFieldDefn,DXF不支持额外的新建字段:标准字段新建代码(在OGRDXFWriterLayer.cpp中第58-83行):

[cpp] view plaincopy
  1. // 图层字段,设置此字段,将要素分类到,所设置的图层中,不设置默认为0层  
  2.     OGRFieldDefn  oLayerField( "Layer", OFTString );  
  3.     poFeatureDefn->AddFieldDefn( &oLayerField );  
  4.     // 好像未被使用,不管它  
  5.     OGRFieldDefn  oClassField( "SubClasses", OFTString );  
  6.     poFeatureDefn->AddFieldDefn( &oClassField );  
  7.     // 好像未被使用,也不管它  
  8.     OGRFieldDefn  oExtendedField( "ExtendedEntity", OFTString );  
  9.     poFeatureDefn->AddFieldDefn( &oExtendedField );  
  10.     // 线类型字段  
  11.     OGRFieldDefn  oLinetypeField( "Linetype", OFTString );  
  12.     poFeatureDefn->AddFieldDefn( &oLinetypeField );  
  13.     // 好像未被使用,也不管它  
  14.     OGRFieldDefn  oEntityHandleField( "EntityHandle", OFTString );  
  15.     poFeatureDefn->AddFieldDefn( &oEntityHandleField );  
  16.     //文本字段 好像未被使用,也不管它  
  17.     OGRFieldDefn  oTextField( "Text", OFTString );  
  18.     poFeatureDefn->AddFieldDefn( &oTextField );  
  19.     // 块名称 写块时设置此字段  
  20.     OGRFieldDefn  oBlockField( "BlockName", OFTString );  
  21.     poFeatureDefn->AddFieldDefn( &oBlockField );  
  22.     // 块缩放 写块时设置此字段  
  23.     OGRFieldDefn  oScaleField( "BlockScale", OFTRealList );  
  24.     poFeatureDefn->AddFieldDefn( &oScaleField );  
  25.     // 块角度 写块时设置此字段  
  26.     OGRFieldDefn  oBlockAngleField( "BlockAngle", OFTReal );  
  27.     poFeatureDefn->AddFieldDefn( &oBlockAngleField );  


下面我们做个试验,看以下创建DXF图层的方法,代码如下:

[cpp] view plaincopy
  1. #include "ogrsf_frmts.h"  
  2. #include "stdio.h"  
  3. #include <iostream>  
  4. #include <string>  
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     const char *pszDriverName = "DXF";  
  10.     OGRSFDriver *poDriver;  
  11.   
  12.     RegisterOGRDXF();  
  13.   
  14.     poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(  
  15.         pszDriverName );  
  16.     if( poDriver == NULL )  
  17.     {  
  18.         printf( "%s driver not available.\n", pszDriverName );  
  19.         exit( 1 );  
  20.     }  
  21.   
  22.     OGRDataSource *poDS;  
  23.     // 模板文件名称,文件在GDAL中data下,拷贝到与cpp同目录下  
  24.     char **papszOptions = (char **)CPLCalloc(sizeof(char *),3);  
  25.     papszOptions[0] = "HEADER=header.dxf";  
  26.     papszOptions[1] = "TRAILER=trailer.dxf";  
  27.     poDS = poDriver->CreateDataSource( "out.dxf", papszOptions );//若生成的out.dxf文件正在被CAD打开着,则再次创建时会出错,创建不成功  
  28.     CPLFree(papszOptions);  
  29.     if( poDS == NULL )  
  30.     {  
  31.         printf( "Creation of output file failed.\n" );  
  32.         exit( 1 );  
  33.     }  
  34.   
  35.     OGRLayer *poLayer;  
  36.   
  37.     poLayer = poDS->CreateLayer( "hatch_out", NULL, wkbUnknown, NULL );  
  38.     if( poLayer == NULL )  
  39.     {  
  40.         printf( "Layer creation failed.\n" );  
  41.         exit( 1 );  
  42.     }  
  43.   
  44.     OGRFeature *poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );  
  45.   
  46.     // 生成一个正方形,放置在"Square"图层  
  47.     OGRLinearRing oSquare;  
  48.     oSquare.addPoint(0.0,0.0);  
  49.     oSquare.addPoint(1.0,0.0);  
  50.     oSquare.addPoint(1.0,1.0);  
  51.     oSquare.addPoint(0.0,1.0);  
  52.     oSquare.closeRings();  
  53.     poFeature->SetField( "Layer""Square" );  
  54.     poFeature->SetGeometry( &oSquare );  
  55.     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )  
  56.     {  
  57.         printf( "Failed to create feature in dxffile.\n" );  
  58.         exit( 1 );  
  59.     }  
  60.   
  61.     // 生成一个三角形,放置在"三角形"图层  
  62.     poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );  
  63.     OGRLinearRing oTriangle;  
  64.     oTriangle.addPoint(2.0,2.0);  
  65.     oTriangle.addPoint(3.0,2.0);  
  66.     oTriangle.addPoint(3.0,3.0);  
  67.     oTriangle.closeRings();  
  68.     poFeature->SetField( "Layer""Triangle" );  
  69.     poFeature->SetGeometry( &oTriangle );  
  70.     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )  
  71.     {  
  72.         printf( "Failed to create feature in dxffile.\n" );  
  73.         exit( 1 );  
  74.     }  
  75.   
  76.     // 生成一个菱形,放置在"Triangle"图层  
  77.     poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );  
  78.     OGRLinearRing oRhombus;  
  79.     oRhombus.addPoint(4.0,3.0);  
  80.     oRhombus.addPoint(5.0,4.0);  
  81.     oRhombus.addPoint(4.0,5.0);  
  82.     oRhombus.addPoint(3.0,4.0);  
  83.     oRhombus.closeRings();  
  84.     poFeature->SetField( "Layer""Triangle" );  
  85.     poFeature->SetGeometry( &oRhombus );  
  86.     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )  
  87.     {  
  88.         printf( "Failed to create feature in dxffile.\n" );  
  89.         exit( 1 );  
  90.     }  
  91.   
  92.     // 生成一个多段线,不设置图层,将默认层  
  93.     poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );  
  94.     OGRLinearRing oLinearRing;  
  95.     oLinearRing.addPoint(5.0,5.0);  
  96.     oLinearRing.addPoint(6.0,4.0);  
  97.     oLinearRing.addPoint(7.0,5.0);  
  98.     oLinearRing.addPoint(8.0,4.0);  
  99.     poFeature->SetGeometry( &oLinearRing );  
  100.     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )  
  101.     {  
  102.         printf( "Failed to create feature in dxffile.\n" );  
  103.         exit( 1 );  
  104.     }  
  105.   
  106.     OGRFeature::DestroyFeature( poFeature );  
  107.   
  108.     OGRDataSource::DestroyDataSource( poDS );  
  109. }  


0 0
原创粉丝点击