1. 程式人生 > >使用GDAL/OGR讀取多邊形資料

使用GDAL/OGR讀取多邊形資料

這裡的多邊形考慮了wkbPolygon和wkbMultiPolygon兩種型別。首先是wkbPolygon型別:

    poPolygon=(OGRPolygon*) poGeometry;
    poPolygon->closeRings();                      //閉合環,使起點與終點重合
    poEnvelope=new OGREnvelope;           //獲取該要素的四至範圍
    poGeometry->getEnvelope(poEnvelope);
    if(0==GNum)
    {
     minX=poEnvelope->MinX;
     minY=poEnvelope->MinY;
     maxX=poEnvelope->MaxX;
     maxY=poEnvelope->MaxY;
    }
    else
    {
     if((poEnvelope->MinX)<minX) minX=poEnvelope->MinX;
     if((poEnvelope->MinY)<minY) minY=poEnvelope->MinY;
     if((poEnvelope->MaxX)>maxX) maxX=poEnvelope->MaxX;
     if((poEnvelope->MaxY)>maxY) maxY=poEnvelope->MaxY;
    }
    int   NumInteriorRings = poPolygon->getNumInteriorRings();   //內環個數    
    //while (NumInteriorRings!=0)                                                             //如果內環個數為零,即是簡單多邊形
     poOGRLinearRing = poPolygon->getExteriorRing(); //內環為零時,簡單多變形的外環即是其多邊形本身
     GPointNum.push_back(poOGRLinearRing->getNumPoints());
     OGRRawPoint *Gpoints=new OGRRawPoint[GPointNum.at(GNum)];
     poOGRLinearRing->getPoints(Gpoints,NULL);
     for (int k=0;k<GPointNum.at(GNum);k++)
     {
      PointX.push_back(Gpoints[k].x);
      PointY.push_back(Gpoints[k].y);
     }
     GNum++;
     delete []Gpoints;

而當有的多邊形物件包含有好幾個多邊形時,則為wkbMultiPolygon。其獲取的方法類似,只不過要判斷該多邊形幾何體中幾何體的個數,得到個數之後再依次迴圈每個幾何體:

int NumMPolygon=MultiPolygon->getNumGeometries();//集合幾何體中幾何體的個數
   for (int i=0; i<NumMPolygon;i++)                                                               //迴圈每個幾何體
   {
             OGRGeometry * FirstGeometry = MultiPolygon->getGeometryRef(i);
     OGRPolygon*poMultiPolygon = (OGRPolygon *)FirstGeometry; 
     OGRLinearRing *poMultiLinearRing = poMultiPolygon->getExteriorRing();
     GPointNum.push_back(poMultiLinearRing->getNumPoints());
     OGRRawPoint *Gpoints=new OGRRawPoint[GPointNum.at(GNum)];
     poMultiLinearRing->getPoints(Gpoints,NULL);
     for (int k=0;k<GPointNum.at(GNum);k++)
     {
      PointX.push_back(Gpoints[k].x);
      PointY.push_back(Gpoints[k].y);
     }
     GNum++;
     delete []Gpoints;    
   }