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

📄 ogrct.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * $Id: ogrct.cpp,v 1.21 2003/06/27 19:02:50 warmerda Exp $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  The OGRSCoordinateTransformation class. * Author:   Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * 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: ogrct.cpp,v $ * Revision 1.21  2003/06/27 19:02:50  warmerda * changed to use pj_init_plus instead of CSLTokenizeString * * Revision 1.20  2003/01/21 22:04:34  warmerda * don't report errors for pj_get_def or pj_dalloc missing * * Revision 1.19  2002/12/09 17:24:33  warmerda * fixed PROJ_STATIC settings for pj_strerrno * * Revision 1.18  2002/12/09 16:49:55  warmerda * implemented support for alternate GEOGCS units * * Revision 1.17  2002/11/27 14:48:22  warmerda * added PROJSO environment variable * * Revision 1.16  2002/11/19 20:47:04  warmerda * fixed to call pj_free, not pj_dalloc for projPJ * * Revision 1.15  2002/06/11 18:02:03  warmerda * add PROJ.4 normalization and EPSG support * * Revision 1.14  2002/03/05 14:25:14  warmerda * expand tabs * * Revision 1.13  2002/01/18 04:49:17  warmerda * report CPL errors if transform() fails * * Revision 1.12  2001/12/11 17:37:24  warmerda * improved PROJ.4 error reporting. * * Revision 1.11  2001/11/18 00:57:53  warmerda * change printf to CPLDebug * * Revision 1.10  2001/11/07 22:14:17  warmerda * add a way of statically linking in PROJ.4 * * Revision 1.9  2001/07/18 05:03:05  warmerda * added CPL_CVSID * * Revision 1.8  2001/05/24 21:02:42  warmerda * moved OGRCoordinateTransform destructor defn * * Revision 1.7  2001/01/19 21:10:47  warmerda * replaced tabs * * Revision 1.6  2000/07/12 18:19:09  warmerda * Removed debug statements. * * Revision 1.5  2000/07/09 20:48:28  warmerda * rewrote to use PROJ.4 datum shifting * * Revision 1.4  2000/03/24 14:49:31  warmerda * fetch TOWGS84 coefficients * * Revision 1.3  2000/03/20 23:08:18  warmerda * Added docs. * * Revision 1.2  2000/03/20 22:40:23  warmerda * Added C API. * * Revision 1.1  2000/03/20 15:00:11  warmerda * New * */#include "ogr_spatialref.h"#include "cpl_error.h"#include "cpl_conv.h"#include "cpl_string.h"#ifdef PROJ_STATIC#include "proj_api.h"#endifCPL_CVSID("$Id: ogrct.cpp,v 1.21 2003/06/27 19:02:50 warmerda Exp $");/* ==================================================================== *//*      PROJ.4 interface stuff.                                         *//* ==================================================================== */#ifndef PROJ_STATICtypedef struct { double u, v; } projUV;#define projPJ void *#define RAD_TO_DEG      57.29577951308232#define DEG_TO_RAD      .0174532925199432958#endifstatic projPJ       (*pfn_pj_init_plus)(const char *) = NULL;static projPJ       (*pfn_pj_init)(int, char**) = NULL;static projUV       (*pfn_pj_fwd)(projUV, projPJ) = NULL;static projUV       (*pfn_pj_inv)(projUV, projPJ) = NULL;static void     (*pfn_pj_free)(projPJ) = NULL;static int      (*pfn_pj_transform)(projPJ, projPJ, long, int,                                     double *, double *, double * ) = NULL;static int         *(*pfn_pj_get_errno_ref)(void) = NULL;static char        *(*pfn_pj_strerrno)(int) = NULL;static char        *(*pfn_pj_get_def)(projPJ,int) = NULL;static void         (*pfn_pj_dalloc)(void *) = NULL;#ifdef WIN32#  define LIBNAME      "proj.dll"#else#  define LIBNAME      "libproj.so"#endif/************************************************************************//*                              OGRProj4CT                              *//************************************************************************/class OGRProj4CT : public OGRCoordinateTransformation{    OGRSpatialReference *poSRSSource;    void        *psPJSource;    int         bSourceLatLong;    double      dfSourceToRadians;    double      dfSourceFromRadians;        OGRSpatialReference *poSRSTarget;    void        *psPJTarget;    int         bTargetLatLong;    double      dfTargetToRadians;    double      dfTargetFromRadians;    int         nErrorCount;public:                OGRProj4CT();    virtual     ~OGRProj4CT();    int         Initialize( OGRSpatialReference *poSource,                             OGRSpatialReference *poTarget );    virtual OGRSpatialReference *GetSourceCS();    virtual OGRSpatialReference *GetTargetCS();    virtual int Transform( int nCount,                            double *x, double *y, double *z = NULL );};/************************************************************************//*                          LoadProjLibrary()                           *//************************************************************************/static int LoadProjLibrary(){    static int  bTriedToLoad = FALSE;    const char *pszLibName = LIBNAME;        if( bTriedToLoad )        return( pfn_pj_init != NULL );    bTriedToLoad = TRUE;    if( getenv("PROJSO") != NULL )        pszLibName = getenv("PROJSO");#ifdef PROJ_STATIC    pfn_pj_init = pj_init;    pfn_pj_init_plus = pj_init_plus;    pfn_pj_fwd = pj_fwd;    pfn_pj_inv = pj_inv;    pfn_pj_free = pj_free;    pfn_pj_transform = pj_transform;    pfn_pj_get_errno_ref = pj_get_errno_ref;    pfn_pj_strerrno = pj_strerrno;    pfn_pj_dalloc = pj_dalloc;#ifdef PJ_VERSION >= 446    pfn_pj_get_def = pj_get_def;#endif    #else    CPLPushErrorHandler( CPLQuietErrorHandler );    pfn_pj_init = (projPJ (*)(int, char**)) CPLGetSymbol( pszLibName,                                                       "pj_init" );    CPLPopErrorHandler();        if( pfn_pj_init == NULL )       return( FALSE );    pfn_pj_init_plus = (projPJ (*)(const char *))         CPLGetSymbol( pszLibName, "pj_init_plus" );    pfn_pj_fwd = (projUV (*)(projUV,projPJ))         CPLGetSymbol( pszLibName, "pj_fwd" );    pfn_pj_inv = (projUV (*)(projUV,projPJ))         CPLGetSymbol( pszLibName, "pj_inv" );    pfn_pj_free = (void (*)(projPJ))         CPLGetSymbol( pszLibName, "pj_free" );    pfn_pj_transform = (int (*)(projPJ,projPJ,long,int,double*,                                double*,double*))                        CPLGetSymbol( pszLibName, "pj_transform" );    pfn_pj_get_errno_ref = (int *(*)(void))        CPLGetSymbol( pszLibName, "pj_get_errno_ref" );    pfn_pj_strerrno = (char *(*)(int))        CPLGetSymbol( pszLibName, "pj_strerrno" );    CPLPushErrorHandler( CPLQuietErrorHandler );    pfn_pj_get_def = (char *(*)(projPJ,int))        CPLGetSymbol( pszLibName, "pj_get_def" );    pfn_pj_dalloc = (void (*)(void*))        CPLGetSymbol( pszLibName, "pj_dalloc" );    CPLPopErrorHandler();#endif    if( pfn_pj_transform == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Attempt to load %s, but couldn't find pj_transform.\n"                  "Please upgrade to PROJ 4.1.2 or later.",                   pszLibName );        return FALSE;    }    return( TRUE );}/************************************************************************//*                         OCTProj4Normalize()                          *//*                                                                      *//*      This function is really just here since we already have all     *//*      the code to load libproj.so.  It is intended to "normalize"     *//*      a proj.4 definition, expanding +init= definitions and so        *//*      forth as possible.                                              *//************************************************************************/char *OCTProj4Normalize( const char *pszProj4Src ){    char        *pszNewProj4Def, *pszCopy;    projPJ      psPJSource = NULL;    if( !LoadProjLibrary() || pfn_pj_dalloc == NULL || pfn_pj_get_def == NULL )        return CPLStrdup( pszProj4Src );    psPJSource = pfn_pj_init_plus( pszProj4Src );    if( psPJSource == NULL )        return CPLStrdup( pszProj4Src );    pszNewProj4Def = pfn_pj_get_def( psPJSource, 0 );    pfn_pj_free( psPJSource );    if( pszNewProj4Def == NULL )        return CPLStrdup( pszProj4Src );    pszCopy = CPLStrdup( pszNewProj4Def );    pfn_pj_dalloc( pszNewProj4Def );    return pszCopy;}/************************************************************************//*                 OCTDestroyCoordinateTransformation()                 *//************************************************************************/void OCTDestroyCoordinateTransformation( OGRCoordinateTransformationH hCT ){    delete (OGRCoordinateTransformation *) hCT;}/************************************************************************//*                 OGRCreateCoordinateTransformation()                  *//************************************************************************/

⌨️ 快捷键说明

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