📄 ogrct.cpp
字号:
/****************************************************************************** * $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 + -