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

📄 ogr_srs_proj4.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/****************************************************************************** * $Id: ogr_srs_proj4.cpp,v 1.44 2003/06/27 19:02:04 warmerda Exp $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  OGRSpatialReference interface to PROJ.4. * Author:   Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999,  Les Technologies SoftMap Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: ogr_srs_proj4.cpp,v $ * Revision 1.44  2003/06/27 19:02:04  warmerda * added OSRProj4Tokenize(), fixes plus related tokenizing bug in bug 355 * * Revision 1.43  2003/06/27 17:54:12  warmerda * allow k_0 in place of k parsing proj4, bug 355 * * Revision 1.42  2003/06/21 23:25:03  warmerda * added +towgs84 support in importFromProj4() * * Revision 1.41  2003/05/28 18:17:38  warmerda * treat meter or m as meter * * Revision 1.40  2003/05/20 18:09:36  warmerda * fixed so that importFromProj4() will transform linear parameter units * * Revision 1.39  2003/02/13 19:27:28  warmerda * always append no_defs to avoid getting hosted by defaults file * * Revision 1.38  2002/12/15 23:42:59  warmerda * added initial support for normalizing proj params * * Revision 1.37  2002/12/14 19:50:21  warmerda * implement support for NZMG (New Zealand Map Grid) * * Revision 1.36  2002/12/10 04:05:04  warmerda * fixed some translation problems with prime meridians * * Revision 1.35  2002/12/09 23:03:45  warmerda * Fixed translation of paris prime meridian. * * Revision 1.34  2002/12/09 18:55:07  warmerda * moved DMS stuff to gdal/port * * Revision 1.33  2002/12/09 16:12:14  warmerda * added +pm= support * * Revision 1.32  2002/12/03 15:38:10  warmerda * dont write linear units to geograpic srs but avoid freaking out * * Revision 1.31  2002/12/01 20:19:21  warmerda * use %.16g to preserve precision as per bug 184 * * Revision 1.30  2002/11/29 21:23:38  warmerda * implement LCC1SP PROJ.4 to WKT translation * * Revision 1.29  2002/11/29 20:56:37  warmerda * added LCC1SP conversion to PROJ.4, missing reverse * * Revision 1.28  2002/11/25 03:28:16  warmerda * added/improved documentation * * Revision 1.27  2002/07/09 14:49:07  warmerda * Improved translation from/to polar stereographic as per * http://bugzilla.remotesensing.org/show_bug.cgi?id=172 * * Revision 1.26  2002/06/11 18:02:03  warmerda * add PROJ.4 normalization and EPSG support * * Revision 1.25  2002/04/18 14:22:45  warmerda * made OGRSpatialReference and co 'const correct' * * Revision 1.24  2002/03/08 20:17:52  warmerda * assume WGS84 if ellipse info missing * * Revision 1.23  2002/01/18 04:48:48  warmerda * clean tabs, and newlines from input to importProj4 * * Revision 1.22  2001/12/12 20:18:06  warmerda * added support for units in proj.4 to WKT * * Revision 1.21  2001/11/07 22:08:51  warmerda * dont put + in to_meter value * * Revision 1.20  2001/11/02 22:21:15  warmerda * fixed memory leak * * Revision 1.19  2001/10/11 19:23:30  warmerda * fixed datum names * * Revision 1.18  2001/07/18 05:03:05  warmerda * added CPL_CVSID * * Revision 1.17  2001/03/02 04:37:43  danmo * Return empty string for LOCAL_CS in exportToProj4(). * * Revision 1.16  2001/01/22 14:00:28  warmerda * added untested support for Swiss Oblique Cylindrical * * Revision 1.15  2001/01/19 21:10:46  warmerda * replaced tabs * * Revision 1.14  2000/12/05 23:10:34  warmerda * Added cassini support * * Revision 1.13  2000/12/05 17:46:16  warmerda * Use +R_A for VanDerGrinten and miller * * Revision 1.12  2000/09/25 20:22:21  warmerda * ensure pszPROJ4Units is initialized * * Revision 1.11  2000/09/25 15:46:56  warmerda * added sphere * * Revision 1.10  2000/08/28 20:13:23  warmerda * added importFromProj4 * * Revision 1.9  2000/07/11 01:02:06  warmerda * added ExportToProj4() * * Revision 1.8  2000/07/09 20:49:21  warmerda * added +datum support * * Revision 1.7  2000/03/06 02:23:54  warmerda * don't use +datum syntax * * Revision 1.6  1999/12/22 15:39:43  warmerda * fix to differentiate WGS variants * * Revision 1.5  1999/12/13 16:29:59  warmerda * Added improved units, and ellipse support. * * Revision 1.4  1999/12/08 16:34:05  warmerda * added five or six more projections * * Revision 1.1  1999/07/29 17:29:15  warmerda * New * */#include "ogr_spatialref.h"#include "ogr_p.h"#include "cpl_conv.h"CPL_CVSID("$Id: ogr_srs_proj4.cpp,v 1.44 2003/06/27 19:02:04 warmerda Exp $");/* -------------------------------------------------------------------- *//*      The following list comes from osrs/proj/src/pj_ellps.c          *//*      ... please update from time to time.                            *//* -------------------------------------------------------------------- */static const char *ogr_pj_ellps[] = {"MERIT",        "a=6378137.0", "rf=298.257", "MERIT 1983","SGS85",        "a=6378136.0", "rf=298.257",  "Soviet Geodetic System 85","GRS80",        "a=6378137.0", "rf=298.257222101", "GRS 1980(IUGG, 1980)","IAU76",        "a=6378140.0", "rf=298.257", "IAU 1976","airy",         "a=6377563.396", "b=6356256.910", "Airy 1830","APL4.9",       "a=6378137.0.",  "rf=298.25", "Appl. Physics. 1965","NWL9D",        "a=6378145.0.",  "rf=298.25", "Naval Weapons Lab., 1965","mod_airy",     "a=6377340.189", "b=6356034.446", "Modified Airy","andrae",       "a=6377104.43",  "rf=300.0",    "Andrae 1876 (Den., Iclnd.)","aust_SA",      "a=6378160.0", "rf=298.25", "Australian Natl & S. Amer. 1969","GRS67",        "a=6378160.0", "rf=298.2471674270", "GRS 67(IUGG 1967)","bessel",       "a=6377397.155", "rf=299.1528128", "Bessel 1841","bess_nam",     "a=6377483.865", "rf=299.1528128", "Bessel 1841 (Namibia)","clrk66",       "a=6378206.4", "b=6356583.8", "Clarke 1866","clrk80",       "a=6378249.145", "rf=293.4663", "Clarke 1880 mod.","CPM",          "a=6375738.7", "rf=334.29", "Comm. des Poids et Mesures 1799","delmbr",       "a=6376428.",  "rf=311.5", "Delambre 1810 (Belgium)","engelis",      "a=6378136.05", "rf=298.2566", "Engelis 1985","evrst30",  "a=6377276.345", "rf=300.8017",  "Everest 1830","evrst48",  "a=6377304.063", "rf=300.8017",  "Everest 1948","evrst56",  "a=6377301.243", "rf=300.8017",  "Everest 1956","evrst69",  "a=6377295.664", "rf=300.8017",  "Everest 1969","evrstSS",  "a=6377298.556", "rf=300.8017",  "Everest (Sabah & Sarawak)","fschr60",  "a=6378166.",   "rf=298.3", "Fischer (Mercury Datum) 1960","fschr60m", "a=6378155.",   "rf=298.3", "Modified Fischer 1960","fschr68",  "a=6378150.",   "rf=298.3", "Fischer 1968","helmert",  "a=6378200.",   "rf=298.3", "Helmert 1906","hough",        "a=6378270.0", "rf=297.", "Hough","intl",         "a=6378388.0", "rf=297.", "International 1909 (Hayford)","krass",        "a=6378245.0", "rf=298.3", "Krassovsky, 1942","kaula",        "a=6378163.",  "rf=298.24", "Kaula 1961","lerch",        "a=6378139.",  "rf=298.257", "Lerch 1979","mprts",        "a=6397300.",  "rf=191.", "Maupertius 1738","new_intl",     "a=6378157.5", "b=6356772.2", "New International 1967","plessis",      "a=6376523.",  "b=6355863.", "Plessis 1817 (France)","SEasia",       "a=6378155.0", "b=6356773.3205", "Southeast Asia","walbeck",      "a=6376896.0", "b=6355834.8467", "Walbeck","WGS60",    "a=6378165.0",  "rf=298.3", "WGS 60","WGS66",        "a=6378145.0", "rf=298.25", "WGS 66","WGS72",        "a=6378135.0", "rf=298.26", "WGS 72","WGS84",    "a=6378137.0",  "rf=298.257223563", "WGS 84","sphere",   "a=6370997.0",  "b=6370997.0", "Normal Sphere (r=6370997)",0, 0, 0, 0,};/************************************************************************//*                          OSRProj4Tokenize()                          *//*                                                                      *//*      Custom tokenizing function for PROJ.4 strings.  The main        *//*      reason we can't just use CSLTokenizeString is to handle         *//*      strings with a + sign in the exponents of parameter values.     *//************************************************************************/char **OSRProj4Tokenize( const char *pszFull ){    char *pszStart = NULL;    char *pszFullWrk;    char **papszTokens = NULL;    int  i;    if( pszFull == NULL )        return NULL;    pszFullWrk = CPLStrdup( pszFull );    for( i=0; pszFullWrk[i] != '\0'; i++ )    {        switch( pszFullWrk[i] )        {          case '+':            if( i == 0 || pszFullWrk[i-1] == '\0' )            {                if( pszStart != NULL )                    papszTokens = CSLAddString( papszTokens, pszStart );                pszStart = pszFullWrk + i + 1;            }            break;          case ' ':          case '\t':          case '\n':            pszFullWrk[i] = '\0';            break;          default:            break;        }    }    if( pszStart != NULL && strlen(pszStart) > 0 )        papszTokens = CSLAddString( papszTokens, pszStart );    CPLFree( pszFullWrk );    return papszTokens;}/************************************************************************//*                         OSRImportFromProj4()                         *//************************************************************************/OGRErr OSRImportFromProj4( OGRSpatialReferenceH hSRS, const char *pszProj4 ){    return ((OGRSpatialReference *) hSRS)->importFromProj4( pszProj4 );}/************************************************************************//*                              OSR_GDV()                               *//*                                                                      *//*      Fetch a particular parameter out of the parameter list, or      *//*      the indicated default if it isn't available.  This is a         *//*      helper function for importFromProj4().                          *//************************************************************************/static double OSR_GDV( char **papszNV, const char * pszField,                        double dfDefaultValue ){    const char * pszValue;    pszValue = CSLFetchNameValue( papszNV, pszField );    // special hack to use k_0 if available.    if( pszValue == NULL && EQUAL(pszField,"k") )        pszValue = CSLFetchNameValue( papszNV, "k_0" );    if( pszValue == NULL )        return dfDefaultValue;    else        return CPLDMSToDec(pszValue);}/************************************************************************//*                          importFromProj4()                           *//************************************************************************//** * Import PROJ.4 coordinate string. * * The OGRSpatialReference is initialized from the passed PROJ.4 style * coordinate system string.  In addition to many +proj formulations which * have OGC equivelents, it is also possible to import "+init=epsg:n" style * definitions.  These are passed to importFromEPSG().  Other init strings * (such as the state plane zones) are not currently supported.    * * Example: *   pszProj4 = "+proj=utm +zone=11 +datum=WGS84"  * * This method is the equivelent of the C function OSRImportFromProj4(). * * @param pszProj4 the PROJ.4 style string.  * * @return OGRERR_NONE on success or OGRERR_CORRUPT_DATA on failure. */OGRErr OGRSpatialReference::importFromProj4( const char * pszProj4 ){    char **papszNV = NULL;    char **papszTokens;    int  i;    char *pszCleanCopy;/* -------------------------------------------------------------------- *//*      Strip any newlines or other "funny" stuff that might occur      *//*      if this string just came from reading a file.                   *//* -------------------------------------------------------------------- */    pszCleanCopy = CPLStrdup( pszProj4 );    for( i = 0; pszCleanCopy[i] != '\0'; i++ )    {        if( pszCleanCopy[i] == 10             || pszCleanCopy[i] == 13             || pszCleanCopy[i] == 9 )            pszCleanCopy[i] = ' ';    }/* -------------------------------------------------------------------- *//*      Try to normalize the definition.  This should expand +init=     *//*      clauses and so forth.                                           *//* -------------------------------------------------------------------- */    char *pszNormalized;    pszNormalized = OCTProj4Normalize( pszCleanCopy );    CPLFree( pszCleanCopy );    /* -------------------------------------------------------------------- *//*      If we have an EPSG based init string, try to process it         *//*      directly to get the fullest possible EPSG definition.           *//* -------------------------------------------------------------------- */    if( strstr(pszNormalized,"init=epsg:") != NULL )    {        OGRErr eErr;        const char *pszNumber = strstr(pszNormalized,"init=epsg:") + 10;        eErr = importFromEPSG( atoi(pszNumber) );        if( eErr == OGRERR_NONE )        {            CPLFree( pszNormalized );            return eErr;        }    }/* -------------------------------------------------------------------- *//*      Parse the PROJ.4 string into a cpl_string.h style name/value    *//*      list.                                                           *//* -------------------------------------------------------------------- */    papszTokens = OSRProj4Tokenize( pszNormalized );    CPLFree( pszNormalized );        for( i = 0; papszTokens != NULL && papszTokens[i] != NULL; i++ )    {        char *pszEqual = strstr(papszTokens[i],"=");        if( pszEqual == NULL )            papszNV = CSLAddNameValue(papszNV, papszTokens[i], "" );        else        {            pszEqual[0] = '\0';            papszNV = CSLAddNameValue( papszNV, papszTokens[i], pszEqual+1 );        }    }    CSLDestroy( papszTokens );/* -------------------------------------------------------------------- *//*      Operate on the basis of the projection name.                    *//* -------------------------------------------------------------------- */    const char *pszProj = CSLFetchNameValue(papszNV,"proj");    if( pszProj == NULL )    {        CPLDebug( "OGR_PROJ4", "Can't find +proj= in:\n%s", pszProj4 );        CSLDestroy( papszNV );        return OGRERR_CORRUPT_DATA;    }    else if( EQUAL(pszProj,"longlat") || EQUAL(pszProj,"latlong") )    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -