void *GDALDeserializeRPCTransformer( CPLXMLNode *psTree ) { void *pResult; char **papszOptions = NULL; /* -------------------------------------------------------------------- */ /* Collect metadata. */ /* -------------------------------------------------------------------- */ char **papszMD = NULL; CPLXMLNode *psMDI, *psMetadata; GDALRPCInfo sRPC; psMetadata = CPLGetXMLNode( psTree, "Metadata" ); if( psMetadata == NULL || psMetadata->eType != CXT_Element || !EQUAL(psMetadata->pszValue,"Metadata") ) return NULL; for( psMDI = psMetadata->psChild; psMDI != NULL; psMDI = psMDI->psNext ) { if( !EQUAL(psMDI->pszValue,"MDI") || psMDI->eType != CXT_Element || psMDI->psChild == NULL || psMDI->psChild->psNext == NULL || psMDI->psChild->eType != CXT_Attribute || psMDI->psChild->psChild == NULL ) continue; papszMD = CSLSetNameValue( papszMD, psMDI->psChild->psChild->pszValue, psMDI->psChild->psNext->pszValue ); } if( !GDALExtractRPCInfo( papszMD, &sRPC ) ) { CPLError( CE_Failure, CPLE_AppDefined, "Failed to reconstitute RPC transformer." ); CSLDestroy( papszMD ); return NULL; } CSLDestroy( papszMD ); /* -------------------------------------------------------------------- */ /* Get other flags. */ /* -------------------------------------------------------------------- */ double dfPixErrThreshold; int bReversed; bReversed = atoi(CPLGetXMLValue(psTree,"Reversed","0")); dfPixErrThreshold = CPLAtof(CPLGetXMLValue(psTree,"PixErrThreshold","0.25")); papszOptions = CSLSetNameValue( papszOptions, "RPC_HEIGHT", CPLGetXMLValue(psTree,"HeightOffset","0")); papszOptions = CSLSetNameValue( papszOptions, "RPC_HEIGHT_SCALE", CPLGetXMLValue(psTree,"HeightScale","1")); const char* pszDEMPath = CPLGetXMLValue(psTree,"DEMPath",NULL); if (pszDEMPath != NULL) papszOptions = CSLSetNameValue( papszOptions, "RPC_DEM", pszDEMPath); const char* pszDEMInterpolation = CPLGetXMLValue(psTree,"DEMInterpolation", "bilinear"); if (pszDEMInterpolation != NULL) papszOptions = CSLSetNameValue( papszOptions, "RPC_DEMINTERPOLATION", pszDEMInterpolation); /* -------------------------------------------------------------------- */ /* Generate transformation. */ /* -------------------------------------------------------------------- */ pResult = GDALCreateRPCTransformer( &sRPC, bReversed, dfPixErrThreshold, papszOptions ); CSLDestroy( papszOptions ); return pResult; }
void RPCCamera::CreateTransforms() { forwardTransform = GDALCreateRPCTransformer(&rpcModel.rpcInfo, false, 0.1, nullptr); inverseTransform = GDALCreateRPCTransformer(&rpcModel.rpcInfo, true, 0.1, nullptr); }