• GDAL读写shp文件


    #include "gdal_include/gdal.h"

    #include "gdal_include/ogr_api.h"
    #include "gdal_include/ogrsf_frmts.h"

    #pragma comment(lib, "lib/gdal_i.lib")

    -----------------------------------------

    GDAL读shp文件

    (1) 注册所有的文件格式驱动

    1 GDALAllRegister();
    2 OGRRegisterAll();

    (2)得到shp文件的处理器

    1 OGRSFDriver* poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("ESRI Shapefile");

    (3)打开shp文件

    1 OGRDataSource* poDS = poDriver->Open( "D:\\lakes.shp", NULL );

    (4)获取shp图层

    1 OGRLayer* poLayer = poDS->GetLayer(0);

    (5)读取几何和属性值

    1 OGRFeature * pFeature;
    2  while ((pFeature=poLayer->GetNextFeature())!=NULL)
    3 {
    4 OGRGeometry* pGeometry = pFeature->GetGeometryRef();
    5 if (pGeometry == NULL)
    6 {
    7 AfxMessageBox("Geometry get failed.");
    8 return FALSE;
    9 }
    10
    11 OGRwkbGeometryType geoType = pGeometry->getGeometryType();
    12 if (wkbPoint==geoType)
    13 CString strNodeID = pFeature->GetFieldAsString("NodeID");
    14 else if (wkbLineString==geoType)
    15 {
    16 OGRLineString* pLineGeo = (OGRLineString*)pGeometry;
    17 double staX = pLineGeo->getX(0);
    18 double staY = pLineGeo->getY(0);
    19 }
    20 }

    (6)资源清理

    1 OGRDataSource::DestroyDataSource( poDS );
    2 OGRCleanupAll();

    GDAL写shp文件

    (1) 注册所有的文件格式驱动

    1 GDALAllRegister();
    2 OGRRegisterAll();

    (2)得到shp文件的处理器

    1 OGRSFDriver* poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("ESRI Shapefile");
     

    (3)创建shp文件

    1 OGRDataSource* poDS = poDriver->CreateDataSource( "D:\\lakes.shp", NULL );

    (4)创建图层

    OGRLayer* poLayer= poDS->CreateLayer( "tbLine", NULL, wkbLineString, NULL );

    (5)创建字段

    1 // 字符串
    2  OGRFieldDefn oField1("GeoObjNum",OFTString);
    3 oField1.SetWidth(8);
    4  if( poLayer->CreateField( &oField1 ) != OGRERR_NONE ){
    5 AfxMessageBox( "Creating Name field failed.\n" );return FALSE;}
    6
    7  // 浮点数
    8  OGRFieldDefn oField2("LBTG",OFTReal);
    9 oField2.SetPrecision(3);
    10  if( poLayer->CreateField( &oField2 ) != OGRERR_NONE ){
    11 AfxMessageBox( "Creating Name field failed.\n" );return FALSE;}
    12
    13  // 整型
    14  OGRFieldDefn oField3("Number",OFTInteger);
    15  if( poLayer->CreateField( &oField3 ) != OGRERR_NONE ){
    16 AfxMessageBox( "Creating Name field failed.\n" );return FALSE;}

    (6)创建几何和Feature

    1 OGRFeature *poFeature;
    2 poFeature =new OGRFeature( poLayer->GetLayerDefn() );
    3
    4 poFeature->SetField( "GeoObjNum", strGeoObjNum );
    5 poFeature->SetField( "LBTG", fLBTG );
    6 poFeature->SetField( "Number", number );
    7
    8 OGRLineString *poLine =new OGRLineString();
    9
    10 poLine->setNumPoints(2);
    11 poLine->setPoint(0,startX,startY, 0.0);
    12 poLine->setPoint(1,endX,endY, 0.0);
    13
    14 poFeature->SetGeometryDirectly( poLine );
    15  if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
    16 {
    17 AfxMessageBox("Failed to create feature in shapefile.");
    18 return FALSE;
    19 }

    (7)资源清理

    1 OGRDataSource::DestroyDataSource( poDS );
    2 OGRCleanupAll();
  • 相关阅读:
    Tiling_easy version
    Children’s Queue
    hdu 彼岸
    最小公倍数和最大公约数问题
    hdu 神、上帝以及老天爷
    统计问题
    不容易系列之(3)—— LELE的RPG难题
    hdu 折线分割平面
    hdu Counting Triangles
    Queuing
  • 原文地址:https://www.cnblogs.com/kekec/p/2047601.html
Copyright © 2020-2023  润新知