当前位置:首页 > 代码相关 > 正文内容

GDAL使用(六)

admin5个月前 (04-30)代码相关267

矢量数据的读取与栅格数据的读取类似,但矢量数据定位明显,属性隐含,几何形状和属性要分开读取。

基本流程如下:

  • 注册驱动。使用GDALAllRegister函数。

  • 打开数据集。使用GDALOpenEx函数。

  • 打开图层。可依据图层名字和图层的索引进行获取,使用GDALDataset::GetLayer和GDALDataset::GetLayerByName函数。

  • 获取要素的定义。实际上就是获取图层的定义,使用OGRLayer::GetLayerDefn函数。

  • 遍历要素。遍历方式有几种,可以使用类中的迭代器迭代,使用OGRLayer::GetNextFeature函数;或者直接通过索引来迭代,使用OGRLayer::GetFeature函数。

  • 获取几何形状及属性信息。使用OGRFeature::GetGeometryRef函数获取几何,依据不同的形状对几何形状进行类型转换。使用OGRFeatureDefn::GetFieldDefn函数获取字段的定义,及字段的类型,再通过OGRFeature::GetFieldAs...进行字段数据的获取。

下面的代码是读取矢量点数据:

#include <ogrsf_frmts.h>
#include <iostream>

using namespace std;

int main()
{
	GDALAllRegister();
	GDALDataset* poDS = (GDALDataset*)GDALOpenEx("C:\\Users\\FXPLL\\Desktop\\shp\\Points2.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);
	if (poDS == NULL)
	{
		printf("Open failed.\n");
		exit(1);
	}

	int layerCount = poDS->GetLayerCount();
	cout << "Layer Count: " << layerCount << endl;
	//获取的是第一个层
	OGRLayer* layer = poDS->GetLayer(0);
	cout << "Layer Name: " << layer->GetName() << endl;
	//获取要素的定义,实际上也就是层的定义
	OGRFeatureDefn* poFeatureDefn = layer->GetLayerDefn();
	//获取字段数量
	int filedCount = poFeatureDefn->GetFieldCount();
	cout << "Field Count: " << filedCount << endl;
	//输出所有字段的名字
	cout << "Print All Field Name: ";
	for (int i = 0; i < filedCount; i++)
	{
		cout << poFeatureDefn->GetFieldDefn(i)->GetNameRef() << " ";
	}
	cout << endl;

	//获取要素个数
	int featureCount = layer->GetFeatureCount();
	cout << "Feature Count: " << featureCount << endl;
	//int fid = 0;
	OGRFeature* feature;
	//使用迭代器迭代每个feature
	while ((feature = layer->GetNextFeature()) != NULL)
	//while (fid < featureCount)
	{
		//feature = layer->GetFeature(fid);
		//fid++;
		OGRFieldDefn* fieldDefination;
		for (int i = 0; i < filedCount; i++)
		{
			//获取字段的定义
			fieldDefination = poFeatureDefn->GetFieldDefn(i);

			if (fieldDefination->GetType() == OFTInteger)
				printf("%d ", feature->GetFieldAsInteger(i));
			else if (fieldDefination->GetType() == OFTInteger64)
				printf(CPL_FRMT_GIB " ", feature->GetFieldAsInteger64(i));
			else if (fieldDefination->GetType() == OFTReal)
				printf("%.3f ", feature->GetFieldAsDouble(i));
			else if (fieldDefination->GetType() == OFTString)
				printf("%s ", feature->GetFieldAsString(i));
			else
				printf("%s ", feature->GetFieldAsString(i));
		}
		cout << endl;

		//获取要素的几何
		OGRGeometry* geometry = feature->GetGeometryRef();
		cout << "Geometry Name: " << geometry->getGeometryName() << endl;

		if (geometry != NULL && wkbFlatten(geometry->getGeometryType()) == wkbPoint)
		{
			OGRPoint* poPoint = (OGRPoint*)geometry;
			printf("%.3f,%.3f,%.3f,%.3f\n", poPoint->getX(), poPoint->getY(), poPoint->getZ(), poPoint->getM());
		}
		else
		{
			printf("no point geometry\n");
		}
		OGRFeature::DestroyFeature(feature);

	}

	GDALClose(poDS);


}

 

版权声明:本文由cyhu's essay发布,如需转载请注明出处。

本文链接:https://lovedm.club/?id=127

相关文章

GDAL使用(三)

GDAL使用(三)

GDALWarp的功能比较强大,可用于影像投影/重投影、图像镶嵌、重采样、规则裁切、图像校正等。GDALWarp API定义在头文件gdalwarper.h中。主要有两部分构成:GDALWarpOpt...

C# 多线程(2)

C# 多线程(2)

Thread类中的join方法:微软官方解释:Join 一个同步方法,该方法阻止调用线程 (即,调用方法的线程) ,直到 Join 调用方法的线程完成。 使用此...

C# 委托

C# 委托

Action和Func是.NET类库的内置委托,以简便使用。Func有17个重载还可以使用delegate关键字创建委托下面的代码展示了这三种使用委托的方法namespace _202003...

C# 与文件相关的几个类(3)

Path类,处理文件或路径的类,是一个静态类。方法:PathChangeExtension(String, String)更改路径字符串的扩展名。返回值为string。Combine(String,...

C# 测量运行时间

使用Stopwatch类进行运行时间的监测要使用 System.Diagnostics 命名空间方法表 4Reset()停止时间间隔测量,并将运行时间重置为零。Restart()停止时间间隔...

C#的类型系统

C#的类型系统

C#的五大数据类型:    类(Class)    结构体(Structures)   &...