OGRBoolean SetCitationToSRS(GTIF* hGTIF, char* szCTString, int nCTStringLen, geokey_t geoKey, OGRSpatialReference* poSRS, OGRBoolean* linearUnitIsSet) { OGRBoolean ret = FALSE; *linearUnitIsSet = FALSE; char* imgCTName = ImagineCitationTranslation(szCTString, geoKey); if(imgCTName) { strncpy(szCTString, imgCTName, nCTStringLen); szCTString[nCTStringLen-1] = '\0'; CPLFree( imgCTName ); } char** ctNames = CitationStringParse(szCTString); if(ctNames) { if( poSRS->GetRoot() == NULL) poSRS->SetNode( "PROJCS", "unnamed" ); if(ctNames[CitPcsName]) { poSRS->SetNode( "PROJCS", ctNames[CitPcsName] ); ret = TRUE; } else if(geoKey != GTCitationGeoKey) { char szPCSName[128]; if( GTIFKeyGet( hGTIF, GTCitationGeoKey, szPCSName, 0, sizeof(szPCSName) ) ) { poSRS->SetNode( "PROJCS", szPCSName ); ret = TRUE; } } if(ctNames[CitProjectionName]) poSRS->SetProjection( ctNames[CitProjectionName] ); if(ctNames[CitLUnitsName]) { double unitSize; if (GTIFKeyGet(hGTIF, ProjLinearUnitSizeGeoKey, &unitSize, 0, sizeof(unitSize) )) { poSRS->SetLinearUnits( ctNames[CitLUnitsName], unitSize); *linearUnitIsSet = TRUE; } } for(int i= 0; i<nCitationNameTypes; i++) CPLFree( ctNames[i] ); CPLFree( ctNames ); } return ret; }
void GetGeogCSFromCitation(char* szGCSName, int nGCSName, geokey_t geoKey, char **ppszGeogName, char **ppszDatumName, char **ppszPMName, char **ppszSpheroidName, char **ppszAngularUnits) { *ppszGeogName = *ppszDatumName = *ppszPMName = *ppszSpheroidName = *ppszAngularUnits = NULL; char* imgCTName = ImagineCitationTranslation(szGCSName, geoKey); if(imgCTName) { strncpy(szGCSName, imgCTName, nGCSName); szGCSName[nGCSName-1] = '\0'; CPLFree( imgCTName ); } char** ctNames = CitationStringParse(szGCSName, geoKey); if(ctNames) { if(ctNames[CitGcsName]) *ppszGeogName = CPLStrdup( ctNames[CitGcsName] ); if(ctNames[CitDatumName]) *ppszDatumName = CPLStrdup( ctNames[CitDatumName] ); if(ctNames[CitEllipsoidName]) *ppszSpheroidName = CPLStrdup( ctNames[CitEllipsoidName] ); if(ctNames[CitPrimemName]) *ppszPMName = CPLStrdup( ctNames[CitPrimemName] ); if(ctNames[CitAUnitsName]) *ppszAngularUnits = CPLStrdup( ctNames[CitAUnitsName] ); for(int i= 0; i<nCitationNameTypes; i++) CPLFree( ctNames[i] ); CPLFree( ctNames ); } return; }
OGRBoolean SetCitationToSRS(GTIF* hGTIF, char* szCTString, int nCTStringLen, geokey_t geoKey, OGRSpatialReference* poSRS, OGRBoolean* linearUnitIsSet) { OGRBoolean ret = FALSE; char* lUnitName = NULL; poSRS->GetLinearUnits( &lUnitName ); if(!lUnitName || strlen(lUnitName) == 0 || EQUAL(lUnitName, "unknown")) *linearUnitIsSet = FALSE; else *linearUnitIsSet = TRUE; char* imgCTName = ImagineCitationTranslation(szCTString, geoKey); if(imgCTName) { strncpy(szCTString, imgCTName, nCTStringLen); szCTString[nCTStringLen-1] = '\0'; CPLFree( imgCTName ); } char** ctNames = CitationStringParse(szCTString, geoKey); if(ctNames) { if( poSRS->GetRoot() == NULL) poSRS->SetNode( "PROJCS", "unnamed" ); if(ctNames[CitPcsName]) { poSRS->SetNode( "PROJCS", ctNames[CitPcsName] ); ret = TRUE; } if(ctNames[CitProjectionName]) poSRS->SetProjection( ctNames[CitProjectionName] ); if(ctNames[CitLUnitsName]) { double unitSize = 0.0; int size = strlen(ctNames[CitLUnitsName]); if(strchr(ctNames[CitLUnitsName], '\0')) size -= 1; for( int i = 0; apszUnitMap[i] != NULL; i += 2 ) { if( EQUALN(apszUnitMap[i], ctNames[CitLUnitsName], size) ) { unitSize = atof(apszUnitMap[i+1]); break; } } if( unitSize == 0.0 ) GTIFKeyGet(hGTIF, ProjLinearUnitSizeGeoKey, &unitSize, 0, sizeof(unitSize) ); poSRS->SetLinearUnits( ctNames[CitLUnitsName], unitSize); *linearUnitIsSet = TRUE; } for(int i= 0; i<nCitationNameTypes; i++) CPLFree( ctNames[i] ); CPLFree( ctNames ); } /* if no "PCS Name = " (from Erdas) in GTCitationGeoKey */ if(geoKey == GTCitationGeoKey) { if(strlen(szCTString) > 0 && !strstr(szCTString, "PCS Name = ")) { const char* pszProjCS = poSRS->GetAttrValue( "PROJCS" ); if((!(pszProjCS && strlen(pszProjCS) > 0) && !strstr(szCTString, "Projected Coordinates")) ||(pszProjCS && strstr(pszProjCS, "unnamed"))) poSRS->SetNode( "PROJCS", szCTString ); ret = TRUE; } } return ret; }