Changeset 19324


Ignore:
Timestamp:
Apr 5, 2010 2:56:12 PM (6 years ago)
Author:
rouault
Message:

NITF: support reading CSSHPA DES & extracting embedded shapefile

Location:
trunk/gdal/frmts/nitf
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/gdal/frmts/nitf/nitfdes.c

    r19320 r19324  
    4646    char      *pachHeader;
    4747    NITFSegmentInfo *psSegInfo;
     48    char       szDESID[26];
    4849    char       szTemp[128];
    4950    int        nOffset;
     
    166167
    167168    /* Load DESID */
    168     NITFGetField( szTemp, pachHeader, 2, 25);
     169    NITFGetField( szDESID, pachHeader, 2, 25);
    169170
    170171    /* For NITF < 02.10, we cannot rely on DESID=TRE_OVERFLOW to detect */
    171172    /* if DESOFLW and DESITEM are present. So if the next 4 bytes are non */
    172173    /* numeric, we'll assume that DESOFLW is there */
    173     bHasDESOFLW = EQUALN(szTemp, "TRE_OVERFLOW", strlen("TRE_OVERFLOW")) ||
     174    bHasDESOFLW = EQUALN(szDESID, "TRE_OVERFLOW", strlen("TRE_OVERFLOW")) ||
    174175       (!((pachHeader[nOffset+0] >= '0' && pachHeader[nOffset+0] <= '9') &&
    175176          (pachHeader[nOffset+1] >= '0' && pachHeader[nOffset+1] <= '9') &&
     
    216217    }
    217218
    218     if (nDESSHL > 0)
     219    if (EQUALN(szDESID, "CSSHPA DES", strlen("CSSHPA DES")))
     220    {
     221        if ( nDESSHL != 62 && nDESSHL != 80)
     222        {
     223            CPLError(CE_Failure, CPLE_AppDefined,
     224                     "Invalid DESSHL for CSSHPA DES");
     225            NITFDESDeaccess(psDES);
     226            return NULL;
     227        }
     228
     229        GetMD( 25, SHAPE_USE );
     230        GetMD( 10, SHAPE_CLASS );
     231        if (nDESSHL == 80)
     232            GetMD( 18, CC_SOURCE );
     233        GetMD(  3, SHAPE1_NAME );
     234        GetMD(  6, SHAPE1_START );
     235        GetMD(  3, SHAPE2_NAME );
     236        GetMD(  6, SHAPE2_START );
     237        GetMD(  3, SHAPE3_NAME );
     238        GetMD(  6, SHAPE3_START );
     239    }
     240    else if (nDESSHL > 0)
    219241        GetMD(  nDESSHL, DESSHF );
    220242
     
    370392    VSIFree(pabyTREData);
    371393}
     394
     395
     396/************************************************************************/
     397/*                        NITFDESExtractShapefile()                     */
     398/************************************************************************/
     399
     400int NITFDESExtractShapefile(NITFDES* psDES, const char* pszRadixFileName)
     401{
     402    NITFSegmentInfo* psSegInfo;
     403    const char* apszExt[3];
     404    int anOffset[4];
     405    int iShpFile;
     406    char* pszFilename;
     407
     408    if ( CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE_USE") == NULL )
     409        return FALSE;
     410
     411    psSegInfo = psDES->psFile->pasSegmentInfo + psDES->iSegment;
     412
     413    apszExt[0] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE1_NAME");
     414    anOffset[0] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE1_START"));
     415    apszExt[1] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE2_NAME");
     416    anOffset[1] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE2_START"));
     417    apszExt[2] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE3_NAME");
     418    anOffset[2] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE3_START"));
     419    anOffset[3] = (int) psSegInfo->nSegmentSize;
     420
     421    for(iShpFile = 0; iShpFile < 3; iShpFile ++)
     422    {
     423        if (!EQUAL(apszExt[iShpFile], "SHP") &&
     424            !EQUAL(apszExt[iShpFile], "SHX") &&
     425            !EQUAL(apszExt[iShpFile], "DBF"))
     426            return FALSE;
     427
     428        if (anOffset[iShpFile] < 0 ||
     429            anOffset[iShpFile] >= anOffset[iShpFile+1])
     430            return FALSE;
     431    }
     432
     433    pszFilename = (char*) VSIMalloc(strlen(pszRadixFileName) + 4 + 1);
     434    if (pszFilename == NULL)
     435        return FALSE;
     436
     437    for(iShpFile = 0; iShpFile < 3; iShpFile ++)
     438    {
     439        FILE* fp;
     440        GByte* pabyBuffer;
     441        int nSize = anOffset[iShpFile+1] - anOffset[iShpFile];
     442
     443        pabyBuffer = (GByte*) VSIMalloc(nSize);
     444        if (pabyBuffer == NULL)
     445        {
     446            VSIFree(pszFilename);
     447            return FALSE;
     448        }
     449
     450        VSIFSeekL(psDES->psFile->fp, psSegInfo->nSegmentStart + anOffset[iShpFile], SEEK_SET);
     451        if (VSIFReadL(pabyBuffer, 1, nSize, psDES->psFile->fp) != nSize)
     452        {
     453            VSIFree(pabyBuffer);
     454            VSIFree(pszFilename);
     455            return FALSE;
     456        }
     457
     458        sprintf(pszFilename, "%s.%s", pszRadixFileName, apszExt[iShpFile]);
     459        fp = VSIFOpenL(pszFilename, "wb");
     460        if (fp == NULL)
     461        {
     462            VSIFree(pabyBuffer);
     463            VSIFree(pszFilename);
     464            return FALSE;
     465        }
     466
     467        VSIFWriteL(pabyBuffer, 1, nSize, fp);
     468        VSIFCloseL(fp);
     469        VSIFree(pabyBuffer);
     470    }
     471
     472    VSIFree(pszFilename);
     473
     474    return TRUE;
     475}
  • trunk/gdal/frmts/nitf/nitfdump.c

    r19320 r19324  
    3232#include "cpl_multiproc.h"
    3333#include "cpl_vsi.h"
     34
     35#ifdef OGR_ENABLED
     36#include "ogr_api.h"
     37#endif
    3438
    3539CPL_CVSID("$Id$");
     
    97101    char         szTemp[100];
    98102    int          bDisplayTRE = FALSE;
     103    int          bExtractSHP = FALSE, bExtractSHPInMem = FALSE;
    99104
    100105    if( nArgc < 2 )
    101106    {
    102         printf( "Usage: nitfdump [-tre] <nitf_filename>*\n" );
     107        printf( "Usage: nitfdump [-tre] [-extractshp | -extractshpinmem] <nitf_filename>*\n" );
    103108        exit( 1 );
    104109    }
     
    108113        if ( EQUAL(papszArgv[iFile], "-tre") )
    109114            bDisplayTRE = TRUE;
     115        else if ( EQUAL(papszArgv[iFile], "-extractshp") )
     116            bExtractSHP = TRUE;
     117        else if ( EQUAL(papszArgv[iFile], "-extractshpinmem") )
     118        {
     119            bExtractSHP = TRUE;
     120            bExtractSHPInMem = TRUE;
     121        }
    110122    }
    111123
     
    118130
    119131        if ( EQUAL(papszArgv[iFile], "-tre") )
     132            continue;
     133        if ( EQUAL(papszArgv[iFile], "-extractshp") )
     134            continue;
     135        if ( EQUAL(papszArgv[iFile], "-extractshpinmem") )
    120136            continue;
    121137
     
    236252
    237253            printf( "Image Segment %d, %dPx%dLx%dB x %dbits:\n",
    238                     iSegment, psImage->nCols, psImage->nRows,
     254                    iSegment + 1, psImage->nCols, psImage->nRows,
    239255                    psImage->nBands, psImage->nBitsPerSample );
    240256            printf( "  PVTYPE=%s, IREP=%s, ICAT=%s, IMODE=%c, IC=%s, COMRAT=%s, ICORDS=%c\n",
     
    405421/* -------------------------------------------------------------------- */
    406422            printf( "Graphic Segment %d, type=%2.2s, sfmt=%c, sid=%10.10s\n",
    407                     iSegment,
     423                    iSegment + 1,
    408424                    achSubheader + 0,
    409425                    achSubheader[nSTYPEOffset],
     
    436452            }
    437453
    438             printf( "DE Segment %d:\n", iSegment );
     454            printf( "DE Segment %d:\n", iSegment + 1 );
    439455
    440456            printf( "  Segment TREs:" );
     
    493509
    494510            DumpMetadata( "  DES Metadata:", "    ", psDES->papszMetadata );
     511
     512            if ( bExtractSHP && CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE_USE") != NULL )
     513            {
     514                char szFilename[32];
     515                char szRadix[32];
     516                if (bExtractSHPInMem)
     517                    sprintf(szRadix, "/vsimem/nitf_segment_%d", iSegment + 1);
     518                else
     519                    sprintf(szRadix, "nitf_segment_%d", iSegment + 1);
     520
     521                if (NITFDESExtractShapefile(psDES, szRadix))
     522                {
     523#ifdef OGR_ENABLED
     524                    OGRDataSourceH hDS;
     525                    OGRRegisterAll();
     526                    sprintf(szFilename, "%s.SHP", szRadix);
     527                    hDS = OGROpen(szFilename, FALSE, NULL);
     528                    if (hDS)
     529                    {
     530                        int nGeom = 0;
     531                        OGRLayerH hLayer = OGR_DS_GetLayer(hDS, 0);
     532                        if (hLayer)
     533                        {
     534                            OGRFeatureH hFeat;
     535                            printf("\n");
     536                            while ( (hFeat = OGR_L_GetNextFeature(hLayer)) != NULL )
     537                            {
     538                                OGRGeometryH hGeom = OGR_F_GetGeometryRef(hFeat);
     539                                if (hGeom)
     540                                {
     541                                    char* pszWKT = NULL;
     542                                    OGR_G_ExportToWkt(hGeom, &pszWKT);
     543                                    if (pszWKT)
     544                                        printf("    Geometry %d : %s\n", nGeom ++, pszWKT);
     545                                    CPLFree(pszWKT);
     546                                }
     547                                OGR_F_Destroy(hFeat);
     548                            }
     549                        }
     550                        OGR_DS_Destroy(hDS);
     551                    }
     552#endif
     553                }
     554
     555                if (bExtractSHPInMem)
     556                {
     557                    sprintf(szFilename, "%s.SHP", szRadix);
     558                    VSIUnlink(szFilename);
     559                    sprintf(szFilename, "%s.SHX", szRadix);
     560                    VSIUnlink(szFilename);
     561                    sprintf(szFilename, "%s.DBF", szRadix);
     562                    VSIUnlink(szFilename);
     563                }
     564            }
    495565        }
    496566
     
    501571    }
    502572   
     573    CPLFinderClean();
    503574    CPLCleanupTLS();
    504575    VSICleanupFileManager();
     576#ifdef OGR_ENABLED
     577    OGRCleanupAll();
     578#endif
    505579
    506580    exit( 0 );
  • trunk/gdal/frmts/nitf/nitflib.h

    r19320 r19324  
    254254                                    int* pnFoundTRESize);
    255255void      CPL_DLL  NITFDESFreeTREData( char* pabyTREData );
     256
     257int       CPL_DLL  NITFDESExtractShapefile(NITFDES* psDES, const char* pszRadixFileName);
    256258
    257259/* -------------------------------------------------------------------- */
Note: See TracChangeset for help on using the changeset viewer.