⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dteddataset.cpp

📁 把dem文件转换为dted格式文件的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -------------------------------------------------------------------- *//*      Support overviews.                                              *//* -------------------------------------------------------------------- */    poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename );/* -------------------------------------------------------------------- *//*      Initialize any PAM information.                                 *//* -------------------------------------------------------------------- */    poDS->SetDescription( poOpenInfo->pszFilename );    poDS->TryLoadXML();    return( poDS );}/************************************************************************//*                          GetGeoTransform()                           *//************************************************************************/CPLErr DTEDDataset::GetGeoTransform( double * padfTransform ){    padfTransform[0] = psDTED->dfULCornerX;    padfTransform[1] = psDTED->dfPixelSizeX;    padfTransform[2] = 0.0;    padfTransform[3] = psDTED->dfULCornerY;    padfTransform[4] = 0.0;    padfTransform[5] = psDTED->dfPixelSizeY * -1;    return( CE_None );}/************************************************************************//*                          GetProjectionRef()                          *//************************************************************************/const char *DTEDDataset::GetProjectionRef(){    return( "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]" );}/************************************************************************//*                           DTEDCreateCopy()                           *//*                                                                      *//*      For now we will assume the input is exactly one proper          *//*      cell.                                                           *//************************************************************************/static GDALDataset *DTEDCreateCopy( const char * pszFilename, GDALDataset *poSrcDS,                 int bStrict, char ** papszOptions,                 GDALProgressFunc pfnProgress, void * pProgressData ){    (void) pProgressData;    (void) pfnProgress;    (void) papszOptions;    (void) bStrict;/* -------------------------------------------------------------------- *//*      Work out the level.                                             *//* -------------------------------------------------------------------- */    int nLevel;    if( poSrcDS->GetRasterYSize() == 121 )        nLevel = 0;    else if( poSrcDS->GetRasterYSize() == 1201 )        nLevel = 1;    else if( poSrcDS->GetRasterYSize() == 3601 )        nLevel = 2;    else    {        CPLError( CE_Warning, CPLE_AppDefined,                "The source does not appear to be a properly formatted cell." );        nLevel = 1;    }/* -------------------------------------------------------------------- *//*      Work out the LL origin.                                         *//* -------------------------------------------------------------------- */    int  nLLOriginLat, nLLOriginLong;    double adfGeoTransform[6];    poSrcDS->GetGeoTransform( adfGeoTransform );    nLLOriginLat = (int)         floor(adfGeoTransform[3]               + poSrcDS->GetRasterYSize() * adfGeoTransform[5] + 0.5);        nLLOriginLong = (int) floor(adfGeoTransform[0] + 0.5);/* -------------------------------------------------------------------- *//*      Create the output dted file.                                    *//* -------------------------------------------------------------------- */    const char *pszError;    pszError = DTEDCreate( pszFilename, nLevel, nLLOriginLat, nLLOriginLong );    if( pszError != NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "%s", pszError );        return NULL;    }/* -------------------------------------------------------------------- *//*      Open the DTED file so we can output the data to it.             *//* -------------------------------------------------------------------- */    DTEDInfo *psDTED;    psDTED = DTEDOpen( pszFilename, "rb+", FALSE );    if( psDTED == NULL )        return NULL;/* -------------------------------------------------------------------- *//*      Read all the data in one dollup.                                *//* -------------------------------------------------------------------- */    GDALRasterBand *poSrcBand = poSrcDS->GetRasterBand( 1 );    GInt16      *panData;        panData = (GInt16 *)         CPLMalloc(sizeof(GInt16) * psDTED->nXSize * psDTED->nYSize);        poSrcBand->RasterIO( GF_Read, 0, 0, psDTED->nXSize, psDTED->nYSize,                          (void *) panData, psDTED->nXSize, psDTED->nYSize,                          GDT_Int16, 0, 0 );/* -------------------------------------------------------------------- *//*      Write all the profiles.                                         *//* -------------------------------------------------------------------- */    GInt16      anProfData[3601];    double       dfNodataCount=0.0;    GByte       iPartialCell;    for( int iProfile = 0; iProfile < psDTED->nXSize; iProfile++ )    {        for( int iY = 0; iY < psDTED->nYSize; iY++ )        {            anProfData[iY] = panData[iProfile + iY * psDTED->nXSize];            if ( anProfData[iY] == DTED_NODATA_VALUE )                dfNodataCount = dfNodataCount+1.0;        }        DTEDWriteProfile( psDTED, iProfile, anProfData );    }    CPLFree( panData );/* -------------------------------------------------------------------- *//* Partial cell indicator: 0 for complete coverage; 1-99 for incomplete *//* -------------------------------------------------------------------- */    char pszPartialCell[2];        if ( dfNodataCount < 0.5 )        iPartialCell = 0;    else    {      iPartialCell = int(floor(100.0 -            (dfNodataCount*100.0/(psDTED->nXSize * psDTED->nYSize))));        if (iPartialCell < 1)           iPartialCell=1;           }    sprintf(pszPartialCell,"%02d",iPartialCell);    strncpy((char *) (psDTED->pachDSIRecord+289), pszPartialCell, 2 );/* -------------------------------------------------------------------- *//*      Try to copy any matching available metadata.                    *//* -------------------------------------------------------------------- */    if( poSrcDS->GetMetadataItem( "DTED_VerticalAccuracy_UHL" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_VERTACCURACY_UHL,                      poSrcDS->GetMetadataItem( "DTED_VerticalAccuracy_UHL" ) );    if( poSrcDS->GetMetadataItem( "DTED_VerticalAccuracy_ACC" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_VERTACCURACY_ACC,                     poSrcDS->GetMetadataItem( "DTED_VerticalAccuracy_ACC" ) );    if( poSrcDS->GetMetadataItem( "DTED_SecurityCode_UHL" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_SECURITYCODE_UHL,                     poSrcDS->GetMetadataItem( "DTED_SecurityCode_UHL" ) );    if( poSrcDS->GetMetadataItem( "DTED_SecurityCode_DSI" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_SECURITYCODE_DSI,                     poSrcDS->GetMetadataItem( "DTED_SecurityCode_DSI" ) );    if( poSrcDS->GetMetadataItem( "DTED_UniqueRef_UHL" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_UNIQUEREF_UHL,                          poSrcDS->GetMetadataItem( "DTED_UniqueRef_UHL" ) );    if( poSrcDS->GetMetadataItem( "DTED_UniqueRef_DSI" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_UNIQUEREF_DSI,                          poSrcDS->GetMetadataItem( "DTED_UniqueRef_DSI" ) );    if( poSrcDS->GetMetadataItem( "DTED_DataEdition" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_DATA_EDITION,                          poSrcDS->GetMetadataItem( "DTED_DataEdition" ) );    if( poSrcDS->GetMetadataItem( "DTED_MatchMergeVersion" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_MATCHMERGE_VERSION,                      poSrcDS->GetMetadataItem( "DTED_MatchMergeVersion" ) );    if( poSrcDS->GetMetadataItem( "DTED_MaintenanceDate" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_MAINT_DATE,                          poSrcDS->GetMetadataItem( "DTED_MaintenanceDate" ) );    if( poSrcDS->GetMetadataItem( "DTED_MatchMergeDate" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_MATCHMERGE_DATE,                          poSrcDS->GetMetadataItem( "DTED_MatchMergeDate" ) );    if( poSrcDS->GetMetadataItem( "DTED_MaintenanceDescription" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_MAINT_DESCRIPTION,                  poSrcDS->GetMetadataItem( "DTED_MaintenanceDescription" ) );    if( poSrcDS->GetMetadataItem( "DTED_Producer" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_PRODUCER,                          poSrcDS->GetMetadataItem( "DTED_Producer" ) );    if( poSrcDS->GetMetadataItem( "DTED_VerticalDatum" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_VERTDATUM,                          poSrcDS->GetMetadataItem( "DTED_VerticalDatum" ) );    if( poSrcDS->GetMetadataItem( "DTED_DigitizingSystem" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_DIGITIZING_SYS,                          poSrcDS->GetMetadataItem( "DTED_DigitizingSystem" ) );    if( poSrcDS->GetMetadataItem( "DTED_CompilationDate" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_COMPILATION_DATE,                          poSrcDS->GetMetadataItem( "DTED_CompilationDate" ) );    if( poSrcDS->GetMetadataItem( "DTED_HorizontalAccuracy" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_HORIZACCURACY,                      poSrcDS->GetMetadataItem( "DTED_HorizontalAccuracy" ) );    if( poSrcDS->GetMetadataItem( "DTED_RelHorizontalAccuracy" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_REL_HORIZACCURACY,                    poSrcDS->GetMetadataItem( "DTED_RelHorizontalAccuracy" ) );    if( poSrcDS->GetMetadataItem( "DTED_RelVerticalAccuracy" ) != NULL )        DTEDSetMetadata( psDTED, DTEDMD_REL_VERTACCURACY,                      poSrcDS->GetMetadataItem( "DTED_RelVerticalAccuracy" ) );/* -------------------------------------------------------------------- *//*      Try to open the resulting DTED file.                            *//* -------------------------------------------------------------------- */    DTEDClose( psDTED );/* -------------------------------------------------------------------- *//*      Reopen and copy missing information into a PAM file.            *//* -------------------------------------------------------------------- */    GDALPamDataset *poDS = (GDALPamDataset *)         GDALOpen( pszFilename, GA_ReadOnly );    if( poDS )        poDS->CloneInfo( poSrcDS, GCIF_PAM_DEFAULT );    return poDS;}/************************************************************************//*                         GDALRegister_DTED()                          *//************************************************************************/void GDALRegister_DTED(){    GDALDriver  *poDriver;    if( GDALGetDriverByName( "DTED" ) == NULL )    {        poDriver = new GDALDriver();                poDriver->SetDescription( "DTED" );        poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,                                    "DTED Elevation Raster" );        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,                                    "frmt_various.html#DTED" );        poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES,                                    "Byte Int16 UInt16" );                poDriver->pfnOpen = DTEDDataset::Open;        poDriver->pfnCreateCopy = DTEDCreateCopy;        GetGDALDriverManager()->RegisterDriver( poDriver );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -