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