⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mitab_coordsys.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/* -------------------------------------------------------------------- */    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 + -