?? mitab_coordsys.cpp
字號:
}
/*-----------------------------------------------------------------
* 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]);
}
if( CSLCount(papszFields) < 5 )
nDatum = 104; /* WGS84 */
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) )
{
nDatum = asDatumInfoList[i].nMapInfoDatumID;
break;
}
}
if( nDatum == 0 )
nDatum = 104; /* WGS84 */
}
/*-----------------------------------------------------------------
* Translate the units
*----------------------------------------------------------------*/
const char *pszMIFUnits = "m";
if( nProjection == 1 )
pszMIFUnits = NULL;
else if( pszLinearUnits == NULL )
pszMIFUnits = "m";
else if( dfLinearConv == 1000.0 )
pszMIFUnits = "km";
else if( dfLinearConv == 0.0254 || EQUAL(pszLinearUnits,"Inch")
|| EQUAL(pszLinearUnits,"IINCH"))
pszMIFUnits = "in";
else if( dfLinearConv == atof(SRS_UL_FOOT_CONV)
|| EQUAL(pszLinearUnits,SRS_UL_FOOT) )
pszMIFUnits = "ft";
else if( EQUAL(pszLinearUnits,"YARD") || EQUAL(pszLinearUnits,"IYARD")
|| dfLinearConv == 0.9144 )
pszMIFUnits = "yd";
else if( dfLinearConv == 0.001 )
pszMIFUnits = "mm";
else if( dfLinearConv == 0.01 )
pszMIFUnits = "cm";
else if( dfLinearConv == 1.0 )
pszMIFUnits = "m";
else if( dfLinearConv == atof(SRS_UL_US_FOOT_CONV)
|| EQUAL(pszLinearUnits,SRS_UL_US_FOOT) )
pszMIFUnits = "survey ft";
else if( EQUAL(pszLinearUnits,SRS_UL_NAUTICAL_MILE) )
pszMIFUnits = "nmi";
else if( EQUAL(pszLinearUnits,SRS_UL_LINK)
|| EQUAL(pszLinearUnits,"GUNTERLINK") )
pszMIFUnits = "li";
else if( EQUAL(pszLinearUnits,SRS_UL_CHAIN)
|| EQUAL(pszLinearUnits,"GUNTERCHAIN") )
pszMIFUnits = "ch";
else if( EQUAL(pszLinearUnits,SRS_UL_ROD) )
pszMIFUnits = "rd";
else if( EQUAL(pszLinearUnits,"Mile")
|| EQUAL(pszLinearUnits,"IMILE") )
pszMIFUnits = "mi";
/* -------------------------------------------------------------------- */
/* Build coordinate system definition. */
/* -------------------------------------------------------------------- */
char szCoordSys[256];
if( nProjection != 0 )
{
sprintf( szCoordSys,
"Earth Projection %d",
nProjection );
}
else
sprintf( szCoordSys,
"NonEarth Units" );
/* -------------------------------------------------------------------- */
/* Append Datum */
/* -------------------------------------------------------------------- */
if( nProjection != 0 )
{
sprintf( szCoordSys + strlen(szCoordSys),
", %d",
nDatum );
if( nDatum == 999 || nDatum == 9999 )
{
sprintf( szCoordSys + strlen(szCoordSys),
", %d, %.15g, %.15g, %.15g",
nEllipsoid,
adfDatumParm[0], adfDatumParm[1], adfDatumParm[2] );
}
if( nDatum == 9999 )
{
sprintf( szCoordSys + strlen(szCoordSys),
", %.15g, %.15g, %.15g, %.15g, %.15g",
adfDatumParm[3], adfDatumParm[4], adfDatumParm[5],
adfDatumParm[6], adfDatumParm[7] );
}
}
/* -------------------------------------------------------------------- */
/* Append units. */
/* -------------------------------------------------------------------- */
if( nProjection != 1 && pszMIFUnits != NULL )
{
if( nProjection != 0 )
strcat( szCoordSys, "," );
sprintf( szCoordSys + strlen(szCoordSys),
" \"%s\"",
pszMIFUnits );
}
/* -------------------------------------------------------------------- */
/* Append Projection Parms. */
/* -------------------------------------------------------------------- */
for( int iParm = 0; iParm < nParmCount; iParm++ )
sprintf( szCoordSys + strlen(szCoordSys),
", %.15g",
parms[iParm] );
/* -------------------------------------------------------------------- */
/* Report on translation */
/* -------------------------------------------------------------------- */
char *pszWKT = NULL;
poSR->exportToWkt( &pszWKT );
if( pszWKT != NULL )
{
CPLDebug( "MITAB",
"This WKT Projection:\n%s\n\ntranslates to:\n%s\n",
pszWKT, szCoordSys );
CPLFree( pszWKT );
}
return( CPLStrdup( szCoordSys ) );
}
/************************************************************************/
/* MITABExtractCoordSysBounds */
/* */
/* Return TRUE if MIF coordsys string contains a BOUNDS parameter and */
/* Set x/y min/max values. */
/************************************************************************/
GBool MITABExtractCoordSysBounds( const char * pszCoordSys,
double &dXMin, double &dYMin,
double &dXMax, double &dYMax )
{
char **papszFields;
if( pszCoordSys == NULL )
return FALSE;
papszFields = CSLTokenizeStringComplex( pszCoordSys, " ,()", TRUE, FALSE );
int iBounds = CSLFindString( papszFields, "Bounds" );
if (iBounds >= 0 && iBounds + 4 < CSLCount(papszFields))
{
dXMin = atof(papszFields[++iBounds]);
dYMin = atof(papszFields[++iBounds]);
dXMax = atof(papszFields[++iBounds]);
dYMax = atof(papszFields[++iBounds]);
CSLDestroy( papszFields );
return TRUE;
}
CSLDestroy( papszFields );
return FALSE;
}
/**********************************************************************
* MITABCoordSys2TABProjInfo()
*
* Convert a MIF COORDSYS string into a TABProjInfo structure.
*
* Note that it would have been possible to achieve the same by calling
* TABFile::SetSpatialRef( MITABCoordSys2SpatialRef() ) but this would
* involve lots of manipulations for cases where only a simple conversion
* is required.
*
* Returns 0 on success, -1 on error.
**********************************************************************/
int MITABCoordSys2TABProjInfo(const char * pszCoordSys, TABProjInfo *psProj)
{
char **papszFields;
// Set all fields to zero, equivalent of NonEarth Units "mi"
memset(psProj, 0, sizeof(TABProjInfo));
if( pszCoordSys == NULL )
return -1;
/*-----------------------------------------------------------------
* Parse the passed string into words.
*----------------------------------------------------------------*/
while(*pszCoordSys == ' ') pszCoordSys++; // Eat leading spaces
if( EQUALN(pszCoordSys,"CoordSys",8) )
pszCoordSys += 9;
papszFields = CSLTokenizeStringComplex( pszCoordSys, " ,", TRUE, FALSE );
/*-----------------------------------------------------------------
* Clip off Bounds information.
*----------------------------------------------------------------*/
int iBounds = CSLFindString( papszFields, "Bounds" );
while( iBounds != -1 && papszFields[iBounds] != NULL )
{
CPLFree( papszFields[iBounds] );
papszFields[iBounds] = NULL;
iBounds++;
}
/*-----------------------------------------------------------------
* Fetch the projection.
*----------------------------------------------------------------*/
char **papszNextField;
if( CSLCount( papszFields ) >= 3
&& EQUAL(papszFields[0],"Earth")
&& EQUAL(papszFields[1],"Projection") )
{
psProj->nProjId = atoi(papszFields[2]);
papszNextField = papszFields + 3;
}
else if (CSLCount( papszFields ) >= 2
&& EQUAL(papszFields[0],"NonEarth") )
{
// NonEarth Units "..." Bounds (x, y) (x, y)
psProj->nProjId = 0;
papszNextField = papszFields + 2;
if( papszNextField[0] != NULL && EQUAL(papszNextField[0],"Units") )
papszNextField++;
}
else
{
// Invalid projection string ???
if (CSLCount(papszFields) > 0)
CPLError(CE_Warning, CPLE_IllegalArg,
"Failed parsing CoordSys: '%s'", pszCoordSys);
CSLDestroy(papszFields);
return -1;
}
/*-----------------------------------------------------------------
* Fetch the datum information.
*----------------------------------------------------------------*/
int nDatum = 0;
if( psProj->nProjId != 0 && CSLCount(papszNextField) > 0 )
{
nDatum = atoi(papszNextField[0]);
papszNextField++;
}
if( (nDatum == 999 || nDatum == 9999)
&& CSLCount(papszNextField) >= 4 )
{
psProj->nEllipsoidId = atoi(papszFields[0]);
psProj->dDatumShiftX = atof(papszNextField[1]);
psProj->dDatumShiftY = atof(papszNextField[2]);
psProj->dDatumShiftZ = atof(papszNextField[3]);
papszNextField += 4;
if( nDatum == 9999
&& CSLCount(papszNextField) >= 5 )
{
psProj->adDatumParams[0] = atof(papszNextField[0]);
psProj->adDatumParams[1] = atof(papszNextField[1]);
psProj->adDatumParams[2] = atof(papszNextField[2]);
psProj->adDatumParams[3] = atof(papszNextField[3]);
psProj->adDatumParams[4] = atof(papszNextField[4]);
papszNextField += 5;
}
}
else if (nDatum != 999 && nDatum != 9999)
{
/*-----------------------------------------------------------------
* Find the datum, and collect it's parameters if possible.
*----------------------------------------------------------------*/
int iDatum;
MapInfoDatumInfo *psDatumInfo = NULL;
for(iDatum=0; asDatumInfoList[iDatum].nMapInfoDatumID != -1; iDatum++)
{
if( asDatumInfoList[iDatum].nMapInfoDatumID == nDatum )
{
psDatumInfo = asDatumInfoList + iDatum;
break;
}
}
if( asDatumInfoList[iDatum].nMapInfoDatumID == -1
&& nDatum != 999 && nDatum != 9999 )
{
/* use WGS84 */
psDatumInfo = asDatumInfoList + 0;
}
if( psDatumInfo != NULL )
{
psProj->nEllipsoidId = psDatumInfo->nEllipsoid;
psProj->nDatumId = psDatumInfo->nMapInfoDatumID;
psProj->dDatumShiftX = psDatumInfo->dfShiftX;
psProj->dDatumShiftY = psDatumInfo->dfShiftY;
psProj->dDatumShiftZ = psDatumInfo->dfShiftZ;
psProj->adDatumParams[0] = psDatumInfo->dfDatumParm0;
psProj->adDatumParams[1] = psDatumInfo->dfDatumParm1;
psProj->adDatumParams[2] = psDatumInfo->dfDatumParm2;
psProj->adDatumParams[3] = psDatumInfo->dfDatumParm3;
psProj->adDatumParams[4] = psDatumInfo->dfDatumParm4;
}
}
/*-----------------------------------------------------------------
* Fetch the units string.
*----------------------------------------------------------------*/
if( CSLCount(papszNextField) > 0 )
{
psProj->nUnitsId = TABUnitIdFromString(papszNextField[0]);
papszNextField++;
}
/*-----------------------------------------------------------------
* Finally the projection parameters.
*----------------------------------------------------------------*/
for(int iParam=0; iParam < 6 && CSLCount(papszNextField) > 0; iParam++)
{
psProj->adProjParams[iParam] = atof(papszNextField[0]);
papszNextField++;
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -