GDAL 获取多边形OGRPolygon的方法

本文介绍如何从SHP文件中提取多边形数据,并提供了两种遍历多边形的方法。一种方法用于获取单个多边形,另一种则通过求并集的方式获取整个多边形集合的外轮廓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GIS是一门很大的学问,就拿怎么在SHP文件中获得一个多边形来说,我看了很多的人的博客都是这样的:

OGRFeature *cityOutsideBuildingPoFeature;
while ((cityOutsideBuildingPoFeature = mLayer->GetNextFeature()) != NULL)
{
	OGRGeometry *rdPoGeometry = cityOutsideBuildingPoFeature->GetGeometryRef();
	if (rdPoGeometry != NULL)
	{
		OGRwkbGeometryType pGeoType = rdPoGeometry->getGeometryType();
		OGRPolygon *rdPolygon;
		if (pGeoType == wkbPolygon)//这里就是多边形判断
		{
			rdPolygon = (OGRPolygon*)rdPoGeometry->clone();
		}
		else if (pGeoType == wkbMultiPolygon)  //这里就是带空洞多边形判断
		{
			OGRMultiPolygon * multiPolygon = (OGRMultiPolygon *)rdPoGeometry;
			multiPolygon->closeRings();
			OGRGeometry *FirstGeometry = NULL;
			FirstGeometry = multiPolygon->getGeometryRef(0);
			rdPolygon = (OGRPolygon *)FirstGeometry;
		}
	}
	OGRFeature::DestroyFeature(cityOutsideBuildingPoFeature);
}
我觉得在获得多边形外轮廓时,感觉有点多余了,最终获得的也只是多个多边形中的第一个多边形而已,这不可能达到需求,那怎么获得整个多边形的多轮廓呢,如下:

OGRFeature *cityOutsideBuildingPoFeature;
while ((cityOutsideBuildingPoFeature = _mOCityBuildingLayerOper->mLayer->GetNextFeature()) != NULL)
{
	OGRGeometry *rdPoGeometry = cityOutsideBuildingPoFeature->GetGeometryRef();
	if (rdPoGeometry != NULL)
	{
		OGRwkbGeometryType pGeoType = rdPoGeometry->getGeometryType();
		OGRPolygon *rdPolygon;
		if (pGeoType == wkbPolygon)//这里就是多边形判断
		{
			rdPolygon = (OGRPolygon*)rdPoGeometry->clone();
		}
		else if (pGeoType == wkbMultiPolygon)  //这里就是带空洞多边形判断
		{
			OGRMultiPolygon * multiPolygon = (OGRMultiPolygon *)rdPoGeometry;
			int num = multiPolygon->getNumGeometries();

			rdPolygon = (OGRPolygon *)multiPolygon->getGeometryRef(0);
			for (int i = 1; i < num; i++)
			{
				OGRPolygon *mOGRPolygon = (OGRPolygon *)multiPolygon->getGeometryRef(i);
				rdPolygon = (OGRPolygon *)rdPolygon->Union(mOGRPolygon);
			}
		}	
	}
	OGRFeature::DestroyFeature(cityOutsideBuildingPoFeature);
}
由上代码可以看出,我们需要遍历wkbMultiPolygon,然后将所有多边形求并集,这样就可以获取到整个多边形的外轮廓了


GDAL中,你可以使用多边形来裁剪栅格数据。以下是使用GDAL Python绑定库进行多边形裁剪的一般步骤: 1. 导入必要的库和模块: ```python import ogr import gdal import osr ``` 2. 打开待裁剪的栅格数据和多边形数据: ```python # 打开栅格数据 raster_ds = gdal.Open("input_raster.tif") # 打开多边形数据 polygon_ds = ogr.Open("input_polygon.shp") ``` 3. 获取栅格数据的空间参考系统信息,并根据该信息创建输出栅格数据集: ```python # 获取栅格数据的空间参考系统 raster_srs = osr.SpatialReference() raster_srs.ImportFromWkt(raster_ds.GetProjection()) # 创建输出栅格数据集 clipped_ds = gdal.GetDriverByName("GTiff").Create("output_raster.tif", x_size, y_size, bands, data_type) clipped_ds.SetProjection(raster_srs.ExportToWkt()) clipped_ds.SetGeoTransform(geotransform) ``` 4. 获取多边形图层和要素,以及多边形图层的空间参考系统信息: ```python # 获取多边形图层和要素 polygon_layer = polygon_ds.GetLayer() polygon_feature = polygon_layer.GetNextFeature() # 获取多边形图层的空间参考系统 polygon_srs = polygon_layer.GetSpatialRef() ``` 5. 创建裁剪器,并将多边形的几何形状设置为裁剪器的裁剪区域: ```python # 创建裁剪器 clipper = gdal.Clipper() # 设置裁剪区域为多边形的几何形状 clipper.SetClipGeometry(polygon_feature.GetGeometryRef()) ``` 6. 执行裁剪操作,并将结果写入输出栅格数据集: ```python # 执行裁剪操作 clipper.Clip(raster_ds, clipped_ds) # 关闭数据集 raster_ds = None clipped_ds = None ``` 这只是一个简单的示例,实际的使用可能会根据你的数据和需求有所不同。你可以根据情况进行适当的调整和修改。希望这能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值