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信息。這其實是可選項,不是必做項。