📄 mitab_spatialref.cpp
字号:
if( ABS((ABS(parms[1]) - 90)) > 0.001 ) sTABProj.nProjId = 28; } else if( EQUAL(pszProjection,SRS_PT_CYLINDRICAL_EQUAL_AREA) ) { sTABProj.nProjId = 2; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); } else if( EQUAL(pszProjection,SRS_PT_ECKERT_IV) ) { sTABProj.nProjId = 14; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_ECKERT_VI) ) { sTABProj.nProjId = 15; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_EQUIDISTANT_CONIC) ) { sTABProj.nProjId = 6; parms[0] = poSpatialRef->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_GALL_STEREOGRAPHIC) ) { sTABProj.nProjId = 17; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_HOTINE_OBLIQUE_MERCATOR) ) { sTABProj.nProjId = 7; parms[0] = poSpatialRef->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_AZIMUTH,0.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_AZIMUTHAL_EQUAL_AREA) ) { sTABProj.nProjId = 4; parms[0] = poSpatialRef->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0); parms[2] = 90.0; if( ABS((ABS(parms[1]) - 90)) > 0.001 ) sTABProj.nProjId = 28; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) ) { sTABProj.nProjId = 3; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP_BELGIUM) ) { sTABProj.nProjId = 19; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0); parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[5] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_MERCATOR_1SP) ) { sTABProj.nProjId = 10; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); if( parms[1] != 0.0 ) sTABProj.nProjId = 26; } else if( EQUAL(pszProjection,SRS_PT_MILLER_CYLINDRICAL) ) { sTABProj.nProjId = 11; parms[0] = poSpatialRef->GetProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0); } else if( EQUAL(pszProjection,SRS_PT_MOLLWEIDE) ) { sTABProj.nProjId = 13; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_NEW_ZEALAND_MAP_GRID) ) { sTABProj.nProjId = 18; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_SWISS_OBLIQUE_CYLINDRICAL) ) { sTABProj.nProjId = 25; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_ROBINSON) ) { sTABProj.nProjId = 12; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_SINUSOIDAL) ) { sTABProj.nProjId = 16; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); } else if( EQUAL(pszProjection,SRS_PT_STEREOGRAPHIC) ) { sTABProj.nProjId = 20; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR) ) { sTABProj.nProjId = 8; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_SCALE_FACTOR,1.0); parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[4] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_CASSINI_SOLDNER) ) { sTABProj.nProjId = 30; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_NEW_ZEALAND_MAP_GRID) ) { sTABProj.nProjId = 18; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } else if( EQUAL(pszProjection,SRS_PT_POLYCONIC) ) { sTABProj.nProjId = 27; parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0) / dfLinearConv; parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) / dfLinearConv; } /* ============================================================== * Translate Datum and Ellipsoid * ============================================================== */ const char *pszWKTDatum = poSpatialRef->GetAttrValue("DATUM"); MapInfoDatumInfo *psDatumInfo = NULL; /*----------------------------------------------------------------- * Default to WGS83 if we have no datum at all. *----------------------------------------------------------------*/ if( pszWKTDatum == NULL ) { psDatumInfo = asDatumInfoList+0; /* WGS 84 */ } /*----------------------------------------------------------------- * 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 ) { int i; for( i = 0; asDatumInfoList[i].nMapInfoDatumID != -1; i++ ) { if( atoi(pszWKTDatum+4) == asDatumInfoList[i].nMapInfoDatumID ) { psDatumInfo = asDatumInfoList + i; break; } } if( psDatumInfo == NULL ) psDatumInfo = asDatumInfoList+0; /* WGS 84 */ } /*----------------------------------------------------------------- * 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; papszFields = CSLTokenizeStringComplex( pszWKTDatum+4, ",", FALSE, TRUE); if( CSLCount(papszFields) >= 5 ) { sTABProj.nEllipsoidId = atoi(papszFields[1]); sTABProj.dDatumShiftX = atof(papszFields[2]); sTABProj.dDatumShiftY = atof(papszFields[3]); sTABProj.dDatumShiftZ = atof(papszFields[4]); } if( CSLCount(papszFields) >= 10 ) { sTABProj.adDatumParams[0] = atof(papszFields[5]); sTABProj.adDatumParams[1] = atof(papszFields[6]); sTABProj.adDatumParams[2] = atof(papszFields[7]); sTABProj.adDatumParams[3] = atof(papszFields[8]); sTABProj.adDatumParams[4] = atof(papszFields[9]); } if( CSLCount(papszFields) < 5 ) psDatumInfo = asDatumInfoList+0; /* WKS84 */ CSLDestroy( papszFields ); } /*----------------------------------------------------------------- * We have a "real" datum name. Try to look it up and get the * parameters. If we don't find it just use WGS84. *----------------------------------------------------------------*/ else { int i; for( i = 0; asDatumInfoList[i].nMapInfoDatumID != -1; i++ ) { if( EQUAL(pszWKTDatum,asDatumInfoList[i].pszOGCDatumName) ) { psDatumInfo = asDatumInfoList + i; break; } } if( psDatumInfo == NULL ) psDatumInfo = asDatumInfoList+0; /* WGS 84 */ } if( psDatumInfo != NULL ) { sTABProj.nEllipsoidId = psDatumInfo->nEllipsoid; sTABProj.dDatumShiftX = psDatumInfo->dfShiftX; sTABProj.dDatumShiftY = psDatumInfo->dfShiftY; sTABProj.dDatumShiftZ = psDatumInfo->dfShiftZ; sTABProj.adDatumParams[0] = psDatumInfo->dfDatumParm0; sTABProj.adDatumParams[1] = psDatumInfo->dfDatumParm1; sTABProj.adDatumParams[2] = psDatumInfo->dfDatumParm2; sTABProj.adDatumParams[3] = psDatumInfo->dfDatumParm3; sTABProj.adDatumParams[4] = psDatumInfo->dfDatumParm4; } /*----------------------------------------------------------------- * Translate the units *----------------------------------------------------------------*/ if( sTABProj.nProjId == 1 || pszLinearUnits == NULL ) sTABProj.nUnitsId = 13; else if( dfLinearConv == 1000.0 ) sTABProj.nUnitsId = 1; else if( dfLinearConv == 0.0254 || EQUAL(pszLinearUnits,"Inch") || EQUAL(pszLinearUnits,"IINCH") ) sTABProj.nUnitsId = 2; else if( dfLinearConv == atof(SRS_UL_FOOT_CONV) || EQUAL(pszLinearUnits,SRS_UL_FOOT) ) sTABProj.nUnitsId = 3; else if( EQUAL(pszLinearUnits,"YARD") || EQUAL(pszLinearUnits,"IYARD") || dfLinearConv == 0.9144 ) sTABProj.nUnitsId = 4; else if( dfLinearConv == 0.001 ) sTABProj.nUnitsId = 5; else if( dfLinearConv == 0.01 ) sTABProj.nUnitsId = 6; else if( dfLinearConv == 1.0 ) sTABProj.nUnitsId = 7; else if( dfLinearConv == atof(SRS_UL_US_FOOT_CONV) || EQUAL(pszLinearUnits,SRS_UL_US_FOOT) ) sTABProj.nUnitsId = 8; else if( EQUAL(pszLinearUnits,SRS_UL_NAUTICAL_MILE) ) sTABProj.nUnitsId = 9; else if( EQUAL(pszLinearUnits,SRS_UL_LINK) || EQUAL(pszLinearUnits,"GUNTERLINK") ) sTABProj.nUnitsId = 30; else if( EQUAL(pszLinearUnits,SRS_UL_CHAIN) || EQUAL(pszLinearUnits,"GUNTERCHAIN") ) sTABProj.nUnitsId = 31; else if( EQUAL(pszLinearUnits,SRS_UL_ROD) ) sTABProj.nUnitsId = 32; else if( EQUAL(pszLinearUnits,"Mile") || EQUAL(pszLinearUnits,"IMILE") ) sTABProj.nUnitsId = 0; else sTABProj.nUnitsId = 7; /*----------------------------------------------------------------- * Set the new parameters in the .MAP header. * This will also trigger lookup of default bounds for the projection. *----------------------------------------------------------------*/ if ( SetProjInfo( &sTABProj ) != 0 ) { CPLError(CE_Failure, CPLE_FileIO, "SetSpatialRef() failed setting projection parameters."); return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -