?? mitab_coordsys.cpp
字號:
adfDatumParm[7] );
}
else if( psDatumInfo->pszOGCDatumName != NULL
&& strlen(psDatumInfo->pszOGCDatumName) > 0 )
{
strncpy( szDatumName, psDatumInfo->pszOGCDatumName,
sizeof(szDatumName) );
}
else
{
sprintf( szDatumName, "MIF %d", nDatum );
}
/* -------------------------------------------------------------------- */
/* Set prime meridian for 9999 datums. */
/* -------------------------------------------------------------------- */
if( nDatum == 9999 || adfDatumParm[7] != 0.0 )
{
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);
parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[5] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
nParmCount = 5;
}
// Transverse Mercator,(modified for Danish System 34 Jylland-Fyn)
else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_21) )
{
nProjection = 21;
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
nParmCount = 5;
}
// Transverse Mercator,(modified for Danish System 34 Sjaelland)
else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_22) )
{
nProjection = 22;
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
nParmCount = 5;
}
// Transverse Mercator,(modified for Danish System 34/45 Bornholm)
else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_23) )
{
nProjection = 23;
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
nParmCount = 5;
}
// Transverse Mercator,(modified for Finnish KKJ)
else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_24) )
{
nProjection = 24;
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);
parms[4] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
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);
parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0);
nParmCount = 4;
}
/* ==============================================================
* Translate Datum and Ellipsoid
* ============================================================== */
int nDatum = 0;
double adfDatumParm[8] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -