00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _OGR_SPATIALREF_H_INCLUDED
00032 #define _OGR_SPATIALREF_H_INCLUDED
00033
00034 #include "ogr_srs_api.h"
00035
00042
00043
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 void ClearChildren();
00069 int NeedsQuoting() const;
00070
00071 public:
00072 OGR_SRSNode(const char * = NULL);
00073 ~OGR_SRSNode();
00074
00075 int IsLeafNode() const { return nChildren == 0; }
00076
00077 int GetChildCount() const { return nChildren; }
00078 OGR_SRSNode *GetChild( int );
00079 const OGR_SRSNode *GetChild( int ) const;
00080
00081 OGR_SRSNode *GetNode( const char * );
00082 const OGR_SRSNode *GetNode( const char * ) const;
00083
00084 void InsertChild( OGR_SRSNode *, int );
00085 void AddChild( OGR_SRSNode * );
00086 int FindChild( const char * ) const;
00087 void DestroyChild( int );
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
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 public:
00148 OGRSpatialReference(const OGRSpatialReference&);
00149 OGRSpatialReference(const char * = NULL);
00150
00151 virtual ~OGRSpatialReference();
00152
00153 static void DestroySpatialReference(OGRSpatialReference* poSRS);
00154
00155 OGRSpatialReference &operator=(const OGRSpatialReference&);
00156
00157 int Reference();
00158 int Dereference();
00159 int GetReferenceCount() const { return nRefCount; }
00160 void Release();
00161
00162 OGRSpatialReference *Clone() const;
00163 OGRSpatialReference *CloneGeogCS() const;
00164
00165 OGRErr exportToWkt( char ** ) const;
00166 OGRErr exportToPrettyWkt( char **, int = FALSE) const;
00167 OGRErr exportToProj4( char ** ) const;
00168 OGRErr exportToPCI( char **, char **, double ** ) const;
00169 OGRErr exportToUSGS( long *, long *, double **, long * ) const;
00170 OGRErr exportToXML( char **, const char * = NULL ) const;
00171 OGRErr exportToPanorama( long *, long *, long *, long *,
00172 double * ) const;
00173 OGRErr exportToERM( char *pszProj, char *pszDatum, char *pszUnits );
00174 OGRErr exportToMICoordSys( char ** ) const;
00175
00176 OGRErr importFromWkt( char ** );
00177 OGRErr importFromProj4( const char * );
00178 OGRErr importFromEPSG( int );
00179 OGRErr importFromEPSGA( int );
00180 OGRErr importFromESRI( char ** );
00181 OGRErr importFromPCI( const char *, const char * = NULL,
00182 double * = NULL );
00183 OGRErr importFromUSGS( long iProjSys, long iZone,
00184 double *padfPrjParams,
00185 long iDatum, int bAnglesInPackedDMSFormat = TRUE );
00186 OGRErr importFromPanorama( long, long, long, double* );
00187 OGRErr importFromOzi( const char *, const char *, const char * );
00188 OGRErr importFromWMSAUTO( const char *pszAutoDef );
00189 OGRErr importFromXML( const char * );
00190 OGRErr importFromDict( const char *pszDict, const char *pszCode );
00191 OGRErr importFromURN( const char * );
00192 OGRErr importFromERM( const char *pszProj, const char *pszDatum,
00193 const char *pszUnits );
00194 OGRErr importFromUrl( const char * );
00195 OGRErr importFromMICoordSys( const char * );
00196
00197 OGRErr morphToESRI();
00198 OGRErr morphFromESRI();
00199
00200 OGRErr Validate();
00201 OGRErr StripCTParms( OGR_SRSNode * = NULL );
00202 OGRErr StripVertical();
00203 OGRErr FixupOrdering();
00204 OGRErr Fixup();
00205
00206 int EPSGTreatsAsLatLong();
00207 const char *GetAxis( const char *pszTargetKey, int iAxis,
00208 OGRAxisOrientation *peOrientation ) const;
00209 OGRErr SetAxes( const char *pszTargetKey,
00210 const char *pszXAxisName,
00211 OGRAxisOrientation eXAxisOrientation,
00212 const char *pszYAxisName,
00213 OGRAxisOrientation eYAxisOrientation );
00214
00215
00216 OGR_SRSNode *GetRoot() { return poRoot; }
00217 const OGR_SRSNode *GetRoot() const { return poRoot; }
00218 void SetRoot( OGR_SRSNode * );
00219
00220 OGR_SRSNode *GetAttrNode(const char *);
00221 const OGR_SRSNode *GetAttrNode(const char *) const;
00222 const char *GetAttrValue(const char *, int = 0) const;
00223
00224 OGRErr SetNode( const char *, const char * );
00225 OGRErr SetNode( const char *, double );
00226
00227 OGRErr SetLinearUnitsAndUpdateParameters( const char *pszName,
00228 double dfInMeters );
00229 OGRErr SetLinearUnits( const char *pszName, double dfInMeters );
00230 double GetLinearUnits( char ** = NULL ) const;
00231
00232 OGRErr SetAngularUnits( const char *pszName, double dfInRadians );
00233 double GetAngularUnits( char ** = NULL ) const;
00234
00235 double GetPrimeMeridian( char ** = NULL ) const;
00236
00237 int IsGeographic() const;
00238 int IsProjected() const;
00239 int IsLocal() const;
00240 int IsVertical() const;
00241 int IsSameGeogCS( const OGRSpatialReference * ) const;
00242 int IsSameVertCS( const OGRSpatialReference * ) const;
00243 int IsSame( const OGRSpatialReference * ) const;
00244
00245 void Clear();
00246 OGRErr SetLocalCS( const char * );
00247 OGRErr SetProjCS( const char * );
00248 OGRErr SetProjection( const char * );
00249 OGRErr SetGeogCS( const char * pszGeogName,
00250 const char * pszDatumName,
00251 const char * pszEllipsoidName,
00252 double dfSemiMajor, double dfInvFlattening,
00253 const char * pszPMName = NULL,
00254 double dfPMOffset = 0.0,
00255 const char * pszUnits = NULL,
00256 double dfConvertToRadians = 0.0 );
00257 OGRErr SetWellKnownGeogCS( const char * );
00258 OGRErr CopyGeogCSFrom( const OGRSpatialReference * poSrcSRS );
00259
00260 OGRErr SetFromUserInput( const char * );
00261
00262 OGRErr SetTOWGS84( double, double, double,
00263 double = 0.0, double = 0.0, double = 0.0,
00264 double = 0.0 );
00265 OGRErr GetTOWGS84( double *padfCoef, int nCoeff = 7 ) const;
00266
00267 double GetSemiMajor( OGRErr * = NULL ) const;
00268 double GetSemiMinor( OGRErr * = NULL ) const;
00269 double GetInvFlattening( OGRErr * = NULL ) const;
00270
00271 OGRErr SetAuthority( const char * pszTargetKey,
00272 const char * pszAuthority,
00273 int nCode );
00274
00275 OGRErr AutoIdentifyEPSG();
00276 int GetEPSGGeogCS();
00277
00278 const char *GetAuthorityCode( const char * pszTargetKey ) const;
00279 const char *GetAuthorityName( const char * pszTargetKey ) const;
00280
00281 const char *GetExtension( const char *pszTargetKey,
00282 const char *pszName,
00283 const char *pszDefault = NULL ) const;
00284 OGRErr SetExtension( const char *pszTargetKey,
00285 const char *pszName,
00286 const char *pszValue );
00287
00288 int FindProjParm( const char *pszParameter,
00289 const OGR_SRSNode *poPROJCS=NULL ) const;
00290 OGRErr SetProjParm( const char *, double );
00291 double GetProjParm( const char *, double =0.0, OGRErr* = NULL ) const;
00292
00293 OGRErr SetNormProjParm( const char *, double );
00294 double GetNormProjParm( const char *, double=0.0, OGRErr* =NULL)const;
00295
00296 static int IsAngularParameter( const char * );
00297 static int IsLongitudeParameter( const char * );
00298 static int IsLinearParameter( const char * );
00299
00301 OGRErr SetACEA( double dfStdP1, double dfStdP2,
00302 double dfCenterLat, double dfCenterLong,
00303 double dfFalseEasting, double dfFalseNorthing );
00304
00306 OGRErr SetAE( double dfCenterLat, double dfCenterLong,
00307 double dfFalseEasting, double dfFalseNorthing );
00308
00310 OGRErr SetBonne( double dfStdP1, double dfCentralMeridian,
00311 double dfFalseEasting, double dfFalseNorthing );
00312
00314 OGRErr SetCEA( double dfStdP1, double dfCentralMeridian,
00315 double dfFalseEasting, double dfFalseNorthing );
00316
00318 OGRErr SetCS( double dfCenterLat, double dfCenterLong,
00319 double dfFalseEasting, double dfFalseNorthing );
00320
00322 OGRErr SetEC( double dfStdP1, double dfStdP2,
00323 double dfCenterLat, double dfCenterLong,
00324 double dfFalseEasting, double dfFalseNorthing );
00325
00327 OGRErr SetEckert( int nVariation, double dfCentralMeridian,
00328 double dfFalseEasting, double dfFalseNorthing );
00329
00330 OGRErr SetEckertIV( double dfCentralMeridian,
00331 double dfFalseEasting, double dfFalseNorthing );
00332
00333 OGRErr SetEckertVI( double dfCentralMeridian,
00334 double dfFalseEasting, double dfFalseNorthing );
00335
00337 OGRErr SetEquirectangular(double dfCenterLat, double dfCenterLong,
00338 double dfFalseEasting, double dfFalseNorthing );
00340 OGRErr SetEquirectangular2( double dfCenterLat, double dfCenterLong,
00341 double dfPseudoStdParallel1,
00342 double dfFalseEasting, double dfFalseNorthing );
00343
00345 OGRErr SetGEOS( double dfCentralMeridian, double dfSatelliteHeight,
00346 double dfFalseEasting, double dfFalseNorthing );
00347
00349 OGRErr SetGH( double dfCentralMeridian,
00350 double dfFalseEasting, double dfFalseNorthing );
00351
00353 OGRErr SetGS( double dfCentralMeridian,
00354 double dfFalseEasting, double dfFalseNorthing );
00355
00357 OGRErr SetGaussSchreiberTMercator(double dfCenterLat, double dfCenterLong,
00358 double dfScale,
00359 double dfFalseEasting, double dfFalseNorthing );
00360
00362 OGRErr SetGnomonic(double dfCenterLat, double dfCenterLong,
00363 double dfFalseEasting, double dfFalseNorthing );
00364
00366 OGRErr SetHOM( double dfCenterLat, double dfCenterLong,
00367 double dfAzimuth, double dfRectToSkew,
00368 double dfScale,
00369 double dfFalseEasting, double dfFalseNorthing );
00370
00371 OGRErr SetHOM2PNO( double dfCenterLat,
00372 double dfLat1, double dfLong1,
00373 double dfLat2, double dfLong2,
00374 double dfScale,
00375 double dfFalseEasting, double dfFalseNorthing );
00376
00378 OGRErr SetIWMPolyconic( double dfLat1, double dfLat2,
00379 double dfCenterLong,
00380 double dfFalseEasting,
00381 double dfFalseNorthing );
00382
00384 OGRErr SetKrovak( double dfCenterLat, double dfCenterLong,
00385 double dfAzimuth, double dfPseudoStdParallelLat,
00386 double dfScale,
00387 double dfFalseEasting, double dfFalseNorthing );
00388
00390 OGRErr SetLAEA( double dfCenterLat, double dfCenterLong,
00391 double dfFalseEasting, double dfFalseNorthing );
00392
00394 OGRErr SetLCC( double dfStdP1, double dfStdP2,
00395 double dfCenterLat, double dfCenterLong,
00396 double dfFalseEasting, double dfFalseNorthing );
00397
00399 OGRErr SetLCC1SP( double dfCenterLat, double dfCenterLong,
00400 double dfScale,
00401 double dfFalseEasting, double dfFalseNorthing );
00402
00404 OGRErr SetLCCB( double dfStdP1, double dfStdP2,
00405 double dfCenterLat, double dfCenterLong,
00406 double dfFalseEasting, double dfFalseNorthing );
00407
00409 OGRErr SetMC( double dfCenterLat, double dfCenterLong,
00410 double dfFalseEasting, double dfFalseNorthing );
00411
00413 OGRErr SetMercator( double dfCenterLat, double dfCenterLong,
00414 double dfScale,
00415 double dfFalseEasting, double dfFalseNorthing );
00416
00417 OGRErr SetMercator2SP( double dfStdP1,
00418 double dfCenterLat, double dfCenterLong,
00419 double dfFalseEasting, double dfFalseNorthing );
00420
00422 OGRErr SetMollweide( double dfCentralMeridian,
00423 double dfFalseEasting, double dfFalseNorthing );
00424
00426 OGRErr SetNZMG( double dfCenterLat, double dfCenterLong,
00427 double dfFalseEasting, double dfFalseNorthing );
00428
00430 OGRErr SetOS( double dfOriginLat, double dfCMeridian,
00431 double dfScale,
00432 double dfFalseEasting,double dfFalseNorthing);
00433
00435 OGRErr SetOrthographic( double dfCenterLat, double dfCenterLong,
00436 double dfFalseEasting,double dfFalseNorthing);
00437
00439 OGRErr SetPolyconic( double dfCenterLat, double dfCenterLong,
00440 double dfFalseEasting, double dfFalseNorthing );
00441
00443 OGRErr SetPS( double dfCenterLat, double dfCenterLong,
00444 double dfScale,
00445 double dfFalseEasting, double dfFalseNorthing);
00446
00448 OGRErr SetRobinson( double dfCenterLong,
00449 double dfFalseEasting, double dfFalseNorthing );
00450
00452 OGRErr SetSinusoidal( double dfCenterLong,
00453 double dfFalseEasting, double dfFalseNorthing );
00454
00456 OGRErr SetStereographic( double dfCenterLat, double dfCenterLong,
00457 double dfScale,
00458 double dfFalseEasting,double dfFalseNorthing);
00459
00461 OGRErr SetSOC( double dfLatitudeOfOrigin, double dfCentralMeridian,
00462 double dfFalseEasting, double dfFalseNorthing );
00463
00465 OGRErr SetTM( double dfCenterLat, double dfCenterLong,
00466 double dfScale,
00467 double dfFalseEasting, double dfFalseNorthing );
00468
00470 OGRErr SetTMVariant( const char *pszVariantName,
00471 double dfCenterLat, double dfCenterLong,
00472 double dfScale,
00473 double dfFalseEasting, double dfFalseNorthing );
00474
00476 OGRErr SetTMG( double dfCenterLat, double dfCenterLong,
00477 double dfFalseEasting, double dfFalseNorthing );
00478
00480 OGRErr SetTMSO( double dfCenterLat, double dfCenterLong,
00481 double dfScale,
00482 double dfFalseEasting, double dfFalseNorthing );
00483
00485 OGRErr SetTPED( double dfLat1, double dfLong1,
00486 double dfLat2, double dfLong2,
00487 double dfFalseEasting, double dfFalseNorthing );
00488
00490 OGRErr SetVDG( double dfCenterLong,
00491 double dfFalseEasting, double dfFalseNorthing );
00492
00494 OGRErr SetUTM( int nZone, int bNorth = TRUE );
00495 int GetUTMZone( int *pbNorth = NULL ) const;
00496
00498 OGRErr SetWagner( int nVariation, double dfCenterLat,
00499 double dfFalseEasting, double dfFalseNorthing );
00500
00502 OGRErr SetStatePlane( int nZone, int bNAD83 = TRUE,
00503 const char *pszOverrideUnitName = NULL,
00504 double dfOverrideUnit = 0.0 );
00505 };
00506
00507
00508
00509
00510
00511
00512
00513
00523 class CPL_DLL OGRCoordinateTransformation
00524 {
00525 public:
00526 virtual ~OGRCoordinateTransformation() {}
00527
00528 static void DestroyCT(OGRCoordinateTransformation* poCT);
00529
00530
00531
00533 virtual OGRSpatialReference *GetSourceCS() = 0;
00534
00536 virtual OGRSpatialReference *GetTargetCS() = 0;
00537
00538
00539
00555 virtual int Transform( int nCount,
00556 double *x, double *y, double *z = NULL ) = 0;
00557
00573 virtual int TransformEx( int nCount,
00574 double *x, double *y, double *z = NULL,
00575 int *pabSuccess = NULL ) = 0;
00576
00577 };
00578
00579 OGRCoordinateTransformation CPL_DLL *
00580 OGRCreateCoordinateTransformation( OGRSpatialReference *poSource,
00581 OGRSpatialReference *poTarget );
00582
00583 #endif