• gdal 测试代码


    #include "ogrsf_frmts.h"
    #include "gdal.h"
    #include "gdal_priv.h"
    #include "cpl_string.h"
    #include <string>
    #include <iostream>
    #include <strstream>

    using namespace std;

    // 参考
    //https://blog.csdn.net/taiyang1987912/article/details/72751102

    //引用
    //https://blog.csdn.net/ivan_ljf/article/details/9620681

    //https://www.cnblogs.com/bigbigtree/archive/2011/12/07/2278721.html
    void createPoint()
    {
     const char *pszDriverName = "ESRI Shapefile";
     OGRSFDriver *poDriver;
     
     OGRRegisterAll();
     
     poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
     if( poDriver == NULL )
     {
      printf( "%s driver not available. ", pszDriverName );
      exit( 1 );
     }
     OGRDataSource *poDS;
     poDS = poDriver->CreateDataSource( "point_out.shp", NULL );//但文件夹中以前存在point_out.shp文件时会报错;
     if( poDS == NULL )
     {
      printf( "Creation of output file failed. " );
      exit( 1 );
     }
     
     OGRLayer *poLayer;
     poDS->CreateLayer( "point_out_layer", NULL, wkbPoint, NULL );
     poLayer=NULL;
     poLayer = poDS->GetLayer(0);//shp文件只有一个图层;
     if( poLayer == NULL )
     {
      printf( "Layer creation failed. " );
      exit( 1 );
     }
     
     OGRFieldDefn oField( "NAME", OFTString );
     
     oField.SetWidth(32);
     
     if( poLayer->CreateField( &oField ) != OGRERR_NONE )
     {
      printf( "Creating Name field failed. " );
      exit( 1 );
     }
     
     double x, y;
     char szName[33];
     cout<<"输入:x,y,name"<<"(Example:30,30,lu)"<<"逗号为英文下的逗号,否则按回车便结束程序"<<endl;
     cout<<"要想结束输入,按ctrl+d,再按回车键"<<endl;
     while( !feof(stdin) // stdin文件流的结束符按ctrl+d,这样便结束while循环;
      && fscanf( stdin, "%lf,%lf,%32s", &x, &y, szName ) == 3 )
     {
      OGRFeature *poFeature;
      poFeature=OGRFeature::CreateFeature(poLayer->GetLayerDefn());//必须用CreateFeature来生成对象,用new生成对象出错
      //poFeature = new OGRFeature( poLayer->GetLayerDefn() );//必须用CreateFeature来生成对象,用new生成对象出错
      poFeature->SetField( "NAME", szName );
     
      OGRPoint pt;
     
      pt.setX( x );
      pt.setY( y );
     
      poFeature->SetGeometry( &pt );
     
      if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
      {
       printf( "Failed to create feature in shapefile. " );
       exit( 1 );
      }
     
      OGRFeature::DestroyFeature( poFeature );
     }
     
     OGRDataSource::DestroyDataSource( poDS );
    }

    //https://blog.csdn.net/q_l_s/article/details/52516704
    void readPoint()
    {
     OGRRegisterAll();
     
     OGRDataSource *poDS;
     
     //poDS = OGRSFDriverRegistrar::Open( "C:\Users\Administrator\Desktop\VC\testshape\testshape\point_out.shp", FALSE );//shape文件存放的路径(point.shp即为自己创建的文件)
     //poDS = OGRSFDriverRegistrar::Open( "C:\Users\Administrator\Desktop\图层数据\Node.shp", FALSE );
     poDS = OGRSFDriverRegistrar::Open( "point_out.shp", FALSE );//shape文件存放的路径(point.shp即为自己创建的文件)
     if( poDS == NULL )
     {
      printf( "Open failed. %s" );
      exit( 1 );
     }
     
     OGRLayer  *poLayer;
     //poLayer=NULL;
     //poLayer = poDS->GetLayerByName("point_out_layer");
     poLayer = poDS->GetLayer(0);
     if(poLayer == NULL)
     {
      printf( "指针 poLayer 为空 " );
     }

     int n = poDS->GetLayerCount();

     int m = poLayer->GetFeatureCount();


     OGRFeature *poFeature;
     
     poLayer->ResetReading();
     while( (poFeature = poLayer->GetNextFeature()) != NULL )//获得要素,本实例指的是五个点,所以会循环5次
     {
      OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
      int iField;
      int i=poFDefn->GetFieldCount(); //获得字段的数目,本实例返回5,不包括前两个字段(FID,Shape),这两个字段在arcgis里也不能被修改;
      for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
      {
       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
               //根据字段值得类型,选择对应的输出
       if( poFieldDefn->GetType() == OFTInteger )
        printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
       else if( poFieldDefn->GetType() == OFTReal )
        printf( "%.3f,", poFeature->GetFieldAsDouble(iField) );
       else if( poFieldDefn->GetType() == OFTString )
        printf( "%s,", poFeature->GetFieldAsString(iField) );
       else
        printf( "%s,", poFeature->GetFieldAsString(iField) );
      }
     
      OGRGeometry *poGeometry;
     
      poGeometry = poFeature->GetGeometryRef();
      if( poGeometry != NULL
       && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
      {
       OGRPoint *poPoint = (OGRPoint *) poGeometry;
     
       printf( "%.3f,%3.f ", poPoint->getX(), poPoint->getY() );
      }
      else
      {
       printf( "no point geometry " );
      }      
      OGRFeature::DestroyFeature( poFeature );
     }
     
     OGRDataSource::DestroyDataSource( poDS );
     
    }


    void readPolygon()
    {
     OGRRegisterAll();
     
     OGRDataSource *poDS;
     
     //poDS = OGRSFDriverRegistrar::Open( "C:\Users\Administrator\Desktop\VC\testshape\testshape\point_out.shp", FALSE );//shape文件存放的路径(point.shp即为自己创建的文件)
     //poDS = OGRSFDriverRegistrar::Open( "C:\Users\Administrator\Desktop\图层数据\Node.shp", FALSE );
     //poDS = OGRSFDriverRegistrar::Open( "point_out.shp", FALSE );//shape文件存放的路径(point.shp即为自己创建的文件)


     poDS = OGRSFDriverRegistrar::Open( "E:\DCP测试数据\data\M50F029027\Country.shp", FALSE );
     if( poDS == NULL )
     {
      printf( "Open failed. %s" );
      exit( 1 );
     }
     
     OGRLayer  *poLayer;
     //poLayer=NULL;
     //poLayer = poDS->GetLayerByName("point_out_layer");
     poLayer = poDS->GetLayer(0);
     if(poLayer == NULL)
     {
      printf( "指针 poLayer 为空 " );
     }

     int n = poDS->GetLayerCount();

     int m = poLayer->GetFeatureCount();


     OGRFeature *poFeature;
     
     poLayer->ResetReading();
     while( (poFeature = poLayer->GetNextFeature()) != NULL )//获得要素,本实例指的是五个点,所以会循环5次
     {
      OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
      int iField;
      int i=poFDefn->GetFieldCount(); //获得字段的数目,本实例返回5,不包括前两个字段(FID,Shape),这两个字段在arcgis里也不能被修改;
      for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
      {
       OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
               //根据字段值得类型,选择对应的输出
       if( poFieldDefn->GetType() == OFTInteger )
        printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
       else if( poFieldDefn->GetType() == OFTReal )
        printf( "%.3f,", poFeature->GetFieldAsDouble(iField) );
       else if( poFieldDefn->GetType() == OFTString )
        printf( "%s,", poFeature->GetFieldAsString(iField) );
       else
        printf( "%s,", poFeature->GetFieldAsString(iField) );
      }
     
      OGRGeometry *poGeometry;
     
      poGeometry = poFeature->GetGeometryRef();
      if( poGeometry != NULL
       && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
      {
       OGRPoint *poPoint = (OGRPoint *) poGeometry;
     
       printf( "%.3f,%3.f ", poPoint->getX(), poPoint->getY() );
      }
      
      else if( poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon )
      {
       //OGRPoint *poPoint = (OGRPoint *) poGeometry;

       OGRPolygon *poPolygon = (OGRPolygon *) poGeometry;


     
       //printf( "%.3f,%3.f ", poPoint->getX(), poPoint->getY() );
      }

      else
      {
       printf( "no point geometry " );
      }      
      OGRFeature::DestroyFeature( poFeature );
     }
     
     OGRDataSource::DestroyDataSource( poDS );
     
    }

    int main()
    {
     //createPoint();
     //readPoint();
     readPolygon();
     

     system("pause");
     return 0;
    }

  • 相关阅读:
    万网中备份数据操作
    《C++ Primer Plus》学习笔记3
    Redhat Linux 下安装Oracle 11g R2
    Android-shareSDK
    jQuery的AJax异步訪问
    swift语言初见
    Num 36 : ZOJ 2100 [ 深度优先搜索算法 ] [ 回溯 ]
    一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度
    [Swift]LeetCode227. 基本计算器 II | Basic Calculator II
    [Swift]LeetCode225. 用队列实现栈 | Implement Stack using Queues
  • 原文地址:https://www.cnblogs.com/roea1/p/13857098.html
Copyright © 2020-2023  润新知