📄 mitab_coordsys.cpp
字号:
/* -------------------------------------------------------------------- */ if( nDatum == 9999 ) { pszPrimeM = "non-Greenwich"; dfPMLongToGreenwich = adfDatumParm[7]; }/* -------------------------------------------------------------------- *//* Set the GeogCS. *//* -------------------------------------------------------------------- */ poSR->SetGeogCS( pszGeogName, szDatumName, pszSpheroidName, dfSemiMajor, dfInvFlattening, pszPrimeM, dfPMLongToGreenwich, SRS_UA_DEGREE, atof(SRS_UA_DEGREE_CONV) ); poSR->SetTOWGS84( adfDatumParm[0], adfDatumParm[1], adfDatumParm[2], -adfDatumParm[3], -adfDatumParm[4], -adfDatumParm[5], adfDatumParm[6] );/* -------------------------------------------------------------------- *//* Report on translation. *//* -------------------------------------------------------------------- */ char *pszWKT; poSR->exportToWkt( &pszWKT ); if( pszWKT != NULL ) { CPLDebug( "MITAB", "This CoordSys value:\n%s\nwas translated to:\n%s\n", pszCoordSys, pszWKT ); CPLFree( pszWKT ); } CSLDestroy(papszFields); return poSR;}/************************************************************************//* MITABSpatialRef2CoordSys() *//* *//* Converts a OGRSpatialReference object into a MIF COORDSYS *//* string. *//* *//* The function returns a newly allocated string that should be *//* CPLFree()'d by the caller. *//************************************************************************/char *MITABSpatialRef2CoordSys( OGRSpatialReference * poSR ){ if( poSR == NULL ) return NULL; /*----------------------------------------------------------------- * Get the linear units. *----------------------------------------------------------------*/ double dfLinearConv; char *pszLinearUnits; dfLinearConv = poSR->GetLinearUnits( &pszLinearUnits ); /*----------------------------------------------------------------- * Transform the projection and projection parameters. *----------------------------------------------------------------*/ const char *pszProjection = poSR->GetAttrValue("PROJECTION"); double parms[10]; int nProjection = 0; int nParmCount = 0; if( pszProjection == NULL ) { /*-------------------------------------------------------------- * NULL projection. * We have 2 possibilities: CoordSys NonEarth or Lat/Lon * NonEarth ... is an empty SpatialRef. * Lat/Lon has no "PROJECTION" but GEOGCS is set *-------------------------------------------------------------*/ if ( poSR->GetAttrValue("GEOGCS") == NULL) nProjection = 0; // Non-Earth else nProjection = 1; // Lat/Lon } else if( EQUAL(pszProjection,SRS_PT_ALBERS_CONIC_EQUAL_AREA) ) { nProjection = 9; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 6; } else if( EQUAL(pszProjection,SRS_PT_AZIMUTHAL_EQUIDISTANT) ) { nProjection = 5; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = 90.0; nParmCount = 3; if( ABS((ABS(parms[1]) - 90)) > 0.001 ) nProjection = 28; } else if( EQUAL(pszProjection,SRS_PT_CYLINDRICAL_EQUAL_AREA) ) { nProjection = 2; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); nParmCount = 2; } else if( EQUAL(pszProjection,SRS_PT_ECKERT_IV) ) { nProjection = 14; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_ECKERT_VI) ) { nProjection = 15; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_EQUIDISTANT_CONIC) ) { nProjection = 6; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 6; } else if( EQUAL(pszProjection,SRS_PT_GALL_STEREOGRAPHIC) ) { nProjection = 17; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_HOTINE_OBLIQUE_MERCATOR) ) { nProjection = 7; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = poSR->GetProjParm(SRS_PP_AZIMUTH,0.0); parms[3] = poSR->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[4] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 6; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_AZIMUTHAL_EQUAL_AREA) ) { nProjection = 4; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = 90.0; nParmCount = 3; if( ABS((ABS(parms[1]) - 90)) > 0.001 ) nProjection = 28; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) ) { nProjection = 3; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 6; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP_BELGIUM) ) { nProjection = 19; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSR->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 6; } else if( EQUAL(pszProjection,SRS_PT_MERCATOR_1SP) ) { nProjection = 10; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); nParmCount = 1; if( parms[1] != 0.0 ) { nProjection = 26; nParmCount = 2; } } else if( EQUAL(pszProjection,SRS_PT_MILLER_CYLINDRICAL) ) { nProjection = 11; parms[0] = poSR->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_MOLLWEIDE) ) { nProjection = 13; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_SWISS_OBLIQUE_CYLINDRICAL) ) { nProjection = 25; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 4; } else if( EQUAL(pszProjection,SRS_PT_ROBINSON) ) { nProjection = 12; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_SINUSOIDAL) ) { nProjection = 16; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); nParmCount = 1; } else if( EQUAL(pszProjection,SRS_PT_STEREOGRAPHIC) ) { nProjection = 20; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[3] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 5; } else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR) ) { nProjection = 8; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[3] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 5; } else if( EQUAL(pszProjection,SRS_PT_CASSINI_SOLDNER) ) { nProjection = 30; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 4; } else if( EQUAL(pszProjection,SRS_PT_NEW_ZEALAND_MAP_GRID) ) { nProjection = 18; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 4; } else if( EQUAL(pszProjection,SRS_PT_POLYCONIC) ) { nProjection = 27; parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; nParmCount = 4; } /* ============================================================== * Translate Datum and Ellipsoid * ============================================================== */ int nDatum = 0; double adfDatumParm[8]; int nEllipsoid=0; const char *pszWKTDatum = poSR->GetAttrValue("DATUM"); if( pszWKTDatum == NULL ) { nDatum = 0; if( nProjection == 1 ) nProjection = 0; } /*----------------------------------------------------------------- * We know the MIF datum number, and need to look it up to * translate into datum parameters. *----------------------------------------------------------------*/ else if( EQUALN(pszWKTDatum,"MIF ",4) && atoi(pszWKTDatum+4) != 999 && atoi(pszWKTDatum+4) != 9999 ) { nDatum = atoi(pszWKTDatum+4); } /*----------------------------------------------------------------- * We have the MIF datum parameters, and apply those directly. *----------------------------------------------------------------*/ else if( EQUALN(pszWKTDatum,"MIF ",4) && (atoi(pszWKTDatum+4) == 999 || atoi(pszWKTDatum+4) == 9999) ) { char **papszFields; nDatum = atoi(pszWKTDatum+4); papszFields = CSLTokenizeStringComplex( pszWKTDatum+4, ",", FALSE, TRUE); if( CSLCount(papszFields) >= 5 ) { nEllipsoid = atoi(papszFields[1]); adfDatumParm[0] = atof(papszFields[2]); adfDatumParm[1] = atof(papszFields[3]); adfDatumParm[2] = atof(papszFields[4]); } if( CSLCount(papszFields) >= 10 ) { adfDatumParm[3] = atof(papszFields[5]); adfDatumParm[4] = atof(papszFields[6]); adfDatumParm[5] = atof(papszFields[7]); adfDatumParm[6] = atof(papszFields[8]); adfDatumParm[7] = atof(papszFields[9]); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -