• [GDAL]2.读取栅格和矢量数据


    MFC项目要选择多字节字符集。

    GDAL读取栅格:

     1 void DlgImageInfo::OnBnClickedSearch()
     2 {
     3     // TODO: 在此添加控件通知处理程序代码
     4     CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("IMG影像文件(*.img)|*.img|TIFF影像文件(*.tiff)|*.tiff||"),AfxGetMainWnd());
     5     CString str;
     6     if (dlg.DoModal()==IDOK)
     7     {
     8         str=dlg.GetPathName();
     9         m_FileName.SetWindowText(str);
    10 
    11         GDALAllRegister();  
    12         CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
    13         const char* pszFile =(LPCTSTR)str;
    14         GDALDataset* poDataset;  
    15         //使用只读方式打开图像   
    16         poDataset = (GDALDataset*)GDALOpen(pszFile,GA_ReadOnly); 
    17         if( poDataset == NULL )  
    18         {  
    19             CString ex;
    20             ex.AppendFormat("File: %s不能打开!\n",str);
    21             listImageInfo.AddString(ex);  //            
    22         }  
    23         CString sDriver;
    24         sDriver.AppendFormat( "Driver: %s/%s\n",
    25             poDataset->GetDriver()->GetDescription(), 
    26             poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
    27 
    28         listImageInfo.AddString(sDriver);         
    29         
    30         CString sSize;
    31         sSize.AppendFormat("Size is %dx%dx%d\n",poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),poDataset->GetRasterCount());
    32         listImageInfo.AddString(sSize);
    33         //输出图像的投影信息 
    34         if( poDataset->GetProjectionRef()  != NULL ) 
    35         {
    36             CString sPrj;
    37             sPrj.Format("Projection is `%s'\n", poDataset->GetProjectionRef());
    38             listImageInfo.AddString(sPrj)  ; 
    39         }
    40         //输出图像的坐标和分辨率信息 
    41         double adfGeoTransform[6]; 
    42         if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None ) 
    43         { 
    44             CString sOrgin;
    45             sOrgin.Format("Origin = (%.6f,%.6f)\n", 
    46                 adfGeoTransform[0], adfGeoTransform[3]);
    47             CString sPixel;
    48             sPixel.Format("Pixel Size = (%.6f,%.6f)\n", 
    49                 adfGeoTransform[1], adfGeoTransform[5]);
    50             listImageInfo.AddString(sOrgin)  ; 
    51             listImageInfo.AddString(sPixel)  ; 
    52         }
    53         GDALClose((GDALDatasetH )poDataset); 
    54     }
    55 }

     

    OGR读取矢量数据:

     1 void VectorInfoDlg::OnBnClickedSearchVector()
     2 {
     3     CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ESRI Shapefile(*.shp)|*.shp|MapInfo File(*.mid *.mif *.tab)|*.mid *.mif *tab|Arc/Info .E00 (*.e00)|*.e00|AutoCAD DXF(*.dxf)|*.dxf|Comma Separated Value (.csv)|*.csv|GML(*.gml)|*.gml|KML(*.kml)|*.kml|所有文件|*.*||"),AfxGetMainWnd());
     4     CString strFilePath;
     5     if (dlg.DoModal()==IDOK)
     6     {
     7         strFilePath=dlg.GetPathName();
     8         m_FileName.SetWindowText(strFilePath);
     9         const char* pszFile =(LPCTSTR)strFilePath;
    10 
    11         CString strFilename=dlg.GetFileName();
    12         strFilename.Delete(strFilename.GetLength()-4,4);
    13         const char* pFileName =(LPCTSTR)strFilename;
    14         OGRRegisterAll();
    15         CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
    16         OGRDataSource  *poDS;
    17 
    18         poDS = OGRSFDriverRegistrar::Open(pszFile, FALSE );
    19         if( poDS == NULL )
    20         {
    21             AfxMessageBox("Open failed.\n");
    22             return;
    23         }
    24 
    25         OGRLayer  *poLayer;
    26 
    27         poLayer = poDS->GetLayerByName( pFileName );
    28         OGRFeature *poFeature;
    29         poLayer->ResetReading();
    30         while( (poFeature = poLayer->GetNextFeature()) != NULL )
    31         {
    32             OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
    33             int iField;
    34             CString strFieldDefn;
    35             strFieldDefn.AppendFormat("共有%d个属性字段:",poFDefn->GetFieldCount());
    36             for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
    37             {
    38                 OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
    39                 
    40                 if( poFieldDefn->GetType() == OFTInteger )
    41                     strFieldDefn.AppendFormat( "%d,", poFeature->GetFieldAsInteger( iField ) );
    42                 else if( poFieldDefn->GetType() == OFTReal )
    43                     strFieldDefn.AppendFormat( "%.3f,", poFeature->GetFieldAsDouble(iField) );
    44                 else if( poFieldDefn->GetType() == OFTString )
    45                     strFieldDefn.AppendFormat( "%s,", poFeature->GetFieldAsString(iField) );
    46                 else
    47                     strFieldDefn.AppendFormat( "%s,", poFeature->GetFieldAsString(iField) );
    48             }
    49             m_VectorInfo.AddString(strFieldDefn);
    50             OGRGeometry *poGeometry;
    51             CString strGeometry;
    52             poGeometry = poFeature->GetGeometryRef();
    53             if( poGeometry != NULL 
    54                 && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
    55             {
    56                 OGRPoint *poPoint = (OGRPoint *) poGeometry;
    57 
    58                 strGeometry.AppendFormat( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() );
    59             }
    60             else
    61             {
    62                 strGeometry.AppendFormat( "no point geometry\n" );
    63             }  
    64             m_VectorInfo.AddString(strFieldDefn);
    65             OGRFeature::DestroyFeature( poFeature );
    66         }
    67 
    68         OGRDataSource::DestroyDataSource( poDS );//释放数据源
    69     }
    70 }

    注意:

    如果VS编译的是64位程序,那么需要的是64位的GDAL的DLL,不然会报找不到函数依赖项的错误。

    #include "..\\GDAL\\include\\gdal_priv.h"
    #include "..\\GDAL\\include\\gdal_priv.h"
    #include "..\\GDAL\\include\\ogr_spatialref.h"
    #include "..\\GDAL\\include\\ogr_attrind.h"
    #include "..\\GDAL\\include\\ogrsf_frmts.h"
    #include "..\\GDAL\\include\\gdalwarper.h"
    #include "..\\GDAL\\include\\gdal.h"
    #include "..\\GDAL\\include\\cpl_string.h"
    #pragma comment(lib,"..\\GDAL\\lib\\gdal_i.lib")
    

      

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    数据结构与算法系列——排序(6)_树形选择排序
    数据结构与算法系列——排序(7)_堆排序
    数据结构与算法系列——排序(5)_简单选择排序
    数据结构与算法系列——排序(4)_Shell希尔排序
    数据结构与算法系列——排序(3)_折半插入排序
    数据结构与算法系列——排序(2)_直接插入排序
    数据结构与算法系列——排序(1)_概述
    Java高级开发_性能优化的细节
    图形推理
    美团点评面试20190515
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2828174.html
Copyright © 2020-2023  润新知