zoukankan      html  css  js  c++  java
  • 使用OGR创建dxf格式矢量数据

            使用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

  • 相关阅读:
    C#和SqlServer中处理时间格式问题
    ReadOnly之后获取文本框的值
    asp.net给Reaper和GridView添加序号
    SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
    asp.net获取服务器信息
    Repeater嵌套
    开博说明 拓荒者
    Git的深入理解与GitHub托管服务的使用
    Hadoop学习笔记一:单节点安装
    VirtualBox克隆后无法找到网卡的问题
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314007.html
Copyright © 2011-2022 走看看