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

转载于:https://www.cnblogs.com/xiaowangba/archive/2012/07/24/6314007.html

要将OGR格式矢量数据导出为JSON格式,你可以使用`ogr`库中的`ogr2ogr`命令行工具或使用Python中的`ogr`模块来实现。以下是使用`ogr`模块的示例代码: ```python from osgeo import ogr # 输入和输出文件路径 input_file = 'your_input_file.shp' output_file = 'your_output_file.json' # 打开输入数据源 input_ds = ogr.Open(input_file) input_layer = input_ds.GetLayer() # 创建输出数据源 output_driver = ogr.GetDriverByName('GeoJSON') output_ds = output_driver.CreateDataSource(output_file) output_layer = output_ds.CreateLayer('', None, ogr.wkbPolygon) # 复制输入图层的字段定义到输出图层 input_layer_defn = input_layer.GetLayerDefn() for i in range(input_layer_defn.GetFieldCount()): field_defn = input_layer_defn.GetFieldDefn(i) output_layer.CreateField(field_defn) # 复制输入图层的要素到输出图层 for feature in input_layer: output_layer.CreateFeature(feature) # 关闭数据源 input_ds = None output_ds = None ``` 在这个示例中,我们首先指定输入文件路径和输出文件路径。然后,我们使用`ogr`库打开输入数据源,并获取输入图层。 接下来,我们创建输出数据源,并指定输出驱动为GeoJSON。然后,我们创建输出图层,并复制输入图层的字段定义到输出图层。 然后,我们使用一个循环来遍历输入图层中的要素,并将它们复制到输出图层中。 最后,我们关闭输入和输出数据源,完成导出过程。 请确保你已经安装了GDAL库,并将代码中的`your_input_file.shp`替换为你自己的输入矢量数据文件路径,将`your_output_file.json`替换为你想要保存的输出JSON文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值