OGR
ogr_spatialref.h
Go to the documentation of this file.
00001 /******************************************************************************
00002  * $Id: ogr_spatialref.h 22952 2011-08-19 21:08:31Z rouault $
00003  *
00004  * Project:  OpenGIS Simple Features Reference Implementation
00005  * Purpose:  Classes for manipulating spatial reference systems in a
00006  *           platform non-specific manner.
00007  * Author:   Frank Warmerdam, warmerdam@pobox.com
00008  *
00009  ******************************************************************************
00010  * Copyright (c) 1999,  Les Technologies SoftMap Inc.
00011  *
00012  * Permission is hereby granted, free of charge, to any person obtaining a
00013  * copy of this software and associated documentation files (the "Software"),
00014  * to deal in the Software without restriction, including without limitation
00015  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00016  * and/or sell copies of the Software, and to permit persons to whom the
00017  * Software is furnished to do so, subject to the following conditions:
00018  *
00019  * The above copyright notice and this permission notice shall be included
00020  * in all copies or substantial portions of the Software.
00021  *
00022  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00023  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00024  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
00025  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00026  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00027  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00028  * DEALINGS IN THE SOFTWARE.
00029  ****************************************************************************/
00030 
00031 #ifndef _OGR_SPATIALREF_H_INCLUDED
00032 #define _OGR_SPATIALREF_H_INCLUDED
00033 
00034 #include "ogr_srs_api.h"
00035 
00042 /************************************************************************/
00043 /*                             OGR_SRSNode                              */
00044 /************************************************************************/
00045 
00059 class CPL_DLL OGR_SRSNode
00060 {
00061     char        *pszValue;
00062 
00063     OGR_SRSNode **papoChildNodes;
00064     OGR_SRSNode *poParent;
00065 
00066     int         nChildren;
00067 
00068     int         NeedsQuoting() const;
00069     
00070   public:
00071                 OGR_SRSNode(const char * = NULL);
00072                 ~OGR_SRSNode();
00073 
00074     int         IsLeafNode() const { return nChildren == 0; }
00075     
00076     int         GetChildCount() const { return nChildren; }
00077     OGR_SRSNode *GetChild( int );
00078     const OGR_SRSNode *GetChild( int ) const;
00079 
00080     OGR_SRSNode *GetNode( const char * );
00081     const OGR_SRSNode *GetNode( const char * ) const;
00082 
00083     void        InsertChild( OGR_SRSNode *, int );
00084     void        AddChild( OGR_SRSNode * );
00085     int         FindChild( const char * ) const;
00086     void        DestroyChild( int );
00087     void        ClearChildren();
00088     void        StripNodes( const char * );
00089 
00090     const char  *GetValue() const { return pszValue; }
00091     void        SetValue( const char * );
00092 
00093     void        MakeValueSafe();
00094     OGRErr      FixupOrdering();
00095 
00096     OGR_SRSNode *Clone() const;
00097 
00098     OGRErr      importFromWkt( char ** );
00099     OGRErr      exportToWkt( char ** ) const;
00100     OGRErr      exportToPrettyWkt( char **, int = 1) const;
00101     
00102     OGRErr      applyRemapper( const char *pszNode, 
00103                                char **papszSrcValues, 
00104                                char **papszDstValues, 
00105                                int nStepSize = 1,
00106                                int bChildOfHit = FALSE );
00107 };
00108 
00109 /************************************************************************/
00110 /*                         OGRSpatialReference                          */
00111 /************************************************************************/
00112 
00127 class CPL_DLL OGRSpatialReference
00128 {
00129     double      dfFromGreenwich;
00130     double      dfToMeter;
00131     double      dfToDegrees;
00132 
00133     OGR_SRSNode *poRoot;
00134 
00135     int         nRefCount;
00136     int         bNormInfoSet;
00137 
00138     static OGRErr Validate(OGR_SRSNode *poRoot);
00139     static OGRErr ValidateAuthority(OGR_SRSNode *poRoot);
00140     static OGRErr ValidateAxis(OGR_SRSNode *poRoot);
00141     static OGRErr ValidateUnit(OGR_SRSNode *poRoot);
00142     static OGRErr ValidateVertDatum(OGR_SRSNode *poRoot);
00143     static OGRErr ValidateProjection( OGR_SRSNode* poRoot );
00144     static int  IsAliasFor( const char *, const char * );
00145     void        GetNormInfo() const;
00146 
00147     OGRErr      importFromURNPart(const char* pszAuthority,
00148                                   const char* pszCode,
00149                                   const char* pszURN);
00150   public:
00151                 OGRSpatialReference(const OGRSpatialReference&);
00152                 OGRSpatialReference(const char * = NULL);
00153                 
00154     virtual    ~OGRSpatialReference();
00155     
00156     static void DestroySpatialReference(OGRSpatialReference* poSRS);
00157                 
00158     OGRSpatialReference &operator=(const OGRSpatialReference&);
00159 
00160     int         Reference();
00161     int         Dereference();
00162     int         GetReferenceCount() const { return nRefCount; }
00163     void        Release();
00164 
00165     OGRSpatialReference *Clone() const;
00166     OGRSpatialReference *CloneGeogCS() const;
00167 
00168     OGRErr      exportToWkt( char ** ) const;
00169     OGRErr      exportToPrettyWkt( char **, int = FALSE) const;
00170     OGRErr      exportToProj4( char ** ) const;
00171     OGRErr      exportToPCI( char **, char **, double ** ) const;
00172     OGRErr      exportToUSGS( long *, long *, double **, long * ) const;
00173     OGRErr      exportToXML( char **, const char * = NULL ) const;
00174     OGRErr      exportToPanorama( long *, long *, long *, long *,
00175                                   double * ) const;
00176     OGRErr      exportToERM( char *pszProj, char *pszDatum, char *pszUnits );
00177     OGRErr      exportToMICoordSys( char ** ) const;
00178     
00179     OGRErr      importFromWkt( char ** );
00180     OGRErr      importFromProj4( const char * );
00181     OGRErr      importFromEPSG( int );
00182     OGRErr      importFromEPSGA( int );
00183     OGRErr      importFromESRI( char ** );
00184     OGRErr      importFromPCI( const char *, const char * = NULL,
00185                                double * = NULL );
00186     OGRErr      importFromUSGS( long iProjSys, long iZone,
00187                                 double *padfPrjParams,
00188                                 long iDatum, int bAnglesInPackedDMSFormat = TRUE );
00189     OGRErr      importFromPanorama( long, long, long, double* );
00190     OGRErr      importFromOzi( const char *, const char *, const char * );
00191     OGRErr      importFromWMSAUTO( const char *pszAutoDef );
00192     OGRErr      importFromXML( const char * );
00193     OGRErr      importFromDict( const char *pszDict, const char *pszCode );
00194     OGRErr      importFromURN( const char * );
00195     OGRErr      importFromERM( const char *pszProj, const char *pszDatum,
00196                                const char *pszUnits );
00197     OGRErr      importFromUrl( const char * );
00198     OGRErr      importFromMICoordSys( const char * );
00199     
00200     OGRErr      morphToESRI();
00201     OGRErr      morphFromESRI();
00202 
00203     OGRErr      Validate();
00204     OGRErr      StripCTParms( OGR_SRSNode * = NULL );
00205     OGRErr      StripVertical();
00206     OGRErr      FixupOrdering();
00207     OGRErr      Fixup();
00208 
00209     int         EPSGTreatsAsLatLong();
00210     const char *GetAxis( const char *pszTargetKey, int iAxis, 
00211                          OGRAxisOrientation *peOrientation ) const;
00212     OGRErr      SetAxes( const char *pszTargetKey, 
00213                          const char *pszXAxisName, 
00214                          OGRAxisOrientation eXAxisOrientation,
00215                          const char *pszYAxisName, 
00216                          OGRAxisOrientation eYAxisOrientation );
00217 
00218     // Machinary for accessing parse nodes
00219     OGR_SRSNode *GetRoot() { return poRoot; }
00220     const OGR_SRSNode *GetRoot() const { return poRoot; }
00221     void        SetRoot( OGR_SRSNode * );
00222     
00223     OGR_SRSNode *GetAttrNode(const char *);
00224     const OGR_SRSNode *GetAttrNode(const char *) const;
00225     const char  *GetAttrValue(const char *, int = 0) const;
00226 
00227     OGRErr      SetNode( const char *, const char * );
00228     OGRErr      SetNode( const char *, double );
00229 
00230     OGRErr      SetLinearUnitsAndUpdateParameters( const char *pszName, 
00231                                                    double dfInMeters );
00232     OGRErr      SetLinearUnits( const char *pszName, double dfInMeters );
00233     OGRErr      SetTargetLinearUnits( const char *pszTargetKey,
00234                                       const char *pszName, double dfInMeters );
00235     double      GetLinearUnits( char ** = NULL ) const;
00236     double      GetTargetLinearUnits( const char *pszTargetKey,
00237                                       char ** ppszRetName = NULL ) const;
00238 
00239     OGRErr      SetAngularUnits( const char *pszName, double dfInRadians );
00240     double      GetAngularUnits( char ** = NULL ) const;
00241 
00242     double      GetPrimeMeridian( char ** = NULL ) const;
00243 
00244     int         IsGeographic() const;
00245     int         IsProjected() const;
00246     int         IsGeocentric() const;
00247     int         IsLocal() const;
00248     int         IsVertical() const;
00249     int         IsCompound() const;
00250     int         IsSameGeogCS( const OGRSpatialReference * ) const;
00251     int         IsSameVertCS( const OGRSpatialReference * ) const;
00252     int         IsSame( const OGRSpatialReference * ) const;
00253 
00254     void        Clear();
00255     OGRErr      SetLocalCS( const char * );
00256     OGRErr      SetProjCS( const char * );
00257     OGRErr      SetProjection( const char * );
00258     OGRErr      SetGeocCS( const char * pszGeocName );
00259     OGRErr      SetGeogCS( const char * pszGeogName,
00260                            const char * pszDatumName,
00261                            const char * pszEllipsoidName,
00262                            double dfSemiMajor, double dfInvFlattening,
00263                            const char * pszPMName = NULL,
00264                            double dfPMOffset = 0.0,
00265                            const char * pszUnits = NULL,
00266                            double dfConvertToRadians = 0.0 );
00267     OGRErr      SetWellKnownGeogCS( const char * );
00268     OGRErr      CopyGeogCSFrom( const OGRSpatialReference * poSrcSRS );
00269     OGRErr      SetVertCS( const char *pszVertCSName,
00270                            const char *pszVertDatumName, 
00271                            int nVertDatumClass = 2005 );
00272     OGRErr      SetCompoundCS( const char *pszName, 
00273                                const OGRSpatialReference *poHorizSRS,
00274                                const OGRSpatialReference *poVertSRS );
00275 
00276     OGRErr      SetFromUserInput( const char * );
00277 
00278     OGRErr      SetTOWGS84( double, double, double,
00279                             double = 0.0, double = 0.0, double = 0.0,
00280                             double = 0.0 );
00281     OGRErr      GetTOWGS84( double *padfCoef, int nCoeff = 7 ) const;
00282     
00283     double      GetSemiMajor( OGRErr * = NULL ) const;
00284     double      GetSemiMinor( OGRErr * = NULL ) const;
00285     double      GetInvFlattening( OGRErr * = NULL ) const;
00286 
00287     OGRErr      SetAuthority( const char * pszTargetKey, 
00288                               const char * pszAuthority, 
00289                               int nCode );
00290 
00291     OGRErr      AutoIdentifyEPSG();
00292     int         GetEPSGGeogCS();
00293 
00294     const char *GetAuthorityCode( const char * pszTargetKey ) const;
00295     const char *GetAuthorityName( const char * pszTargetKey ) const;
00296 
00297     const char *GetExtension( const char *pszTargetKey, 
00298                               const char *pszName,
00299                               const char *pszDefault = NULL ) const;
00300     OGRErr      SetExtension( const char *pszTargetKey, 
00301                               const char *pszName, 
00302                               const char *pszValue );
00303     
00304     int         FindProjParm( const char *pszParameter,
00305                               const OGR_SRSNode *poPROJCS=NULL ) const;
00306     OGRErr      SetProjParm( const char *, double );
00307     double      GetProjParm( const char *, double =0.0, OGRErr* = NULL ) const;
00308 
00309     OGRErr      SetNormProjParm( const char *, double );
00310     double      GetNormProjParm( const char *, double=0.0, OGRErr* =NULL)const;
00311 
00312     static int  IsAngularParameter( const char * );
00313     static int  IsLongitudeParameter( const char * );
00314     static int  IsLinearParameter( const char * );
00315 
00317     OGRErr      SetACEA( double dfStdP1, double dfStdP2,
00318                          double dfCenterLat, double dfCenterLong,
00319                          double dfFalseEasting, double dfFalseNorthing );
00320     
00322     OGRErr      SetAE( double dfCenterLat, double dfCenterLong,
00323                        double dfFalseEasting, double dfFalseNorthing );
00324 
00326     OGRErr      SetBonne( double dfStdP1, double dfCentralMeridian,
00327                           double dfFalseEasting, double dfFalseNorthing );
00328     
00330     OGRErr      SetCEA( double dfStdP1, double dfCentralMeridian,
00331                         double dfFalseEasting, double dfFalseNorthing );
00332 
00334     OGRErr      SetCS( double dfCenterLat, double dfCenterLong,
00335                        double dfFalseEasting, double dfFalseNorthing );
00336 
00338     OGRErr      SetEC( double dfStdP1, double dfStdP2,
00339                        double dfCenterLat, double dfCenterLong,
00340                        double dfFalseEasting, double dfFalseNorthing );
00341 
00343     OGRErr      SetEckert( int nVariation, double dfCentralMeridian,
00344                            double dfFalseEasting, double dfFalseNorthing );
00345 
00346     OGRErr      SetEckertIV( double dfCentralMeridian,
00347                              double dfFalseEasting, double dfFalseNorthing );
00348 
00349     OGRErr      SetEckertVI( double dfCentralMeridian,
00350                              double dfFalseEasting, double dfFalseNorthing );
00351 
00353     OGRErr      SetEquirectangular(double dfCenterLat, double dfCenterLong,
00354                             double dfFalseEasting, double dfFalseNorthing );
00356     OGRErr      SetEquirectangular2( double dfCenterLat, double dfCenterLong,
00357                                      double dfPseudoStdParallel1,
00358                                      double dfFalseEasting, double dfFalseNorthing );
00359 
00361     OGRErr      SetGEOS( double dfCentralMeridian, double dfSatelliteHeight, 
00362                          double dfFalseEasting, double dfFalseNorthing );
00363 
00365     OGRErr      SetGH( double dfCentralMeridian, 
00366                        double dfFalseEasting, double dfFalseNorthing );
00367 
00369     OGRErr      SetIGH();
00370 
00372     OGRErr      SetGS( double dfCentralMeridian,
00373                        double dfFalseEasting, double dfFalseNorthing );
00374  
00376     OGRErr      SetGaussSchreiberTMercator(double dfCenterLat, double dfCenterLong,
00377                                            double dfScale,
00378                                            double dfFalseEasting, double dfFalseNorthing );
00379 
00381     OGRErr      SetGnomonic(double dfCenterLat, double dfCenterLong,
00382                             double dfFalseEasting, double dfFalseNorthing );
00383 
00385     OGRErr      SetHOM( double dfCenterLat, double dfCenterLong,
00386                         double dfAzimuth, double dfRectToSkew,
00387                         double dfScale,
00388                         double dfFalseEasting, double dfFalseNorthing );
00389 
00390     OGRErr      SetHOM2PNO( double dfCenterLat,
00391                             double dfLat1, double dfLong1,
00392                             double dfLat2, double dfLong2,
00393                             double dfScale,
00394                             double dfFalseEasting, double dfFalseNorthing );
00395 
00397     OGRErr      SetIWMPolyconic( double dfLat1, double dfLat2,
00398                                  double dfCenterLong,
00399                                  double dfFalseEasting,
00400                                  double dfFalseNorthing );
00401 
00403     OGRErr      SetKrovak( double dfCenterLat, double dfCenterLong,
00404                            double dfAzimuth, double dfPseudoStdParallelLat,
00405                            double dfScale, 
00406                            double dfFalseEasting, double dfFalseNorthing );
00407 
00409     OGRErr      SetLAEA( double dfCenterLat, double dfCenterLong,
00410                          double dfFalseEasting, double dfFalseNorthing );
00411 
00413     OGRErr      SetLCC( double dfStdP1, double dfStdP2,
00414                         double dfCenterLat, double dfCenterLong,
00415                         double dfFalseEasting, double dfFalseNorthing );
00416 
00418     OGRErr      SetLCC1SP( double dfCenterLat, double dfCenterLong,
00419                            double dfScale,
00420                            double dfFalseEasting, double dfFalseNorthing );
00421 
00423     OGRErr      SetLCCB( double dfStdP1, double dfStdP2,
00424                          double dfCenterLat, double dfCenterLong,
00425                          double dfFalseEasting, double dfFalseNorthing );
00426     
00428     OGRErr      SetMC( double dfCenterLat, double dfCenterLong,
00429                        double dfFalseEasting, double dfFalseNorthing );
00430 
00432     OGRErr      SetMercator( double dfCenterLat, double dfCenterLong,
00433                              double dfScale, 
00434                              double dfFalseEasting, double dfFalseNorthing );
00435 
00436     OGRErr      SetMercator2SP( double dfStdP1,
00437                                 double dfCenterLat, double dfCenterLong,
00438                                 double dfFalseEasting, double dfFalseNorthing );
00439 
00441     OGRErr      SetMollweide( double dfCentralMeridian,
00442                               double dfFalseEasting, double dfFalseNorthing );
00443 
00445     OGRErr      SetNZMG( double dfCenterLat, double dfCenterLong,
00446                          double dfFalseEasting, double dfFalseNorthing );
00447 
00449     OGRErr      SetOS( double dfOriginLat, double dfCMeridian,
00450                        double dfScale,
00451                        double dfFalseEasting,double dfFalseNorthing);
00452     
00454     OGRErr      SetOrthographic( double dfCenterLat, double dfCenterLong,
00455                                  double dfFalseEasting,double dfFalseNorthing);
00456 
00458     OGRErr      SetPolyconic( double dfCenterLat, double dfCenterLong,
00459                               double dfFalseEasting, double dfFalseNorthing );
00460 
00462     OGRErr      SetPS( double dfCenterLat, double dfCenterLong,
00463                        double dfScale,
00464                        double dfFalseEasting, double dfFalseNorthing);
00465     
00467     OGRErr      SetRobinson( double dfCenterLong, 
00468                              double dfFalseEasting, double dfFalseNorthing );
00469     
00471     OGRErr      SetSinusoidal( double dfCenterLong, 
00472                                double dfFalseEasting, double dfFalseNorthing );
00473     
00475     OGRErr      SetStereographic( double dfCenterLat, double dfCenterLong,
00476                                   double dfScale,
00477                                  double dfFalseEasting,double dfFalseNorthing);
00478 
00480     OGRErr      SetSOC( double dfLatitudeOfOrigin, double dfCentralMeridian,
00481                         double dfFalseEasting, double dfFalseNorthing );
00482     
00484     OGRErr      SetTM( double dfCenterLat, double dfCenterLong,
00485                        double dfScale,
00486                        double dfFalseEasting, double dfFalseNorthing );
00487 
00489     OGRErr      SetTMVariant( const char *pszVariantName, 
00490                               double dfCenterLat, double dfCenterLong,
00491                               double dfScale,
00492                               double dfFalseEasting, double dfFalseNorthing );
00493 
00495     OGRErr      SetTMG( double dfCenterLat, double dfCenterLong, 
00496                         double dfFalseEasting, double dfFalseNorthing );
00497 
00499     OGRErr      SetTMSO( double dfCenterLat, double dfCenterLong,
00500                          double dfScale,
00501                          double dfFalseEasting, double dfFalseNorthing );
00502 
00504     OGRErr      SetTPED( double dfLat1, double dfLong1, 
00505                          double dfLat2, double dfLong2, 
00506                          double dfFalseEasting, double dfFalseNorthing );
00507     
00509     OGRErr      SetVDG( double dfCenterLong,
00510                         double dfFalseEasting, double dfFalseNorthing );
00511 
00513     OGRErr      SetUTM( int nZone, int bNorth = TRUE );
00514     int         GetUTMZone( int *pbNorth = NULL ) const;
00515 
00517     OGRErr      SetWagner( int nVariation, double dfCenterLat,
00518                            double dfFalseEasting, double dfFalseNorthing );
00519 
00521     OGRErr      SetStatePlane( int nZone, int bNAD83 = TRUE,
00522                                const char *pszOverrideUnitName = NULL,
00523                                double dfOverrideUnit = 0.0 );
00524 
00525     OGRErr      ImportFromESRIStatePlaneWKT( 
00526         int nCode, const char* pszDatumName, const char* pszUnitsName, 
00527         int nPCSCode, const char* pszCSName = 0 );
00528     OGRErr      ImportFromESRIWisconsinWKT( 
00529         const char* pszPrjName, double dfCentralMeridian, double dfLatOfOrigin, 
00530         const char* pszUnitsName, const char* pszCSName = 0 );
00531 };
00532 
00533 /************************************************************************/
00534 /*                     OGRCoordinateTransformation                      */
00535 /*                                                                      */
00536 /*      This is really just used as a base class for a private          */
00537 /*      implementation.                                                 */
00538 /************************************************************************/
00539 
00549 class CPL_DLL OGRCoordinateTransformation
00550 {
00551 public:
00552     virtual ~OGRCoordinateTransformation() {}
00553     
00554     static void DestroyCT(OGRCoordinateTransformation* poCT);
00555 
00556     // From CT_CoordinateTransformation
00557 
00559     virtual OGRSpatialReference *GetSourceCS() = 0;
00560 
00562     virtual OGRSpatialReference *GetTargetCS() = 0;
00563 
00564     // From CT_MathTransform
00565 
00581     virtual int Transform( int nCount, 
00582                            double *x, double *y, double *z = NULL ) = 0;
00583 
00599     virtual int TransformEx( int nCount, 
00600                              double *x, double *y, double *z = NULL,
00601                              int *pabSuccess = NULL ) = 0;
00602 
00603 };
00604 
00605 OGRCoordinateTransformation CPL_DLL *
00606 OGRCreateCoordinateTransformation( OGRSpatialReference *poSource, 
00607                                    OGRSpatialReference *poTarget );
00608 
00609 #endif /* ndef _OGR_SPATIALREF_H_INCLUDED */

Generated for GDAL by doxygen 1.8.0.