Changeset 12446
- Timestamp:
- 10/16/07 16:32:26 (1 year ago)
- Files:
-
- trunk/gdal/alg/gdalgeoloc.cpp (modified) (6 diffs)
- trunk/gdal/alg/gdaltransformer.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/gdal/alg/gdalgeoloc.cpp
r12420 r12446 40 40 CPL_CVSID("$Id$"); 41 41 42 CPL_C_START 43 CPLXMLNode *GDALSerializeGeoLocTransformer( void *pTransformArg ); 44 void *GDALDeserializeGeoLocTransformer( CPLXMLNode *psTree ); 45 CPL_C_END 46 42 47 /************************************************************************/ 43 48 /* ==================================================================== */ … … 82 87 double dfLINE_OFFSET; 83 88 double dfLINE_STEP; 89 90 char ** papszGeolocationInfo; 84 91 85 92 } GDALGeoLocTransformInfo; … … 599 606 psTransform->sTI.pfnTransform = GDALGeoLocTransform; 600 607 psTransform->sTI.pfnCleanup = GDALDestroyGeoLocTransformer; 601 psTransform->sTI.pfnSerialize = NULL; 608 psTransform->sTI.pfnSerialize = GDALSerializeGeoLocTransformer; 609 psTransform->papszGeolocationInfo = CSLDuplicate( papszGeolocationInfo ); 602 610 603 611 /* -------------------------------------------------------------------- */ … … 626 634 psTransform->hDS_X = hBaseDS; 627 635 GDALReferenceDataset( psTransform->hDS_X ); 636 psTransform->papszGeolocationInfo = 637 CSLSetNameValue( psTransform->papszGeolocationInfo, 638 "X_DATASET", 639 GDALGetDescription( hBaseDS ) ); 628 640 } 629 641 … … 637 649 psTransform->hDS_Y = hBaseDS; 638 650 GDALReferenceDataset( psTransform->hDS_Y ); 651 psTransform->papszGeolocationInfo = 652 CSLSetNameValue( psTransform->papszGeolocationInfo, 653 "Y_DATASET", 654 GDALGetDescription( hBaseDS ) ); 639 655 } 640 656 … … 857 873 return TRUE; 858 874 } 875 876 /************************************************************************/ 877 /* GDALSerializeGeoLocTransformer() */ 878 /************************************************************************/ 879 880 CPLXMLNode *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 927 void *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 41 41 CPLXMLNode *GDALSerializeTPSTransformer( void *pTransformArg ); 42 42 void *GDALDeserializeTPSTransformer( CPLXMLNode *psTree ); 43 CPLXMLNode *GDALSerializeGeoLocTransformer( void *pTransformArg ); 44 void *GDALDeserializeGeoLocTransformer( CPLXMLNode *psTree ); 43 45 CPL_C_END 44 46 … … 967 969 968 970 /* -------------------------------------------------------------------- */ 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 /* -------------------------------------------------------------------- */ 969 988 /* Handle source geotransforms. */ 970 989 /* -------------------------------------------------------------------- */ … … 1105 1124 1106 1125 /* -------------------------------------------------------------------- */ 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 /* -------------------------------------------------------------------- */ 1107 1136 /* DstGeotransform */ 1108 1137 /* -------------------------------------------------------------------- */ … … 1823 1852 *ppTransformArg = GDALDeserializeTPSTransformer( psTree ); 1824 1853 } 1854 else if( EQUAL(psTree->pszValue,"GeoLocTransformer") ) 1855 { 1856 *ppfnFunc = GDALGeoLocTransform; 1857 *ppTransformArg = GDALDeserializeGeoLocTransformer( psTree ); 1858 } 1825 1859 else if( EQUAL(psTree->pszValue,"ApproxTransformer") ) 1826 1860 {
