1 : /******************************************************************************
2 : * $Id: ogr_spatialref.h 18984 2010-03-01 18:55:44Z warmerdam $
3 : *
4 : * Project: OpenGIS Simple Features Reference Implementation
5 : * Purpose: Classes for manipulating spatial reference systems in a
6 : * platform non-specific manner.
7 : * Author: Frank Warmerdam, warmerdam@pobox.com
8 : *
9 : ******************************************************************************
10 : * Copyright (c) 1999, Les Technologies SoftMap Inc.
11 : *
12 : * Permission is hereby granted, free of charge, to any person obtaining a
13 : * copy of this software and associated documentation files (the "Software"),
14 : * to deal in the Software without restriction, including without limitation
15 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 : * and/or sell copies of the Software, and to permit persons to whom the
17 : * Software is furnished to do so, subject to the following conditions:
18 : *
19 : * The above copyright notice and this permission notice shall be included
20 : * in all copies or substantial portions of the Software.
21 : *
22 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 : * DEALINGS IN THE SOFTWARE.
29 : ****************************************************************************/
30 :
31 : #ifndef _OGR_SPATIALREF_H_INCLUDED
32 : #define _OGR_SPATIALREF_H_INCLUDED
33 :
34 : #include "ogr_srs_api.h"
35 :
36 : /**
37 : * \file ogr_spatialref.h
38 : *
39 : * Coordinate systems services.
40 : */
41 :
42 : /************************************************************************/
43 : /* OGR_SRSNode */
44 : /************************************************************************/
45 :
46 : /**
47 : * Objects of this class are used to represent value nodes in the parsed
48 : * representation of the WKT SRS format. For instance UNIT["METER",1]
49 : * would be rendered into three OGR_SRSNodes. The root node would have a
50 : * value of UNIT, and two children, the first with a value of METER, and the
51 : * second with a value of 1.
52 : *
53 : * Normally application code just interacts with the OGRSpatialReference
54 : * object, which uses the OGR_SRSNode to implement it's data structure;
55 : * however, this class is user accessable for detailed access to components
56 : * of an SRS definition.
57 : */
58 :
59 : class CPL_DLL OGR_SRSNode
60 : {
61 : char *pszValue;
62 :
63 : OGR_SRSNode **papoChildNodes;
64 : OGR_SRSNode *poParent;
65 :
66 : int nChildren;
67 :
68 : void ClearChildren();
69 : int NeedsQuoting() const;
70 :
71 : public:
72 : OGR_SRSNode(const char * = NULL);
73 : ~OGR_SRSNode();
74 :
75 : int IsLeafNode() const { return nChildren == 0; }
76 :
77 2121850 : int GetChildCount() const { return nChildren; }
78 : OGR_SRSNode *GetChild( int );
79 : const OGR_SRSNode *GetChild( int ) const;
80 :
81 : OGR_SRSNode *GetNode( const char * );
82 : const OGR_SRSNode *GetNode( const char * ) const;
83 :
84 : void InsertChild( OGR_SRSNode *, int );
85 : void AddChild( OGR_SRSNode * );
86 : int FindChild( const char * ) const;
87 : void DestroyChild( int );
88 : void StripNodes( const char * );
89 :
90 1336104 : const char *GetValue() const { return pszValue; }
91 : void SetValue( const char * );
92 :
93 : void MakeValueSafe();
94 : OGRErr FixupOrdering();
95 :
96 : OGR_SRSNode *Clone() const;
97 :
98 : OGRErr importFromWkt( char ** );
99 : OGRErr exportToWkt( char ** ) const;
100 : OGRErr exportToPrettyWkt( char **, int = 1) const;
101 :
102 : OGRErr applyRemapper( const char *pszNode,
103 : char **papszSrcValues,
104 : char **papszDstValues,
105 : int nStepSize = 1,
106 : int bChildOfHit = FALSE );
107 : };
108 :
109 : /************************************************************************/
110 : /* OGRSpatialReference */
111 : /************************************************************************/
112 :
113 : /**
114 : * This class respresents a OpenGIS Spatial Reference System, and contains
115 : * methods for converting between this object organization and well known
116 : * text (WKT) format. This object is reference counted as one instance of
117 : * the object is normally shared between many OGRGeometry objects.
118 : *
119 : * Normally application code can fetch needed parameter values for this
120 : * SRS using GetAttrValue(), but in special cases the underlying parse tree
121 : * (or OGR_SRSNode objects) can be accessed more directly.
122 : *
123 : * See <a href="osr_tutorial.html">the tutorial</a> for more information on
124 : * how to use this class.
125 : */
126 :
127 : class CPL_DLL OGRSpatialReference
128 : {
129 : double dfFromGreenwich;
130 : double dfToMeter;
131 : double dfToDegrees;
132 :
133 : OGR_SRSNode *poRoot;
134 :
135 : int nRefCount;
136 : int bNormInfoSet;
137 :
138 : OGRErr ValidateProjection();
139 : int IsAliasFor( const char *, const char * );
140 : void GetNormInfo() const;
141 :
142 : public:
143 : OGRSpatialReference(const OGRSpatialReference&);
144 : OGRSpatialReference(const char * = NULL);
145 :
146 : virtual ~OGRSpatialReference();
147 :
148 : static void DestroySpatialReference(OGRSpatialReference* poSRS);
149 :
150 : OGRSpatialReference &operator=(const OGRSpatialReference&);
151 :
152 : int Reference();
153 : int Dereference();
154 : int GetReferenceCount() const { return nRefCount; }
155 : void Release();
156 :
157 : OGRSpatialReference *Clone() const;
158 : OGRSpatialReference *CloneGeogCS() const;
159 :
160 : OGRErr exportToWkt( char ** ) const;
161 : OGRErr exportToPrettyWkt( char **, int = FALSE) const;
162 : OGRErr exportToProj4( char ** ) const;
163 : OGRErr exportToPCI( char **, char **, double ** ) const;
164 : OGRErr exportToUSGS( long *, long *, double **, long * ) const;
165 : OGRErr exportToXML( char **, const char * = NULL ) const;
166 : OGRErr exportToPanorama( long *, long *, long *, long *,
167 : double * ) const;
168 : OGRErr exportToERM( char *pszProj, char *pszDatum, char *pszUnits );
169 : OGRErr exportToMICoordSys( char ** ) const;
170 :
171 : OGRErr importFromWkt( char ** );
172 : OGRErr importFromProj4( const char * );
173 : OGRErr importFromEPSG( int );
174 : OGRErr importFromEPSGA( int );
175 : OGRErr importFromESRI( char ** );
176 : OGRErr importFromPCI( const char *, const char * = NULL,
177 : double * = NULL );
178 : OGRErr importFromUSGS( long iProjSys, long iZone,
179 : double *padfPrjParams,
180 : long iDatum, int bAnglesInPackedDMSFormat = TRUE );
181 : OGRErr importFromPanorama( long, long, long, double* );
182 : OGRErr importFromOzi( const char *, const char *, const char * );
183 : OGRErr importFromWMSAUTO( const char *pszAutoDef );
184 : OGRErr importFromXML( const char * );
185 : OGRErr importFromDict( const char *pszDict, const char *pszCode );
186 : OGRErr importFromURN( const char * );
187 : OGRErr importFromERM( const char *pszProj, const char *pszDatum,
188 : const char *pszUnits );
189 : OGRErr importFromUrl( const char * );
190 : OGRErr importFromMICoordSys( const char * );
191 :
192 : OGRErr morphToESRI();
193 : OGRErr morphFromESRI();
194 :
195 : OGRErr Validate();
196 : OGRErr StripCTParms( OGR_SRSNode * = NULL );
197 : OGRErr StripVertical();
198 : OGRErr FixupOrdering();
199 : OGRErr Fixup();
200 :
201 : int EPSGTreatsAsLatLong();
202 : const char *GetAxis( const char *pszTargetKey, int iAxis,
203 : OGRAxisOrientation *peOrientation ) const;
204 : OGRErr SetAxes( const char *pszTargetKey,
205 : const char *pszXAxisName,
206 : OGRAxisOrientation eXAxisOrientation,
207 : const char *pszYAxisName,
208 : OGRAxisOrientation eYAxisOrientation );
209 :
210 : // Machinary for accessing parse nodes
211 374547 : OGR_SRSNode *GetRoot() { return poRoot; }
212 13847 : const OGR_SRSNode *GetRoot() const { return poRoot; }
213 : void SetRoot( OGR_SRSNode * );
214 :
215 : OGR_SRSNode *GetAttrNode(const char *);
216 : const OGR_SRSNode *GetAttrNode(const char *) const;
217 : const char *GetAttrValue(const char *, int = 0) const;
218 :
219 : OGRErr SetNode( const char *, const char * );
220 : OGRErr SetNode( const char *, double );
221 :
222 : OGRErr SetLinearUnitsAndUpdateParameters( const char *pszName,
223 : double dfInMeters );
224 : OGRErr SetLinearUnits( const char *pszName, double dfInMeters );
225 : double GetLinearUnits( char ** = NULL ) const;
226 :
227 : OGRErr SetAngularUnits( const char *pszName, double dfInRadians );
228 : double GetAngularUnits( char ** = NULL ) const;
229 :
230 : double GetPrimeMeridian( char ** = NULL ) const;
231 :
232 : int IsGeographic() const;
233 : int IsProjected() const;
234 : int IsLocal() const;
235 : int IsSameGeogCS( const OGRSpatialReference * ) const;
236 : int IsSame( const OGRSpatialReference * ) const;
237 :
238 : void Clear();
239 : OGRErr SetLocalCS( const char * );
240 : OGRErr SetProjCS( const char * );
241 : OGRErr SetProjection( const char * );
242 : OGRErr SetGeogCS( const char * pszGeogName,
243 : const char * pszDatumName,
244 : const char * pszEllipsoidName,
245 : double dfSemiMajor, double dfInvFlattening,
246 : const char * pszPMName = NULL,
247 : double dfPMOffset = 0.0,
248 : const char * pszUnits = NULL,
249 : double dfConvertToRadians = 0.0 );
250 : OGRErr SetWellKnownGeogCS( const char * );
251 : OGRErr CopyGeogCSFrom( const OGRSpatialReference * poSrcSRS );
252 :
253 : OGRErr SetFromUserInput( const char * );
254 :
255 : OGRErr SetTOWGS84( double, double, double,
256 : double = 0.0, double = 0.0, double = 0.0,
257 : double = 0.0 );
258 : OGRErr GetTOWGS84( double *padfCoef, int nCoeff = 7 ) const;
259 :
260 : double GetSemiMajor( OGRErr * = NULL ) const;
261 : double GetSemiMinor( OGRErr * = NULL ) const;
262 : double GetInvFlattening( OGRErr * = NULL ) const;
263 :
264 : OGRErr SetAuthority( const char * pszTargetKey,
265 : const char * pszAuthority,
266 : int nCode );
267 :
268 : OGRErr AutoIdentifyEPSG();
269 : int GetEPSGGeogCS();
270 :
271 : const char *GetAuthorityCode( const char * pszTargetKey ) const;
272 : const char *GetAuthorityName( const char * pszTargetKey ) const;
273 :
274 : const char *GetExtension( const char *pszTargetKey,
275 : const char *pszName,
276 : const char *pszDefault = NULL ) const;
277 : OGRErr SetExtension( const char *pszTargetKey,
278 : const char *pszName,
279 : const char *pszValue );
280 :
281 : int FindProjParm( const char *pszParameter,
282 : const OGR_SRSNode *poPROJCS=NULL ) const;
283 : OGRErr SetProjParm( const char *, double );
284 : double GetProjParm( const char *, double =0.0, OGRErr* = NULL ) const;
285 :
286 : OGRErr SetNormProjParm( const char *, double );
287 : double GetNormProjParm( const char *, double=0.0, OGRErr* =NULL)const;
288 :
289 : static int IsAngularParameter( const char * );
290 : static int IsLongitudeParameter( const char * );
291 : static int IsLinearParameter( const char * );
292 :
293 : /** Albers Conic Equal Area */
294 : OGRErr SetACEA( double dfStdP1, double dfStdP2,
295 : double dfCenterLat, double dfCenterLong,
296 : double dfFalseEasting, double dfFalseNorthing );
297 :
298 : /** Azimuthal Equidistant */
299 : OGRErr SetAE( double dfCenterLat, double dfCenterLong,
300 : double dfFalseEasting, double dfFalseNorthing );
301 :
302 : /** Bonne */
303 : OGRErr SetBonne( double dfStdP1, double dfCentralMeridian,
304 : double dfFalseEasting, double dfFalseNorthing );
305 :
306 : /** Cylindrical Equal Area */
307 : OGRErr SetCEA( double dfStdP1, double dfCentralMeridian,
308 : double dfFalseEasting, double dfFalseNorthing );
309 :
310 : /** Cassini-Soldner */
311 : OGRErr SetCS( double dfCenterLat, double dfCenterLong,
312 : double dfFalseEasting, double dfFalseNorthing );
313 :
314 : /** Equidistant Conic */
315 : OGRErr SetEC( double dfStdP1, double dfStdP2,
316 : double dfCenterLat, double dfCenterLong,
317 : double dfFalseEasting, double dfFalseNorthing );
318 :
319 : /** Eckert I-VI */
320 : OGRErr SetEckert( int nVariation, double dfCentralMeridian,
321 : double dfFalseEasting, double dfFalseNorthing );
322 :
323 : OGRErr SetEckertIV( double dfCentralMeridian,
324 : double dfFalseEasting, double dfFalseNorthing );
325 :
326 : OGRErr SetEckertVI( double dfCentralMeridian,
327 : double dfFalseEasting, double dfFalseNorthing );
328 :
329 : /** Equirectangular */
330 : OGRErr SetEquirectangular(double dfCenterLat, double dfCenterLong,
331 : double dfFalseEasting, double dfFalseNorthing );
332 : /** Equirectangular generalized form : */
333 : OGRErr SetEquirectangular2( double dfCenterLat, double dfCenterLong,
334 : double dfPseudoStdParallel1,
335 : double dfFalseEasting, double dfFalseNorthing );
336 :
337 : /** Geostationary Satellite */
338 : OGRErr SetGEOS( double dfCentralMeridian, double dfSatelliteHeight,
339 : double dfFalseEasting, double dfFalseNorthing );
340 :
341 : /** Goode Homolosine */
342 : OGRErr SetGH( double dfCentralMeridian,
343 : double dfFalseEasting, double dfFalseNorthing );
344 :
345 : /** Gall Stereograpic */
346 : OGRErr SetGS( double dfCentralMeridian,
347 : double dfFalseEasting, double dfFalseNorthing );
348 :
349 : /** Gauss Schreiber Transverse Mercator */
350 : OGRErr SetGaussSchreiberTMercator(double dfCenterLat, double dfCenterLong,
351 : double dfScale,
352 : double dfFalseEasting, double dfFalseNorthing );
353 :
354 : /** Gnomonic */
355 : OGRErr SetGnomonic(double dfCenterLat, double dfCenterLong,
356 : double dfFalseEasting, double dfFalseNorthing );
357 :
358 : OGRErr SetHOM( double dfCenterLat, double dfCenterLong,
359 : double dfAzimuth, double dfRectToSkew,
360 : double dfScale,
361 : double dfFalseEasting, double dfFalseNorthing );
362 :
363 : OGRErr SetHOM2PNO( double dfCenterLat,
364 : double dfLat1, double dfLong1,
365 : double dfLat2, double dfLong2,
366 : double dfScale,
367 : double dfFalseEasting, double dfFalseNorthing );
368 :
369 : /** International Map of the World Polyconic */
370 : OGRErr SetIWMPolyconic( double dfLat1, double dfLat2,
371 : double dfCenterLong,
372 : double dfFalseEasting,
373 : double dfFalseNorthing );
374 :
375 : /** Krovak Oblique Conic Conformal */
376 : OGRErr SetKrovak( double dfCenterLat, double dfCenterLong,
377 : double dfAzimuth, double dfPseudoStdParallelLat,
378 : double dfScale,
379 : double dfFalseEasting, double dfFalseNorthing );
380 :
381 : /** Lambert Azimuthal Equal-Area */
382 : OGRErr SetLAEA( double dfCenterLat, double dfCenterLong,
383 : double dfFalseEasting, double dfFalseNorthing );
384 :
385 : /** Lambert Conformal Conic */
386 : OGRErr SetLCC( double dfStdP1, double dfStdP2,
387 : double dfCenterLat, double dfCenterLong,
388 : double dfFalseEasting, double dfFalseNorthing );
389 :
390 : /** Lambert Conformal Conic 1SP */
391 : OGRErr SetLCC1SP( double dfCenterLat, double dfCenterLong,
392 : double dfScale,
393 : double dfFalseEasting, double dfFalseNorthing );
394 :
395 : /** Lambert Conformal Conic (Belgium) */
396 : OGRErr SetLCCB( double dfStdP1, double dfStdP2,
397 : double dfCenterLat, double dfCenterLong,
398 : double dfFalseEasting, double dfFalseNorthing );
399 :
400 : /** Miller Cylindrical */
401 : OGRErr SetMC( double dfCenterLat, double dfCenterLong,
402 : double dfFalseEasting, double dfFalseNorthing );
403 :
404 : /** Mercator */
405 : OGRErr SetMercator( double dfCenterLat, double dfCenterLong,
406 : double dfScale,
407 : double dfFalseEasting, double dfFalseNorthing );
408 :
409 : OGRErr SetMercator2SP( double dfStdP1,
410 : double dfCenterLat, double dfCenterLong,
411 : double dfFalseEasting, double dfFalseNorthing );
412 :
413 : /** Mollweide */
414 : OGRErr SetMollweide( double dfCentralMeridian,
415 : double dfFalseEasting, double dfFalseNorthing );
416 :
417 : /** New Zealand Map Grid */
418 : OGRErr SetNZMG( double dfCenterLat, double dfCenterLong,
419 : double dfFalseEasting, double dfFalseNorthing );
420 :
421 : /** Oblique Stereographic */
422 : OGRErr SetOS( double dfOriginLat, double dfCMeridian,
423 : double dfScale,
424 : double dfFalseEasting,double dfFalseNorthing);
425 :
426 : /** Orthographic */
427 : OGRErr SetOrthographic( double dfCenterLat, double dfCenterLong,
428 : double dfFalseEasting,double dfFalseNorthing);
429 :
430 : /** Polyconic */
431 : OGRErr SetPolyconic( double dfCenterLat, double dfCenterLong,
432 : double dfFalseEasting, double dfFalseNorthing );
433 :
434 : /** Polar Stereographic */
435 : OGRErr SetPS( double dfCenterLat, double dfCenterLong,
436 : double dfScale,
437 : double dfFalseEasting, double dfFalseNorthing);
438 :
439 : /** Robinson */
440 : OGRErr SetRobinson( double dfCenterLong,
441 : double dfFalseEasting, double dfFalseNorthing );
442 :
443 : /** Sinusoidal */
444 : OGRErr SetSinusoidal( double dfCenterLong,
445 : double dfFalseEasting, double dfFalseNorthing );
446 :
447 : /** Stereographic */
448 : OGRErr SetStereographic( double dfCenterLat, double dfCenterLong,
449 : double dfScale,
450 : double dfFalseEasting,double dfFalseNorthing);
451 :
452 : /** Swiss Oblique Cylindrical */
453 : OGRErr SetSOC( double dfLatitudeOfOrigin, double dfCentralMeridian,
454 : double dfFalseEasting, double dfFalseNorthing );
455 :
456 : /** Transverse Mercator */
457 : OGRErr SetTM( double dfCenterLat, double dfCenterLong,
458 : double dfScale,
459 : double dfFalseEasting, double dfFalseNorthing );
460 :
461 : /** Transverse Mercator variants. */
462 : OGRErr SetTMVariant( const char *pszVariantName,
463 : double dfCenterLat, double dfCenterLong,
464 : double dfScale,
465 : double dfFalseEasting, double dfFalseNorthing );
466 :
467 : /** Tunesia Mining Grid */
468 : OGRErr SetTMG( double dfCenterLat, double dfCenterLong,
469 : double dfFalseEasting, double dfFalseNorthing );
470 :
471 : /** Transverse Mercator (South Oriented) */
472 : OGRErr SetTMSO( double dfCenterLat, double dfCenterLong,
473 : double dfScale,
474 : double dfFalseEasting, double dfFalseNorthing );
475 :
476 : /** Two Point Equidistant */
477 : OGRErr SetTPED( double dfLat1, double dfLong1,
478 : double dfLat2, double dfLong2,
479 : double dfFalseEasting, double dfFalseNorthing );
480 :
481 : /** VanDerGrinten */
482 : OGRErr SetVDG( double dfCenterLong,
483 : double dfFalseEasting, double dfFalseNorthing );
484 :
485 : /** Universal Transverse Mercator */
486 : OGRErr SetUTM( int nZone, int bNorth = TRUE );
487 : int GetUTMZone( int *pbNorth = NULL ) const;
488 :
489 : /** Wagner I -- VII */
490 : OGRErr SetWagner( int nVariation, double dfCenterLat,
491 : double dfFalseEasting, double dfFalseNorthing );
492 :
493 : /** State Plane */
494 : OGRErr SetStatePlane( int nZone, int bNAD83 = TRUE,
495 : const char *pszOverrideUnitName = NULL,
496 : double dfOverrideUnit = 0.0 );
497 : };
498 :
499 : /************************************************************************/
500 : /* OGRCoordinateTransformation */
501 : /* */
502 : /* This is really just used as a base class for a private */
503 : /* implementation. */
504 : /************************************************************************/
505 :
506 : /**
507 : * Interface for transforming between coordinate systems.
508 : *
509 : * Currently, the only implementation within OGR is OGRProj4CT, which
510 : * requires the PROJ.4 library to be available at run-time.
511 : *
512 : * Also, see OGRCreateCoordinateTransformation() for creating transformations.
513 : */
514 :
515 : class CPL_DLL OGRCoordinateTransformation
516 176 : {
517 : public:
518 176 : virtual ~OGRCoordinateTransformation() {}
519 :
520 : static void DestroyCT(OGRCoordinateTransformation* poCT);
521 :
522 : // From CT_CoordinateTransformation
523 :
524 : /** Fetch internal source coordinate system. */
525 : virtual OGRSpatialReference *GetSourceCS() = 0;
526 :
527 : /** Fetch internal target coordinate system. */
528 : virtual OGRSpatialReference *GetTargetCS() = 0;
529 :
530 : // From CT_MathTransform
531 :
532 : /**
533 : * Transform points from source to destination space.
534 : *
535 : * This method is the same as the C function OCTTransform().
536 : *
537 : * The method TransformEx() allows extended success information to
538 : * be captured indicating which points failed to transform.
539 : *
540 : * @param nCount number of points to transform.
541 : * @param x array of nCount X vertices, modified in place.
542 : * @param y array of nCount Y vertices, modified in place.
543 : * @param z array of nCount Z vertices, modified in place.
544 : * @return TRUE on success, or FALSE if some or all points fail to
545 : * transform.
546 : */
547 : virtual int Transform( int nCount,
548 : double *x, double *y, double *z = NULL ) = 0;
549 :
550 : /**
551 : * Transform points from source to destination space.
552 : *
553 : * This method is the same as the C function OCTTransformEx().
554 : *
555 : * @param nCount number of points to transform.
556 : * @param x array of nCount X vertices, modified in place.
557 : * @param y array of nCount Y vertices, modified in place.
558 : * @param z array of nCount Z vertices, modified in place.
559 : * @param pabSuccess array of per-point flags set to TRUE if that point
560 : * transforms, or FALSE if it does not.
561 : *
562 : * @return TRUE if some or all points transform successfully, or FALSE if
563 : * if none transform.
564 : */
565 : virtual int TransformEx( int nCount,
566 : double *x, double *y, double *z = NULL,
567 : int *pabSuccess = NULL ) = 0;
568 :
569 : };
570 :
571 : OGRCoordinateTransformation CPL_DLL *
572 : OGRCreateCoordinateTransformation( OGRSpatialReference *poSource,
573 : OGRSpatialReference *poTarget );
574 :
575 : #endif /* ndef _OGR_SPATIALREF_H_INCLUDED */
|