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行):
- // 图层字段,设置此字段,将要素分类到,所设置的图层中,不设置默认为0层
- OGRFieldDefn oLayerField( "Layer", OFTString );
- poFeatureDefn->AddFieldDefn( &oLayerField );
- // 好像未被使用,不管它
- OGRFieldDefn oClassField( "SubClasses", OFTString );
- poFeatureDefn->AddFieldDefn( &oClassField );
- // 好像未被使用,也不管它
- OGRFieldDefn oExtendedField( "ExtendedEntity", OFTString );
- poFeatureDefn->AddFieldDefn( &oExtendedField );
- // 线类型字段
- OGRFieldDefn oLinetypeField( "Linetype", OFTString );
- poFeatureDefn->AddFieldDefn( &oLinetypeField );
- // 好像未被使用,也不管它
- OGRFieldDefn oEntityHandleField( "EntityHandle", OFTString );
- poFeatureDefn->AddFieldDefn( &oEntityHandleField );
- //文本字段 好像未被使用,也不管它
- OGRFieldDefn oTextField( "Text", OFTString );
- poFeatureDefn->AddFieldDefn( &oTextField );
- // 块名称 写块时设置此字段
- OGRFieldDefn oBlockField( "BlockName", OFTString );
- poFeatureDefn->AddFieldDefn( &oBlockField );
- // 块缩放 写块时设置此字段
- OGRFieldDefn oScaleField( "BlockScale", OFTRealList );
- poFeatureDefn->AddFieldDefn( &oScaleField );
- // 块角度 写块时设置此字段
- OGRFieldDefn oBlockAngleField( "BlockAngle", OFTReal );
- poFeatureDefn->AddFieldDefn( &oBlockAngleField );
下面我们做个试验,看以下创建DXF图层的方法,代码如下:
- #include "ogrsf_frmts.h"
- #include "stdio.h"
- #include <iostream>
- #include <string>
- using namespace std;
- int main()
- {
- const char *pszDriverName = "DXF";
- OGRSFDriver *poDriver;
- RegisterOGRDXF();
- poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(
- pszDriverName );
- if( poDriver == NULL )
- {
- printf( "%s driver not available.\n", pszDriverName );
- exit( 1 );
- }
- OGRDataSource *poDS;
- // 模板文件名称,文件在GDAL中data下,拷贝到与cpp同目录下
- char **papszOptions = (char **)CPLCalloc(sizeof(char *),3);
- papszOptions[0] = "HEADER=header.dxf";
- papszOptions[1] = "TRAILER=trailer.dxf";
- poDS = poDriver->CreateDataSource( "out.dxf", papszOptions );//若生成的out.dxf文件正在被CAD打开着,则再次创建时会出错,创建不成功
- CPLFree(papszOptions);
- if( poDS == NULL )
- {
- printf( "Creation of output file failed.\n" );
- exit( 1 );
- }
- OGRLayer *poLayer;
- poLayer = poDS->CreateLayer( "hatch_out", NULL, wkbUnknown, NULL );
- if( poLayer == NULL )
- {
- printf( "Layer creation failed.\n" );
- exit( 1 );
- }
- OGRFeature *poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
- // 生成一个正方形,放置在"Square"图层
- OGRLinearRing oSquare;
- oSquare.addPoint(0.0,0.0);
- oSquare.addPoint(1.0,0.0);
- oSquare.addPoint(1.0,1.0);
- oSquare.addPoint(0.0,1.0);
- oSquare.closeRings();
- poFeature->SetField( "Layer", "Square" );
- poFeature->SetGeometry( &oSquare );
- if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
- {
- printf( "Failed to create feature in dxffile.\n" );
- exit( 1 );
- }
- // 生成一个三角形,放置在"三角形"图层
- poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
- OGRLinearRing oTriangle;
- oTriangle.addPoint(2.0,2.0);
- oTriangle.addPoint(3.0,2.0);
- oTriangle.addPoint(3.0,3.0);
- oTriangle.closeRings();
- poFeature->SetField( "Layer", "Triangle" );
- poFeature->SetGeometry( &oTriangle );
- if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
- {
- printf( "Failed to create feature in dxffile.\n" );
- exit( 1 );
- }
- // 生成一个菱形,放置在"Triangle"图层
- poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
- OGRLinearRing oRhombus;
- oRhombus.addPoint(4.0,3.0);
- oRhombus.addPoint(5.0,4.0);
- oRhombus.addPoint(4.0,5.0);
- oRhombus.addPoint(3.0,4.0);
- oRhombus.closeRings();
- poFeature->SetField( "Layer", "Triangle" );
- poFeature->SetGeometry( &oRhombus );
- if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
- {
- printf( "Failed to create feature in dxffile.\n" );
- exit( 1 );
- }
- // 生成一个多段线,不设置图层,将默认层
- poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
- OGRLinearRing oLinearRing;
- oLinearRing.addPoint(5.0,5.0);
- oLinearRing.addPoint(6.0,4.0);
- oLinearRing.addPoint(7.0,5.0);
- oLinearRing.addPoint(8.0,4.0);
- poFeature->SetGeometry( &oLinearRing );
- if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
- {
- printf( "Failed to create feature in dxffile.\n" );
- exit( 1 );
- }
- OGRFeature::DestroyFeature( poFeature );
- OGRDataSource::DestroyDataSource( poDS );
- }
0 0
- GDAL/OGR创建DXF文件中多图层的方法
- GDAL/OGR创建DXF文件中多图层的方法 .
- GDAL/OGR创建DXF文件中多图层的方法 .
- 使用gdal的ogr创建shapefile文件(c++)
- GDAL/OGR读DXF中文乱码问题
- GDAL-OGR对shp文件的操作
- C#用GDAL/OGR库创建与写Shape文件
- 使用gdal ogr创建shapefile文件(c++)
- 使用OGR创建dxf格式矢量数据
- GDAL写dxf文件中文乱码问题解决方法
- GDAL读写dxf文件中文乱码问题解决方法(二)
- GDAL\OGR C#中文路径不支持的问题解决方法
- GDAL\OGR C#中文路径不支持的问题解决方法
- GDAL/OGR
- 【GDAL/OGR】利用GDAL/OGR读取shp文件并转换为json文件(Java版)
- 某人的OGR/GDAL blog
- OGR DXF Driver
- Houdini导出DXF文件的方法
- 钢铁侠的成本风险正引爆
- 利用OpenCV将图片反色
- 无聊
- android上方显示进度的进度条
- Codeforces #261 div2 A 题
- GDAL/OGR创建DXF文件中多图层的方法 .
- protobuf,json,xml,binary,Thrift之间的对比 .
- Ubuntu 14.04 LTS root自动登录设置
- 线程同步(2) - 内核模式下的线程同步
- Mysql数据库设计方法、规范与技巧
- android山寨暴风影音UI
- C++中do{...}while(0)的意义和用法
- uva10154 - Weights and Measures(01背包)
- 面试 Advent