GDAL 獲取多邊形OGRPolygon的方法

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,然後將所有多邊形求並集,這樣就可以獲取到整個多邊形的外輪廓了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章