Changeset 12446

Show
Ignore:
Timestamp:
10/16/07 16:32:26 (1 year ago)
Author:
warmerdam
Message:

implement serialization support for geoloc transformer (#1919)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/alg/gdalgeoloc.cpp

    r12420 r12446  
    4040CPL_CVSID("$Id$"); 
    4141 
     42CPL_C_START 
     43CPLXMLNode *GDALSerializeGeoLocTransformer( void *pTransformArg ); 
     44void *GDALDeserializeGeoLocTransformer( CPLXMLNode *psTree ); 
     45CPL_C_END 
     46 
    4247/************************************************************************/ 
    4348/* ==================================================================== */ 
     
    8287    double           dfLINE_OFFSET; 
    8388    double           dfLINE_STEP; 
     89 
     90    char **          papszGeolocationInfo; 
    8491 
    8592} GDALGeoLocTransformInfo; 
     
    599606    psTransform->sTI.pfnTransform = GDALGeoLocTransform; 
    600607    psTransform->sTI.pfnCleanup = GDALDestroyGeoLocTransformer; 
    601     psTransform->sTI.pfnSerialize = NULL; 
     608    psTransform->sTI.pfnSerialize = GDALSerializeGeoLocTransformer; 
     609    psTransform->papszGeolocationInfo = CSLDuplicate( papszGeolocationInfo ); 
    602610 
    603611/* -------------------------------------------------------------------- */ 
     
    626634        psTransform->hDS_X = hBaseDS; 
    627635        GDALReferenceDataset( psTransform->hDS_X ); 
     636        psTransform->papszGeolocationInfo =  
     637            CSLSetNameValue( psTransform->papszGeolocationInfo,  
     638                             "X_DATASET",  
     639                             GDALGetDescription( hBaseDS ) ); 
    628640    } 
    629641 
     
    637649        psTransform->hDS_Y = hBaseDS; 
    638650        GDALReferenceDataset( psTransform->hDS_Y ); 
     651        psTransform->papszGeolocationInfo =  
     652            CSLSetNameValue( psTransform->papszGeolocationInfo,  
     653                             "Y_DATASET",  
     654                             GDALGetDescription( hBaseDS ) ); 
    639655    } 
    640656 
     
    857873    return TRUE; 
    858874} 
     875 
     876/************************************************************************/ 
     877/*                   GDALSerializeGeoLocTransformer()                   */ 
     878/************************************************************************/ 
     879 
     880CPLXMLNode *GDALSerializeGeoLocTransformer( void *pTransformArg ) 
     881 
     882{ 
     883    VALIDATE_POINTER1( pTransformArg, "GDALSerializeGeoLocTransformer", NULL ); 
     884 
     885    CPLXMLNode *psTree; 
     886    GDALGeoLocTransformInfo *psInfo =  
     887        (GDALGeoLocTransformInfo *)(pTransformArg); 
     888 
     889    psTree = CPLCreateXMLNode( NULL, CXT_Element, "GeoLocTransformer" ); 
     890 
     891/* -------------------------------------------------------------------- */ 
     892/*      Serialize bReversed.                                            */ 
     893/* -------------------------------------------------------------------- */ 
     894    CPLCreateXMLElementAndValue(  
     895        psTree, "Reversed",  
     896        CPLSPrintf( "%d", psInfo->bReversed ) ); 
     897                                  
     898/* -------------------------------------------------------------------- */ 
     899/*      geoloc metadata.                                                */ 
     900/* -------------------------------------------------------------------- */ 
     901    char **papszMD = psInfo->papszGeolocationInfo; 
     902    CPLXMLNode *psMD= CPLCreateXMLNode( psTree, CXT_Element,  
     903                                        "Metadata" ); 
     904 
     905    for( int i = 0; papszMD != NULL && papszMD[i] != NULL; i++ ) 
     906    { 
     907        const char *pszRawValue; 
     908        char *pszKey; 
     909        CPLXMLNode *psMDI; 
     910                 
     911        pszRawValue = CPLParseNameValue( papszMD[i], &pszKey ); 
     912                 
     913        psMDI = CPLCreateXMLNode( psMD, CXT_Element, "MDI" ); 
     914        CPLSetXMLValue( psMDI, "#key", pszKey ); 
     915        CPLCreateXMLNode( psMDI, CXT_Text, pszRawValue ); 
     916                 
     917        CPLFree( pszKey ); 
     918    } 
     919 
     920    return psTree; 
     921} 
     922 
     923/************************************************************************/ 
     924/*                   GDALDeserializeGeoLocTransformer()                 */ 
     925/************************************************************************/ 
     926 
     927void *GDALDeserializeGeoLocTransformer( CPLXMLNode *psTree ) 
     928 
     929{ 
     930    void *pResult; 
     931    int bReversed; 
     932    char **papszMD = NULL; 
     933    CPLXMLNode *psMDI, *psMetadata; 
     934 
     935/* -------------------------------------------------------------------- */ 
     936/*      Collect metadata.                                               */ 
     937/* -------------------------------------------------------------------- */ 
     938    psMetadata = CPLGetXMLNode( psTree, "Metadata" ); 
     939 
     940    if( psMetadata->eType != CXT_Element 
     941        || !EQUAL(psMetadata->pszValue,"Metadata") ) 
     942        return NULL; 
     943     
     944    for( psMDI = psMetadata->psChild; psMDI != NULL;  
     945         psMDI = psMDI->psNext ) 
     946    { 
     947        if( !EQUAL(psMDI->pszValue,"MDI")  
     948            || psMDI->eType != CXT_Element  
     949            || psMDI->psChild == NULL  
     950            || psMDI->psChild->psNext == NULL  
     951            || psMDI->psChild->eType != CXT_Attribute 
     952            || psMDI->psChild->psChild == NULL ) 
     953            continue; 
     954         
     955        papszMD =  
     956            CSLSetNameValue( papszMD,  
     957                             psMDI->psChild->psChild->pszValue,  
     958                             psMDI->psChild->psNext->pszValue ); 
     959    } 
     960 
     961/* -------------------------------------------------------------------- */ 
     962/*      Get other flags.                                                */ 
     963/* -------------------------------------------------------------------- */ 
     964    bReversed = atoi(CPLGetXMLValue(psTree,"Reversed","0")); 
     965 
     966/* -------------------------------------------------------------------- */ 
     967/*      Generate transformation.                                        */ 
     968/* -------------------------------------------------------------------- */ 
     969    pResult = GDALCreateGeoLocTransformer( NULL, papszMD, bReversed ); 
     970     
     971/* -------------------------------------------------------------------- */ 
     972/*      Cleanup GCP copy.                                               */ 
     973/* -------------------------------------------------------------------- */ 
     974    CSLDestroy( papszMD ); 
     975 
     976    return pResult; 
     977} 
  • trunk/gdal/alg/gdaltransformer.cpp

    r11880 r12446  
    4141CPLXMLNode *GDALSerializeTPSTransformer( void *pTransformArg ); 
    4242void *GDALDeserializeTPSTransformer( CPLXMLNode *psTree ); 
     43CPLXMLNode *GDALSerializeGeoLocTransformer( void *pTransformArg ); 
     44void *GDALDeserializeGeoLocTransformer( CPLXMLNode *psTree ); 
    4345CPL_C_END 
    4446 
     
    967969 
    968970/* -------------------------------------------------------------------- */ 
     971/*      Handle TPS transformation.                                      */ 
     972/* -------------------------------------------------------------------- */ 
     973    else if( psInfo->pSrcGeoLocTransformArg != NULL ) 
     974    { 
     975        CPLXMLNode *psTransformerContainer; 
     976        CPLXMLNode *psTransformer; 
     977 
     978        psTransformerContainer =  
     979            CPLCreateXMLNode( psTree, CXT_Element, "SrcGeoLocTransformer" ); 
     980 
     981        psTransformer =  
     982            GDALSerializeTransformer( NULL, psInfo->pSrcGeoLocTransformArg); 
     983        if( psTransformer != NULL ) 
     984            CPLAddXMLChild( psTransformerContainer, psTransformer ); 
     985    } 
     986 
     987/* -------------------------------------------------------------------- */ 
    969988/*      Handle source geotransforms.                                    */ 
    970989/* -------------------------------------------------------------------- */ 
     
    11051124 
    11061125/* -------------------------------------------------------------------- */ 
     1126/*      Src GeoLoc Transform                                            */ 
     1127/* -------------------------------------------------------------------- */ 
     1128    psSubtree = CPLGetXMLNode( psTree, "SrcGeoLocTransformer" ); 
     1129    if( psSubtree != NULL && psSubtree->psChild != NULL ) 
     1130    { 
     1131        psInfo->pSrcGeoLocTransformArg =  
     1132            GDALDeserializeGeoLocTransformer( psSubtree->psChild ); 
     1133    } 
     1134 
     1135/* -------------------------------------------------------------------- */ 
    11071136/*      DstGeotransform                                                 */ 
    11081137/* -------------------------------------------------------------------- */ 
     
    18231852        *ppTransformArg = GDALDeserializeTPSTransformer( psTree ); 
    18241853    } 
     1854    else if( EQUAL(psTree->pszValue,"GeoLocTransformer") ) 
     1855    { 
     1856        *ppfnFunc = GDALGeoLocTransform; 
     1857        *ppTransformArg = GDALDeserializeGeoLocTransformer( psTree ); 
     1858    } 
    18251859    else if( EQUAL(psTree->pszValue,"ApproxTransformer") ) 
    18261860    {