GDAL写矢量图

来源:互联网 发布:中国证券网软件下载 编辑:程序博客网 时间:2024/05/21 11:36

本文主要介绍:利用GDAL库写矢量文件,把栅格图转化为矢量图。

说明:以下程序GDAL版本为Gdal2.0.0,如果使用低版本gdal库,会出现一些问题。

1 相关资源
GDAL官网,ORG相关函数和读写矢量图介绍:http://www.gdal.org/ogr_apitut.html
ORG相关函数及说明的中文资料:OGR入门

2 写矢量函数
所需头文件:

#include "gdal_alg.h"#include "gdal_priv.h"   //添加GDAL库函数的头文件#include "ogrsf_frmts.h"

2.1 shp文件中写多边形

int WritePolygonShp(){    const char *pszDriverName = "ESRI Shapefile";    GDALDriver *poDriver;    GDALAllRegister();    poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName );    if( poDriver == NULL )    {        printf( "%s driver not available.\n", pszDriverName );        exit( 1 );    }    GDALDataset *poDS;    poDS = poDriver->Create( "F:\\point_out.shp", 0, 0, 0, GDT_Unknown, NULL ); //创建数据源    if( poDS == NULL )    {        printf( "Creation of output file failed.\n" );        exit( 1 );    }    OGRLayer *poLayer;    poLayer = poDS->CreateLayer( "point_out", NULL, wkbPolygon, NULL ); //创建图层    if( poLayer == NULL )    {        printf( "Layer creation failed.\n" );        exit( 1 );    }    OGRFieldDefn oField( "Name", OFTString ); //创建属性    oField.SetWidth(32);    if( poLayer->CreateField( &oField ) != OGRERR_NONE )    {        printf( "Creating Name field failed.\n" );        exit( 1 );    }    OGRFieldDefn oField1("PointX", OFTReal);    oField1.SetPrecision(3);    if(poLayer->CreateField(&oField1) != OGRERR_NONE)    {        cout << "Creating Name1 field failed." << endl;        return 0;    }    OGRFeature *poFeature;    poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );    poFeature->SetField( 0, "good" );    poFeature->SetField( 1, 1);    OGRLinearRing ring;    int i = 10;    ring.addPoint(50, 50);      ring.addPoint(100, 100);      ring.addPoint(60, 90);      ring.closeRings();//首尾点重合形成闭合环      OGRPolygon poly;    poly.addRing(&ring);      poFeature->SetGeometry( &poly);     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )    {        printf( "Failed to create feature in shapefile.\n" );        exit( 1 );    }    OGRFeature::DestroyFeature( poFeature );    GDALClose( poDS );    return 0;}

2.2 shp文件中写曲线

int WriteLineStringShp(){    const char *pszDriverName = "ESRI Shapefile";    GDALDriver *poDriver;    GDALAllRegister();    poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName );    if( poDriver == NULL )    {        printf( "%s driver not available.\n", pszDriverName );        exit( 1 );    }    GDALDataset *poDS;    poDS = poDriver->Create( "F:\\point_out.shp", 0, 0, 0, GDT_Unknown, NULL );    if( poDS == NULL )    {        printf( "Creation of output file failed.\n" );        exit( 1 );    }    OGRLayer *poLayer;    poLayer = poDS->CreateLayer( "point_out", NULL, wkbLineString, NULL );    if( poLayer == NULL )    {        printf( "Layer creation failed.\n" );        exit( 1 );    }    OGRFieldDefn oField( "Name", OFTString );    oField.SetWidth(32);    if( poLayer->CreateField( &oField ) != OGRERR_NONE )    {        printf( "Creating Name field failed.\n" );        exit( 1 );    }    OGRFieldDefn oField1("PointX", OFTReal);    oField1.SetPrecision(3);    if(poLayer->CreateField(&oField1) != OGRERR_NONE)    {        cout << "Creating Name1 field failed." << endl;        return 0;    }    OGRFeature *poFeature;    poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );    poFeature->SetField( 0, "good" );    poFeature->SetField( 1, 1);    OGRLineString *lines = new OGRLineString();    lines->addPoint(100, 100);    lines->addPoint(100, 200);    lines->addPoint(200, 150);    poFeature->SetGeometry( lines);     if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )    {        printf( "Failed to create feature in shapefile.\n" );        exit( 1 );    }    OGRFeature::DestroyFeature( poFeature );    GDALClose( poDS );    return 0;}

3 其他
(1) wkb与wkt区别:http://blog.sina.com.cn/s/blog_00ccd2400101c2x8.html
(2) 图层属性可以根据实际需求来设置,可以创建多个属性。

1 0
原创粉丝点击