/** * \brief Validate the current VERT_DATUM's arguments. * * @return OGRERR_NONE if the VERT_DATUM's arguments validate, an error code * otherwise */ OGRErr OGRSpatialReference::ValidateVertDatum(OGR_SRSNode *poRoot) { if ( !EQUAL(poRoot->GetValue(), "VERT_DATUM") ) return OGRERR_NONE; if (poRoot->GetChildCount() < 2 ) { CPLDebug( "OGRSpatialReference::Validate", "Invalid number of children : %d", poRoot->GetChildCount() ); return OGRERR_CORRUPT_DATA; } if (atoi(poRoot->GetChild(1)->GetValue()) == 0) { CPLDebug( "OGRSpatialReference::Validate", "Invalid value for datum type (%s) : must be a number\n", poRoot->GetChild(1)->GetValue()); return OGRERR_CORRUPT_DATA; } OGR_SRSNode *poNode; int i; for( i = 2; i < poRoot->GetChildCount(); i++ ) { poNode = poRoot->GetChild(i); if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"EXTENSION") ) { // We do not try to control the sub-organization of // EXTENSION nodes. } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for VERT_DATUM `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } return OGRERR_NONE; }
OGRErr OGRSpatialReference::Validate(OGR_SRSNode *poRoot) { if( !EQUAL(poRoot->GetValue(),"GEOGCS") && !EQUAL(poRoot->GetValue(),"PROJCS") && !EQUAL(poRoot->GetValue(),"LOCAL_CS") && !EQUAL(poRoot->GetValue(),"GEOCCS") && !EQUAL(poRoot->GetValue(),"VERT_CS") && !EQUAL(poRoot->GetValue(),"COMPD_CS")) { CPLDebug( "OGRSpatialReference::Validate", "Unrecognised root node `%s'\n", poRoot->GetValue() ); return OGRERR_CORRUPT_DATA; } /* -------------------------------------------------------------------- */ /* For a COMPD_CS, validate subparameters and head & tail cs */ /* -------------------------------------------------------------------- */ if( EQUAL(poRoot->GetValue(),"COMPD_CS") ) { OGR_SRSNode *poNode; int i; for( i = 1; i < poRoot->GetChildCount(); i++ ) { poNode = poRoot->GetChild(i); if( EQUAL(poNode->GetValue(),"GEOGCS") || EQUAL(poNode->GetValue(),"PROJCS") || EQUAL(poNode->GetValue(),"LOCAL_CS") || EQUAL(poNode->GetValue(),"GEOCCS") || EQUAL(poNode->GetValue(),"VERT_CS") || EQUAL(poNode->GetValue(),"COMPD_CS") ) { OGRErr eErr = Validate(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for COMPD_CS `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } return OGRERR_NONE; } /* -------------------------------------------------------------------- */ /* Validate VERT_CS */ /* -------------------------------------------------------------------- */ if( EQUAL(poRoot->GetValue(),"VERT_CS") ) { OGR_SRSNode *poNode; int i; int bGotVertDatum = FALSE; int bGotUnit = FALSE; int nCountAxis = 0; for( i = 1; i < poRoot->GetChildCount(); i++ ) { poNode = poRoot->GetChild(i); if( EQUAL(poNode->GetValue(),"VERT_DATUM") ) { OGRErr eErr = ValidateVertDatum(poNode); if (eErr != OGRERR_NONE) return eErr; bGotVertDatum = TRUE; } else if( EQUAL(poNode->GetValue(),"UNIT") ) { OGRErr eErr = ValidateUnit(poNode); if (eErr != OGRERR_NONE) return eErr; bGotUnit = TRUE; } else if( EQUAL(poNode->GetValue(),"AXIS") ) { OGRErr eErr = ValidateAxis(poNode); if (eErr != OGRERR_NONE) return eErr; nCountAxis ++; } else if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for VERT_CS `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } if (!bGotVertDatum) { CPLDebug( "OGRSpatialReference::Validate", "No VERT_DATUM child in VERT_CS.\n" ); return OGRERR_CORRUPT_DATA; } if (!bGotUnit) { CPLDebug( "OGRSpatialReference::Validate", "No UNIT child in VERT_CS.\n" ); return OGRERR_CORRUPT_DATA; } if (nCountAxis > 1) { CPLDebug( "OGRSpatialReference::Validate", "Too many AXIS children in VERT_CS.\n" ); return OGRERR_CORRUPT_DATA; } return OGRERR_NONE; } /* -------------------------------------------------------------------- */ /* For a PROJCS, validate subparameters (other than GEOGCS). */ /* -------------------------------------------------------------------- */ if( EQUAL(poRoot->GetValue(),"PROJCS") ) { OGR_SRSNode *poNode; int i; for( i = 1; i < poRoot->GetChildCount(); i++ ) { poNode = poRoot->GetChild(i); if( EQUAL(poNode->GetValue(),"GEOGCS") ) { /* validated elsewhere */ } else if( EQUAL(poNode->GetValue(),"UNIT") ) { OGRErr eErr = ValidateUnit(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"PARAMETER") ) { if( poNode->GetChildCount() != 2 ) { CPLDebug( "OGRSpatialReference::Validate", "PARAMETER has wrong number of children (%d)," "not 2 as expected.\n", poNode->GetChildCount() ); return OGRERR_CORRUPT_DATA; } else if( CSLFindString( (char **)papszParameters, poNode->GetChild(0)->GetValue()) == -1) { CPLDebug( "OGRSpatialReference::Validate", "Unrecognised PARAMETER `%s'.\n", poNode->GetChild(0)->GetValue() ); return OGRERR_UNSUPPORTED_SRS; } } else if( EQUAL(poNode->GetValue(),"PROJECTION") ) { if( poNode->GetChildCount() != 1 && poNode->GetChildCount() != 2 ) { CPLDebug( "OGRSpatialReference::Validate", "PROJECTION has wrong number of children (%d)," "not 1 or 2 as expected.\n", poNode->GetChildCount() ); return OGRERR_CORRUPT_DATA; } else if( CSLFindString( (char **)papszProjectionSupported, poNode->GetChild(0)->GetValue()) == -1 && CSLFindString( (char **)papszProjectionUnsupported, poNode->GetChild(0)->GetValue()) == -1) { CPLDebug( "OGRSpatialReference::Validate", "Unrecognised PROJECTION `%s'.\n", poNode->GetChild(0)->GetValue() ); return OGRERR_UNSUPPORTED_SRS; } else if( CSLFindString( (char **)papszProjectionSupported, poNode->GetChild(0)->GetValue()) == -1) { CPLDebug( "OGRSpatialReference::Validate", "Unsupported, but recognised PROJECTION `%s'.\n", poNode->GetChild(0)->GetValue() ); return OGRERR_UNSUPPORTED_SRS; } if (poNode->GetChildCount() == 2) { poNode = poNode->GetChild(1); if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for PROJECTION `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } } else if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"AXIS") ) { OGRErr eErr = ValidateAxis(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"EXTENSION") ) { // We do not try to control the sub-organization of // EXTENSION nodes. } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for PROJCS `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } } /* -------------------------------------------------------------------- */ /* Validate GEOGCS if found. */ /* -------------------------------------------------------------------- */ OGR_SRSNode *poGEOGCS = poRoot->GetNode( "GEOGCS" ); if( poGEOGCS != NULL ) { OGR_SRSNode *poNode; int i; for( i = 1; i < poGEOGCS->GetChildCount(); i++ ) { poNode = poGEOGCS->GetChild(i); if( EQUAL(poNode->GetValue(),"DATUM") ) { /* validated elsewhere */ } else if( EQUAL(poNode->GetValue(),"PRIMEM") ) { if( poNode->GetChildCount() < 2 || poNode->GetChildCount() > 3 ) { CPLDebug( "OGRSpatialReference::Validate", "PRIMEM has wrong number of children (%d)," "not 2 or 3 as expected.\n", poNode->GetChildCount() ); return OGRERR_CORRUPT_DATA; } } else if( EQUAL(poNode->GetValue(),"UNIT") ) { OGRErr eErr = ValidateUnit(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"AXIS") ) { OGRErr eErr = ValidateAxis(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for GEOGCS `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } if( poGEOGCS->GetNode("DATUM") == NULL ) { CPLDebug( "OGRSpatialReference::Validate", "No DATUM child in GEOGCS.\n" ); return OGRERR_CORRUPT_DATA; } } /* -------------------------------------------------------------------- */ /* Validate DATUM/SPHEROID. */ /* -------------------------------------------------------------------- */ OGR_SRSNode *poDATUM = poRoot->GetNode( "DATUM" ); if( poDATUM != NULL ) { OGR_SRSNode *poSPHEROID; int bGotSpheroid = FALSE; int i; if( poDATUM->GetChildCount() == 0 ) { CPLDebug( "OGRSpatialReference::Validate", "DATUM has no children." ); return OGRERR_CORRUPT_DATA; } for( i = 1; i < poDATUM->GetChildCount(); i++ ) { OGR_SRSNode *poNode; poNode = poDATUM->GetChild(i); if( EQUAL(poNode->GetValue(),"SPHEROID") ) { poSPHEROID = poDATUM->GetChild(1); bGotSpheroid = TRUE; if( poSPHEROID->GetChildCount() != 3 && poSPHEROID->GetChildCount() != 4 ) { CPLDebug( "OGRSpatialReference::Validate", "SPHEROID has wrong number of children (%d)," "not 3 or 4 as expected.\n", poSPHEROID->GetChildCount() ); return OGRERR_CORRUPT_DATA; } else if( CPLAtof(poSPHEROID->GetChild(1)->GetValue()) == 0.0 ) { CPLDebug( "OGRSpatialReference::Validate", "SPHEROID semi-major axis is zero (%s)!\n", poSPHEROID->GetChild(1)->GetValue() ); return OGRERR_CORRUPT_DATA; } } else if( EQUAL(poNode->GetValue(),"AUTHORITY") ) { OGRErr eErr = ValidateAuthority(poNode); if (eErr != OGRERR_NONE) return eErr; } else if( EQUAL(poNode->GetValue(),"TOWGS84") ) { if( poNode->GetChildCount() != 3 && poNode->GetChildCount() != 7) { CPLDebug( "OGRSpatialReference::Validate", "TOWGS84 has wrong number of children (%d), not 3 or 7.\n", poNode->GetChildCount() ); return OGRERR_CORRUPT_DATA; } } else { CPLDebug( "OGRSpatialReference::Validate", "Unexpected child for DATUM `%s'.\n", poNode->GetValue() ); return OGRERR_CORRUPT_DATA; } } if( !bGotSpheroid ) { CPLDebug( "OGRSpatialReference::Validate", "No SPHEROID child in DATUM.\n" ); return OGRERR_CORRUPT_DATA; } } /* -------------------------------------------------------------------- */ /* If this is projected, try to validate the detailed set of */ /* parameters used for the projection. */ /* -------------------------------------------------------------------- */ OGRErr eErr; eErr = ValidateProjection(poRoot); if( eErr != OGRERR_NONE ) return eErr; /* -------------------------------------------------------------------- */ /* Final check. */ /* -------------------------------------------------------------------- */ if( EQUAL(poRoot->GetValue(),"GEOCCS") ) return OGRERR_UNSUPPORTED_SRS; return OGRERR_NONE; }
/** * \brief Validate the current PROJECTION's arguments. * * @return OGRERR_NONE if the PROJECTION's arguments validate, an error code * otherwise */ OGRErr OGRSpatialReference::ValidateProjection(OGR_SRSNode *poRoot) { OGR_SRSNode *poPROJCS = poRoot->GetNode( "PROJCS" ); if( poPROJCS == NULL ) return OGRERR_NONE; if( poPROJCS->GetNode( "PROJECTION" ) == NULL ) { CPLDebug( "OGRSpatialReference::Validate", "PROJCS does not have PROJECTION subnode." ); return OGRERR_CORRUPT_DATA; } /* -------------------------------------------------------------------- */ /* Find the matching group in the proj and parms table. */ /* -------------------------------------------------------------------- */ const char *pszProjection; int iOffset; pszProjection = poPROJCS->GetNode("PROJECTION")->GetChild(0)->GetValue(); for( iOffset = 0; papszProjWithParms[iOffset] != NULL && !EQUAL(papszProjWithParms[iOffset],pszProjection); ) { while( papszProjWithParms[iOffset] != NULL ) iOffset++; iOffset++; } if( papszProjWithParms[iOffset] == NULL ) return OGRERR_UNSUPPORTED_SRS; iOffset++; /* -------------------------------------------------------------------- */ /* Check all parameters, and verify they are in the permitted */ /* list. */ /* -------------------------------------------------------------------- */ int iNode; for( iNode = 0; iNode < poPROJCS->GetChildCount(); iNode++ ) { OGR_SRSNode *poParm = poPROJCS->GetChild(iNode); int i; const char *pszParmName; if( !EQUAL(poParm->GetValue(),"PARAMETER") ) continue; pszParmName = poParm->GetChild(0)->GetValue(); for( i = iOffset; papszProjWithParms[i] != NULL; i++ ) { if( EQUAL(papszProjWithParms[i],pszParmName) ) break; } /* This parameter is not an exact match, is it an alias? */ if( papszProjWithParms[i] == NULL ) { for( i = iOffset; papszProjWithParms[i] != NULL; i++ ) { if( IsAliasFor(papszProjWithParms[i],pszParmName) ) break; } if( papszProjWithParms[i] == NULL ) { CPLDebug( "OGRSpatialReference::Validate", "PARAMETER %s for PROJECTION %s is not permitted.", pszParmName, pszProjection ); return OGRERR_CORRUPT_DATA; } else { CPLDebug( "OGRSpatialReference::Validate", "PARAMETER %s for PROJECTION %s is an alias for %s.", pszParmName, pszProjection, papszProjWithParms[i] ); return OGRERR_CORRUPT_DATA; } } } return OGRERR_NONE; }
bool rspfOgcWktTranslator::toOssimKwl( const rspfString& wktString, rspfKeywordlist &kwl, const char *prefix)const { static const char MODULE[] = "rspfOgcWktTranslator::toOssimKwl"; if(traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << MODULE << " entered...\n"; } const char* wkt = wktString.c_str(); OGRSpatialReferenceH hSRS = NULL; rspfDpt falseEastingNorthing; hSRS = OSRNewSpatialReference(NULL); if( OSRImportFromWkt( hSRS, (char **) &wkt ) != OGRERR_NONE ) { OSRDestroySpatialReference( hSRS ); return false; } rspfString rspfProj = ""; const char* epsg_code = OSRGetAttrValue( hSRS, "AUTHORITY", 1 ); if(traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << "epsg_code: " << (epsg_code?epsg_code:"null") << "\n"; } const char* units = NULL; OGR_SRSNode* node = ((OGRSpatialReference *)hSRS)->GetRoot(); int nbChild = node->GetChildCount(); for (int i = 0; i < nbChild; i++) { OGR_SRSNode* curChild = node->GetChild(i); if (strcmp(curChild->GetValue(), "UNIT") == 0) { units = curChild->GetChild(0)->GetValue(); } } if(traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << "units: " << (units?units:"null") << "\n"; } rspfString rspf_units; bool bGeog = OSRIsGeographic(hSRS); if ( bGeog == false ) { rspf_units = "meters"; if ( units != NULL ) { rspfString s = units; s.downcase(); if( ( s == rspfString("us survey foot") ) || ( s == rspfString("u.s. foot") ) || ( s == rspfString("foot_us") ) ) { rspf_units = "us_survey_feet"; } else if( s == rspfString("degree") ) { rspf_units = "degrees"; } else if( ( s == rspfString("meter") ) || ( s == rspfString("metre") ) ) { rspf_units = "meters"; } } } else { rspf_units = "degrees"; } if(traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << "rspf_units: " << rspf_units << "\n"; } if (epsg_code) { rspfString epsg_spec ("EPSG:"); epsg_spec += rspfString::toString(epsg_code); rspfProjection* proj = rspfEpsgProjectionFactory::instance()->createProjection(epsg_spec); if (proj) rspfProj = proj->getClassName(); delete proj; } if(rspfProj == "") { const char* pszProjection = OSRGetAttrValue( hSRS, "PROJECTION", 0 ); if(pszProjection) { rspfProj = wktToOssimProjection(pszProjection); } else { rspfString localCs = OSRGetAttrValue( hSRS, "LOCAL_CS", 0 ); localCs = localCs.upcase(); if(localCs == "GREATBRITAIN_GRID") { rspfProj = "rspfBngProjection"; } else if (rspf_units.contains("degree")) { rspfProj = "rspfEquDistCylProjection"; } } } if(rspfProj == "rspfEquDistCylProjection" ) rspf_units = "degrees"; kwl.add(prefix, rspfKeywordNames::UNITS_KW, rspf_units, true); if (traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << MODULE << "DEBUG:" << "\nrspfProj = " << rspfProj << endl; } kwl.add(prefix, rspfKeywordNames::TYPE_KW, rspfProj.c_str(), true); falseEastingNorthing.x = OSRGetProjParm(hSRS, SRS_PP_FALSE_EASTING, 0.0, NULL); falseEastingNorthing.y = OSRGetProjParm(hSRS, SRS_PP_FALSE_NORTHING, 0.0, NULL); if (epsg_code) { kwl.add(prefix, rspfKeywordNames::PCS_CODE_KW, epsg_code, true); } if(rspfProj == "rspfBngProjection") { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfBngProjection", true); } else if(rspfProj == "rspfCylEquAreaProjection") { kwl.add(prefix, rspfKeywordNames::STD_PARALLEL_1_KW, OSRGetProjParm(hSRS, SRS_PP_STANDARD_PARALLEL_1, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::ORIGIN_LATITUDE_KW, OSRGetProjParm(hSRS, SRS_PP_STANDARD_PARALLEL_1, 0.0, NULL), true); rspfUnitType units = static_cast<rspfUnitType>(rspfUnitTypeLut::instance()-> getEntryNumber(rspf_units.c_str())); if ( units == RSPF_METERS || units == RSPF_FEET || units == RSPF_US_SURVEY_FEET ) { kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); } } else if(rspfProj == "rspfEquDistCylProjection") { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfEquDistCylProjection", true); rspfUnitType units = static_cast<rspfUnitType>(rspfUnitTypeLut::instance()-> getEntryNumber(rspf_units.c_str())); if ( units == RSPF_METERS || units == RSPF_FEET || units == RSPF_US_SURVEY_FEET ) { kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); } kwl.add(prefix, rspfKeywordNames::ORIGIN_LATITUDE_KW, OSRGetProjParm(hSRS, SRS_PP_LATITUDE_OF_ORIGIN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::CENTRAL_MERIDIAN_KW, OSRGetProjParm(hSRS, SRS_PP_CENTRAL_MERIDIAN, 0.0, NULL), true); } else if( (rspfProj == "rspfLambertConformalConicProjection") || (rspfProj == "rspfAlbersProjection") ) { kwl.add(prefix, rspfKeywordNames::TYPE_KW, rspfProj.c_str(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); kwl.add(prefix, rspfKeywordNames::ORIGIN_LATITUDE_KW, OSRGetProjParm(hSRS, SRS_PP_LATITUDE_OF_ORIGIN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::CENTRAL_MERIDIAN_KW, OSRGetProjParm(hSRS, SRS_PP_CENTRAL_MERIDIAN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::STD_PARALLEL_1_KW, OSRGetProjParm(hSRS, SRS_PP_STANDARD_PARALLEL_1, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::STD_PARALLEL_2_KW, OSRGetProjParm(hSRS, SRS_PP_STANDARD_PARALLEL_2, 0.0, NULL), true); } else if(rspfProj == "rspfMercatorProjection") { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfMercatorProjection", true); kwl.add(prefix, rspfKeywordNames::ORIGIN_LATITUDE_KW, OSRGetProjParm(hSRS, SRS_PP_LATITUDE_OF_ORIGIN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::CENTRAL_MERIDIAN_KW, OSRGetProjParm(hSRS, SRS_PP_CENTRAL_MERIDIAN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); } else if(rspfProj == "rspfSinusoidalProjection") { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfSinusoidalProjection", true); kwl.add(prefix, rspfKeywordNames::CENTRAL_MERIDIAN_KW, OSRGetProjParm(hSRS, SRS_PP_CENTRAL_MERIDIAN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); } else if(rspfProj == "rspfTransMercatorProjection") { int bNorth; int nZone = OSRGetUTMZone( hSRS, &bNorth ); if( nZone != 0 ) { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfUtmProjection", true); kwl.add(prefix, rspfKeywordNames::ZONE_KW, nZone, true); if( bNorth ) { kwl.add(prefix, rspfKeywordNames::HEMISPHERE_KW, "N", true); } else { kwl.add(prefix, rspfKeywordNames::HEMISPHERE_KW, "S", true); } } else { kwl.add(prefix, rspfKeywordNames::TYPE_KW, "rspfTransMercatorProjection", true); kwl.add(prefix, rspfKeywordNames::SCALE_FACTOR_KW, OSRGetProjParm(hSRS, SRS_PP_SCALE_FACTOR, 1.0, NULL), true); kwl.add(prefix, rspfKeywordNames::ORIGIN_LATITUDE_KW, OSRGetProjParm(hSRS, SRS_PP_LATITUDE_OF_ORIGIN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::CENTRAL_MERIDIAN_KW, OSRGetProjParm(hSRS, SRS_PP_CENTRAL_MERIDIAN, 0.0, NULL), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_KW, falseEastingNorthing.toString(), true); kwl.add(prefix, rspfKeywordNames::FALSE_EASTING_NORTHING_UNITS_KW, rspf_units, true); } } else { if (traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << "rspfOgcWktTranslator::toOssimKwl DEBUG:\n" << "Projection conversion to RSPF not supported !!!!!!!!!\n" << "Please send the following string to the development staff\n" << "to be added to the transaltion to RSPF\n" << wkt << endl; } return false; } const char *datum = OSRGetAttrValue( hSRS, "DATUM", 0 ); rspfString oDatum = "WGE"; if( datum ) { oDatum = wktToOssimDatum(datum); if(oDatum == "") { oDatum = "WGE"; } } kwl.add(prefix, rspfKeywordNames::DATUM_KW, oDatum, true); OSRDestroySpatialReference( hSRS ); if (traceDebug()) { rspfNotify(rspfNotifyLevel_DEBUG) << MODULE << " exit status = true" << std::endl; } return true; }