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

发布了148 篇原创文章 · 获赞 46 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/liji_digital/article/details/103465407
今日推荐