📄 dted_api.c
字号:
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 + -