图层设置GDAL/OGR创建DXF文件中多图层的方法
2013-06-01 21:02
375 查看
最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--图层设置
在使用GDAL/OGR创立DXF,偶然会将点、线、面数据分到到各自的图层中,或者同类别的要素、对象写到DXF文件中不同的图层。如下图:
![](http://img.blog.csdn.net/20130601130323811)
有人认为新建多个OGRLayer就能够将类别离开,这种观念是错误的,OGRLayer和DXF中的图层不是一个概念。
在写DXF文件时,不支持创立多个ORGLayer图层,一个OGRDXFWriterDS对应一个OGRDXFWriterLayer在new OGRDXFWriterLayer时,OGRDXFWriterLayer构造函数中,会创立DXF标准字段也就是OGRFieldDefn,DXF不支持额定的新建字段:标准字段新建代码(在OGRDXFWriterLayer.cpp中第58-83行):
上面我们做个试验,看以下创立DXF图层的方法,代码如下:
每日一道理
盈盈月光,我掬一杯最清的;落落余辉,我拥一缕最暖的;灼灼红叶,我拾一片最热的;萋萋芳草,我摘一束最灿的;漫漫人生,我要采撷世间最重的———毅力。
![](http://img.blog.csdn.net/20130601130625777)
文章结束给大家分享下程序员的一些笑话语录:
古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟
---------------------------------
原创文章 By
图层和设置
---------------------------------
在使用GDAL/OGR创立DXF,偶然会将点、线、面数据分到到各自的图层中,或者同类别的要素、对象写到DXF文件中不同的图层。如下图:
有人认为新建多个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同目录下 // 也可以设置GDAL_DATA路径 // 按下设置,也可以设置一个正确的相对路径和绝对路径 char **papszOptions = (char **)CPLCalloc(sizeof(char *),3); papszOptions[0] = "HEADER=header.dxf"; papszOptions[1] = "TRAILER=trailer.dxf"; poDS = poDriver->CreateDataSource( "out.dxf", papszOptions ); 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() ); // 生成一个正方形,放置在"正方形"图层 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", "正方形" ); poFeature->SetGeometry( &oSquare ); if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) { printf( "Failed to create feature in shapefile.\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", "三角形" ); poFeature->SetGeometry( &oTriangle ); if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) { printf( "Failed to create feature in shapefile.\n" ); exit( 1 ); } // 生成一个菱形,放置在"三角形"图层 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", "三角形" ); poFeature->SetGeometry( &oRhombus ); if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) { printf( "Failed to create feature in shapefile.\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 shapefile.\n" ); exit( 1 ); } OGRFeature::DestroyFeature( poFeature ); OGRDataSource::DestroyDataSource( poDS ); }
文章结束给大家分享下程序员的一些笑话语录:
古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟
---------------------------------
原创文章 By
图层和设置
---------------------------------
相关文章推荐
- GDAL/OGR创建DXF文件中多图层的方法 .
- GDAL/OGR创建DXF文件中多图层的方法 .
- GDAL/OGR创建DXF文件中多图层的方法
- pb9获取文件创建时间、最后修改时间及设置最后修改时间的方法
- iOS项目头文件创建人的设置方法:Created by lxy on 15-3-24.
- C#用GDAL/OGR库创建与写Shape文件
- 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组
- GDAL读写dxf文件中文乱码问题解决方法(二)
- C#用GDAL/OGR库创建与写Shape文件(转载)
- idea创建新的类(文件)时,自动添加作者创建时间(文件注释)等信息的设置方法
- GDAL写dxf文件中文乱码问题解决方法
- Visual Studio中使用C语言创建dll文件同时创建对应lib索引文件的设置方法
- Windows2003server共享文件设置方法与技巧
- Git中设置全局ingore来忽略.DS_Store文件的方法
- IIS设置允许下载.exe文件解决方法
- Vista与XP局域网文件共享设置方法
- VS2010 MFC中 创建文件夹及文件判空的方法
- 使用代码创建的控件对象,设置的事件监听方法不执行的问题
- django设置静态文件路径方法
- 设置 Linux 文件和目录权限的方法