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信息。这其实是可选项,不是必做项。