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

📄 dted_api.c

📁 把dem文件转换为dted格式文件的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                memcpy( panData + i, pabyRecord + 8+i*2, 2 );                panData[i] = CPL_MSBWORD16( panData[i] );                if( !bWarned )                {                    bWarned = TRUE;                    CPLError( CE_Warning, CPLE_AppDefined,                              "The DTED driver found values less than -16000, and has adjusted\n"                              "them assuming they are improperly two-complemented.  No more warnings\n"                              "will be issued in this session about this operation." );                }            }        }    }    CPLFree( pabyRecord );    return TRUE;}/************************************************************************//*                          DTEDWriteProfile()                          *//************************************************************************/int DTEDWriteProfile( DTEDInfo * psDInfo, int nColumnOffset,                     GInt16 * panData ){    int         nOffset;    int         i, nCheckSum = 0;    GByte       *pabyRecord;/* -------------------------------------------------------------------- *//*      Format the data record.                                         *//* -------------------------------------------------------------------- */    pabyRecord = (GByte *) CPLMalloc(12 + psDInfo->nYSize*2);        for( i = 0; i < psDInfo->nYSize; i++ )    {        int     nABSVal = ABS(panData[psDInfo->nYSize-i-1]);        pabyRecord[8+i*2] = (GByte) ((nABSVal >> 8) & 0x7f);        pabyRecord[8+i*2+1] = (GByte) (nABSVal & 0xff);        if( panData[psDInfo->nYSize-i-1] < 0 )            pabyRecord[8+i*2] |= 0x80;    }    pabyRecord[0] = 0xaa;    pabyRecord[1] = 0;    pabyRecord[2] = (GByte) (nColumnOffset / 256);    pabyRecord[3] = (GByte) (nColumnOffset % 256);    pabyRecord[4] = (GByte) (nColumnOffset / 256);    pabyRecord[5] = (GByte) (nColumnOffset % 256);    pabyRecord[6] = 0;    pabyRecord[7] = 0;/* -------------------------------------------------------------------- *//*      Compute the checksum.                                           *//* -------------------------------------------------------------------- */    for( i = 0; i < psDInfo->nYSize*2 + 8; i++ )        nCheckSum += pabyRecord[i];    pabyRecord[8+psDInfo->nYSize*2+0] = (GByte) ((nCheckSum >> 24) & 0xff);    pabyRecord[8+psDInfo->nYSize*2+1] = (GByte) ((nCheckSum >> 16) & 0xff);    pabyRecord[8+psDInfo->nYSize*2+2] = (GByte) ((nCheckSum >> 8) & 0xff);    pabyRecord[8+psDInfo->nYSize*2+3] = (GByte) (nCheckSum & 0xff);/* -------------------------------------------------------------------- *//*      Write the record.                                               *//* -------------------------------------------------------------------- */    nOffset = psDInfo->nDataOffset + nColumnOffset * (12+psDInfo->nYSize*2);    if( VSIFSeek( psDInfo->fp, nOffset, SEEK_SET ) != 0        || VSIFWrite( pabyRecord,(12+psDInfo->nYSize*2),1,psDInfo->fp ) != 1)    {        CPLFree( pabyRecord );#ifndef AVOID_CPL        CPLError( CE_Failure, CPLE_FileIO,#else        fprintf( stderr, #endif                  "Failed to seek to, or write profile %d at offset %d\n"                  "in DTED file.\n",                  nColumnOffset, nOffset );        return FALSE;    }    CPLFree( pabyRecord );    return TRUE;    }/************************************************************************//*                      DTEDGetMetadataLocation()                       *//************************************************************************/static void DTEDGetMetadataLocation( DTEDInfo *psDInfo,                                      DTEDMetaDataCode eCode,                                      char **ppszLocation, int *pnLength ){    switch( eCode )    {      case DTEDMD_VERTACCURACY_UHL:        *ppszLocation = psDInfo->pachUHLRecord + 28;        *pnLength = 4;        break;      case DTEDMD_SECURITYCODE_UHL:        *ppszLocation = psDInfo->pachUHLRecord + 32;        *pnLength = 3;        break;      case DTEDMD_UNIQUEREF_UHL:        *ppszLocation = psDInfo->pachUHLRecord + 35;        *pnLength = 12;        break;      case DTEDMD_DATA_EDITION:        *ppszLocation = psDInfo->pachDSIRecord + 87;        *pnLength = 2;        break;      case DTEDMD_MATCHMERGE_VERSION:        *ppszLocation = psDInfo->pachDSIRecord + 89;        *pnLength = 1;        break;      case DTEDMD_MAINT_DATE:        *ppszLocation = psDInfo->pachDSIRecord + 90;        *pnLength = 4;        break;      case DTEDMD_MATCHMERGE_DATE:        *ppszLocation = psDInfo->pachDSIRecord + 94;        *pnLength = 4;        break;      case DTEDMD_MAINT_DESCRIPTION:        *ppszLocation = psDInfo->pachDSIRecord + 98;        *pnLength = 4;        break;      case DTEDMD_PRODUCER:        *ppszLocation = psDInfo->pachDSIRecord + 102;        *pnLength = 8;        break;      case DTEDMD_VERTDATUM:        *ppszLocation = psDInfo->pachDSIRecord + 141;        *pnLength = 3;        break;      case DTEDMD_DIGITIZING_SYS:        *ppszLocation = psDInfo->pachDSIRecord + 149;        *pnLength = 10;        break;      case DTEDMD_COMPILATION_DATE:        *ppszLocation = psDInfo->pachDSIRecord + 159;        *pnLength = 4;        break;      case DTEDMD_HORIZACCURACY:        *ppszLocation = psDInfo->pachACCRecord + 3;        *pnLength = 4;        break;      case DTEDMD_REL_HORIZACCURACY:        *ppszLocation = psDInfo->pachACCRecord + 11;        *pnLength = 4;        break;      case DTEDMD_REL_VERTACCURACY:        *ppszLocation = psDInfo->pachACCRecord + 15;        *pnLength = 4;        break;      case DTEDMD_VERTACCURACY_ACC:        *ppszLocation = psDInfo->pachACCRecord + 7;        *pnLength = 4;        break;      case DTEDMD_SECURITYCODE_DSI:        *ppszLocation = psDInfo->pachDSIRecord + 3;        *pnLength = 1;        break;      case DTEDMD_UNIQUEREF_DSI:        *ppszLocation = psDInfo->pachDSIRecord + 64;        *pnLength = 15;        break;      default:        *ppszLocation = NULL;        *pnLength = 0;    }}/************************************************************************//*                          DTEDGetMetadata()                           *//************************************************************************/char *DTEDGetMetadata( DTEDInfo *psDInfo, DTEDMetaDataCode eCode ){    int nFieldLen;    char *pszFieldSrc;    char *pszResult;    DTEDGetMetadataLocation( psDInfo, eCode, &pszFieldSrc, &nFieldLen );    if( pszFieldSrc == NULL )        return VSIStrdup( "" );    pszResult = (char *) malloc(nFieldLen+1);    strncpy( pszResult, pszFieldSrc, nFieldLen );    pszResult[nFieldLen] = '\0';    return pszResult;}/************************************************************************//*                          DTEDSetMetadata()                           *//************************************************************************/int DTEDSetMetadata( DTEDInfo *psDInfo, DTEDMetaDataCode eCode,                      const char *pszNewValue ){    int nFieldLen;    char *pszFieldSrc;    if( !psDInfo->bUpdate )        return FALSE;/* -------------------------------------------------------------------- *//*      Get the location in the headers to update.                      *//* -------------------------------------------------------------------- */    DTEDGetMetadataLocation( psDInfo, eCode, &pszFieldSrc, &nFieldLen );    if( pszFieldSrc == NULL )        return FALSE;/* -------------------------------------------------------------------- *//*      Update it, padding with spaces.                                 *//* -------------------------------------------------------------------- */    memset( pszFieldSrc, ' ', nFieldLen );    strncpy( pszFieldSrc, pszNewValue,              MIN(strlen(pszFieldSrc),strlen(pszNewValue)) );/* -------------------------------------------------------------------- *//*      Write all headers back to disk.                                 *//* -------------------------------------------------------------------- */    VSIFSeek( psDInfo->fp, psDInfo->nUHLOffset, SEEK_SET );    VSIFWrite( psDInfo->pachUHLRecord, 1, DTED_UHL_SIZE, psDInfo->fp );    VSIFSeek( psDInfo->fp, psDInfo->nDSIOffset, SEEK_SET );    VSIFWrite( psDInfo->pachDSIRecord, 1, DTED_DSI_SIZE, psDInfo->fp );    VSIFSeek( psDInfo->fp, psDInfo->nACCOffset, SEEK_SET );    VSIFWrite( psDInfo->pachACCRecord, 1, DTED_ACC_SIZE, psDInfo->fp );    return TRUE;}/************************************************************************//*                             DTEDClose()                              *//************************************************************************/void DTEDClose( DTEDInfo * psDInfo ){    VSIFClose( psDInfo->fp );    CPLFree( psDInfo->pachUHLRecord );    CPLFree( psDInfo->pachDSIRecord );    CPLFree( psDInfo->pachACCRecord );        CPLFree( psDInfo );}

⌨️ 快捷键说明

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