利用OGRFeature生成shp文件,繪製單條線、多邊形、多條線示例

GDAL的OGRLayer OGRFeature類可以用來繪製SHP文件。在遙感領域裏,利用arcgis軟件可以將shp文件直接顯示出來,也可以與tif文件疊加顯示。本文給出利用gdal繪製單條線、多條線、多邊形的代碼示例。

#include "gdal_priv.h"
#include "ogrsf_frmts.h"

GDALAllRegister();

    const char * pFileName = "shp.tif";
    const char * pszDriverName = "ESRI Shapefile";
    GDALDriver * poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName);
    if(poDriver == NULL)
        return ;
    GDALDataset * poDs = poDriver->Create(pFileName, 0,0,0, GDT_Unknown, NULL);
    if(poDs == NULL)
        return ;

    //wkbPolygon表示繪製多邊形;wkbLinearRing表示繪製線環
    OGRLayer * poLayer = poDs->CreateLayer("ring", NULL, wkbLineString, NULL);//不刪
    if(poLayer == NULL)
    {
        return;
    }


    OGRFeature * poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//放到DestroyFeature刪
    //加入幾何圖形

    //例1,繪製線環,內部不標記顏色.線的繪製原則是,從第一個點開始,逐次繪製直到最後一個點。
    //對於閉合的線環,由於首點和尾點是一個點。所以4邊形繪製需要5個點,首點被重複一次
    OGRLineString line;
    line.setNumPoints(5);
    line.setPoint(0, 0, 1000, 0);//第一個輸入變量是序號,第二、三、四分別是線XYZ座標
    line.setPoint(1, 0, 0, 0);
    line.setPoint(2, 1000, 0, 0);
    line.setPoint(3, 1000, 1000, 0);
    line.setPoint(4, 0, 1000, 0);


    poFeature->SetGeometry(&line);



    //例2,繪製多邊形。多邊形內部亦被顏色標記
    /*OGRPolygon poly;
    std::vector<QPoint> vec;
    vec.push_back(QPoint(0,1));
    vec.push_back(QPoint(1,1));
    vec.push_back(QPoint(1,0));
    vec.push_back(QPoint(0,0));

    OGRLinearRing ring;

    for(int i = 0; i < 4; i++)
    {
        ring.addPoint(vec[i].x(), vec[i].y());
    }

    ring.closeRings();
    poly.addRing(&ring);

    poFeature->SetGeometry(&poly);*/

    //例3 多個線
    /*OGRMultiLineString multiLine;
    OGRLineString line1, line2;
        line1.setNumPoints(5);
        line1.setPoint(0, 0, 1000, 0);//第一個輸入變量是序號,第二、三、四分別是線XYZ座標
        line1.setPoint(1, 0, 0, 0);
        line1.setPoint(2, 1000, 0, 0);
        line1.setPoint(3, 1000, 1000, 0);
        line1.setPoint(4, 0, 1000, 0);
        line2.setNumPoints(5);
        line2.setPoint(0, 500, 1500, 0);//第一個輸入變量是序號,第二、三、四分別是線XYZ座標
        line2.setPoint(1, 500, 500, 0);
        line2.setPoint(2, 1500, 500, 0);
        line2.setPoint(3, 1500, 1500, 0);
        line2.setPoint(4, 500, 1500, 0);
    multiLine.addGeometry((const OGRGeometry *)&line1);
    multiLine.addGeometry((const OGRGeometry *)&line2);
    poFeature->SetGeometry(&multiLine);*/

    if(poLayer->CreateFeature(poFeature) != OGRERR_NONE)
    {
        return;
    }

    OGRFeature::DestroyFeature(poFeature);
    GDALClose(poDs);
    OGRCleanupAll();

用arcgis打開的效果:

對於linux平臺的gdal開發來說,代碼中的字符串pFileName指定了shp文件保存的文件夾。假如不存在將創建一個。shp文件由後面的CreateLayer函數建立。CreateLayer函數的第一個輸入變量代表shp文件的主文件名。第三個變量則給定了這個layer的幾何屬性。

參數取值 含義
wkbLineString 一條連續的線(這條線不一定是直線,可以有多個拐點,但是必須彼此首尾相連。不一定閉合)
wkbPolygon 多邊形。多邊形的內部也被顏色標出
wkbMultiLineString 多條wkbLineString構成。這些線之間不必相交,不必存在任何關聯

隨後的OGRFeature::CreateFeature函數在layer內建立一個抽象的幾何形狀。這個形狀具體是什麼樣子的,要通過SetGeometry來決定。

接下來,通過OGRLayer::CreateFeature函數把幾何形狀信息寫入layer。

寫入之後,Feature就沒用了,調用DestroyFeature釋放。

一個layer中可以包括多個feature.

有人問,那麼Layer要不要也釋放?不要。假如調用DeleteLayer,文件裏面就沒內容了。

最後調用GDALClose關閉數據集。

很多網上的教程提出,在shp文件里加入Field信息。這其實是可選項,不是必做項。

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