GDAL

ogr_spatialref.h
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Project: OpenGIS Simple Features Reference Implementation
4 * Purpose: Classes for manipulating spatial reference systems in a
5 * platform non-specific manner.
6 * Author: Frank Warmerdam, warmerdam@pobox.com
7 *
8 ******************************************************************************
9 * Copyright (c) 1999, Les Technologies SoftMap Inc.
10 * Copyright (c) 2008-2013, Even Rouault <even dot rouault at spatialys.com>
11 *
12 * SPDX-License-Identifier: MIT
13 ****************************************************************************/
14
15#ifndef OGR_SPATIALREF_H_INCLUDED
16#define OGR_SPATIALREF_H_INCLUDED
17
18#include "cpl_string.h"
19#include "ogr_srs_api.h"
20
21#include <cstddef>
22#include <map>
23#include <memory>
24#include <vector>
25
32/************************************************************************/
33/* OGR_SRSNode */
34/************************************************************************/
35
49 class CPL_DLL OGR_SRSNode
50{
51 public:
53 struct Listener
54 {
55 virtual ~Listener();
57 virtual void notifyChange(OGR_SRSNode *) = 0;
58 };
59
60 explicit OGR_SRSNode(const char * = nullptr);
61 ~OGR_SRSNode();
62
64 void RegisterListener(const std::shared_ptr<Listener> &listener);
65
69 int IsLeafNode() const
70 {
71 return nChildren == 0;
72 }
73
74 int GetChildCount() const
75 {
76 return nChildren;
77 }
78
79 OGR_SRSNode *GetChild(int);
80 const OGR_SRSNode *GetChild(int) const;
81
82 OGR_SRSNode *GetNode(const char *);
83 const OGR_SRSNode *GetNode(const char *) const;
84
85 void InsertChild(OGR_SRSNode *, int);
86 void AddChild(OGR_SRSNode *);
87 int FindChild(const char *) const;
88 void DestroyChild(int);
89 void ClearChildren();
90 void StripNodes(const char *);
91
92 const char *GetValue() const
93 {
94 return pszValue;
95 }
96
97 void SetValue(const char *);
98
99 void MakeValueSafe();
100
101 OGR_SRSNode *Clone() const;
102
103 OGRErr importFromWkt(char **)
105 CPL_WARN_DEPRECATED("Use importFromWkt(const char**)")
107 ;
108 OGRErr importFromWkt(const char **);
109 OGRErr exportToWkt(char **) const;
110 OGRErr exportToPrettyWkt(char **, int = 1) const;
111
112 private:
113 char *pszValue;
114
115 OGR_SRSNode **papoChildNodes;
116 OGR_SRSNode *poParent;
117
118 int nChildren;
119
120 int NeedsQuoting() const;
121 OGRErr importFromWkt(const char **, int nRecLevel, int *pnNodes);
122
123 std::weak_ptr<Listener> m_listener{};
124 void notifyChange();
125
126 CPL_DISALLOW_COPY_ASSIGN(OGR_SRSNode)
127};
128
129/************************************************************************/
130/* OGRSpatialReference */
131/************************************************************************/
132
151 class CPL_DLL OGRSpatialReference
152{
153 struct Private;
154 std::unique_ptr<Private> d;
155
156 void GetNormInfo() const;
157
158 // No longer used with PROJ >= 8.1.0
159 OGRErr importFromURNPart(const char *pszAuthority, const char *pszCode,
160 const char *pszURN);
161
162 static CPLString lookupInDict(const char *pszDictFile, const char *pszCode);
163
164 OGRErr GetWKT2ProjectionMethod(const char **ppszMethodName,
165 const char **ppszMethodAuthName = nullptr,
166 const char **ppszMethodCode = nullptr) const;
167
168 public:
169 explicit OGRSpatialReference(const char * = nullptr);
170 OGRSpatialReference(const OGRSpatialReference &);
171 OGRSpatialReference(OGRSpatialReference &&);
172
173 virtual ~OGRSpatialReference();
174
175 static void DestroySpatialReference(OGRSpatialReference *poSRS);
176
177 OGRSpatialReference &operator=(const OGRSpatialReference &);
178 OGRSpatialReference &operator=(OGRSpatialReference &&);
179
180 OGRSpatialReference &AssignAndSetThreadSafe(const OGRSpatialReference &);
181
182 int Reference();
183 int Dereference();
184 int GetReferenceCount() const;
185 void Release();
186
187 const char *GetName() const;
188
189 OGRSpatialReference *Clone() const;
190 OGRSpatialReference *CloneGeogCS() const;
191
192 void dumpReadable();
193 OGRErr exportToWkt(char **) const;
194 OGRErr exportToWkt(char **ppszWKT, const char *const *papszOptions) const;
195 std::string exportToWkt(const char *const *papszOptions = nullptr) const;
196 OGRErr exportToPrettyWkt(char **, int = FALSE) const;
197 // cppcheck-suppress functionStatic
198 OGRErr exportToPROJJSON(char **, const char *const *papszOptions) const;
199 OGRErr exportToProj4(char **) const;
200 OGRErr exportToPCI(char **, char **, double **) const;
201 OGRErr exportToUSGS(long *, long *, double **, long *) const;
202 OGRErr exportToXML(char **, const char * = nullptr) const;
203 OGRErr exportToPanorama(long *, long *, long *, long *, double *) const;
204 OGRErr exportVertCSToPanorama(int *) const;
205 OGRErr exportToERM(char *pszProj, char *pszDatum, char *pszUnits);
206 OGRErr exportToMICoordSys(char **) const;
207 OGRErr exportToCF1(char **ppszGridMappingName, char ***ppapszKeyValues,
208 char **ppszUnits, CSLConstList papszOptions) const;
209
210 OGRErr importFromWkt(char **)
212 CPL_WARN_DEPRECATED(
213 "Use importFromWkt(const char**) or importFromWkt(const char*)")
215 ;
216
217 OGRErr importFromWkt(const char **);
219 OGRErr importFromWkt(const char *pszInput, CSLConstList papszOptions);
220 OGRErr importFromWkt(const char **ppszInput, CSLConstList papszOptions);
222 OGRErr importFromWkt(const char *);
223 OGRErr importFromProj4(const char *);
224 OGRErr importFromEPSG(int);
225 OGRErr importFromEPSGA(int);
226 OGRErr importFromESRI(char **);
227 OGRErr importFromPCI(const char *, const char * = nullptr,
228 const double * = nullptr);
229
230#define USGS_ANGLE_DECIMALDEGREES 0
231#define USGS_ANGLE_PACKEDDMS \
232 TRUE
233#define USGS_ANGLE_RADIANS 2
234 OGRErr importFromUSGS(long iProjSys, long iZone, double *padfPrjParams,
235 long iDatum,
236 int nUSGSAngleFormat = USGS_ANGLE_PACKEDDMS);
237 OGRErr importFromPanorama(long, long, long, double *, bool bNorth = true);
238 OGRErr importVertCSFromPanorama(int);
239 OGRErr importFromOzi(const char *const *papszLines);
240 OGRErr importFromWMSAUTO(const char *pszAutoDef);
241 OGRErr importFromXML(const char *);
242 OGRErr importFromDict(const char *pszDict, const char *pszCode);
243 OGRErr importFromURN(const char *);
244 OGRErr importFromCRSURL(const char *);
245 OGRErr importFromERM(const char *pszProj, const char *pszDatum,
246 const char *pszUnits);
247 OGRErr importFromUrl(const char *);
248 OGRErr importFromMICoordSys(const char *);
249 OGRErr importFromCF1(CSLConstList papszKeyValues, const char *pszUnits);
250
251 OGRErr morphToESRI();
252 OGRErr morphFromESRI();
253
254 OGRSpatialReference *
255 convertToOtherProjection(const char *pszTargetProjection,
256 const char *const *papszOptions = nullptr) const;
257
258 OGRErr Validate() const;
259 OGRErr StripVertical();
260
261 bool StripTOWGS84IfKnownDatumAndAllowed();
262 bool StripTOWGS84IfKnownDatum();
263
264 int EPSGTreatsAsLatLong() const;
265 int EPSGTreatsAsNorthingEasting() const;
266 int GetAxesCount() const;
267 const char *GetAxis(const char *pszTargetKey, int iAxis,
268 OGRAxisOrientation *peOrientation,
269 double *pdfConvFactor = nullptr) const;
270 OGRErr SetAxes(const char *pszTargetKey, const char *pszXAxisName,
271 OGRAxisOrientation eXAxisOrientation,
272 const char *pszYAxisName,
273 OGRAxisOrientation eYAxisOrientation);
274
275 OSRAxisMappingStrategy GetAxisMappingStrategy() const;
276 void SetAxisMappingStrategy(OSRAxisMappingStrategy);
277 const std::vector<int> &GetDataAxisToSRSAxisMapping() const;
278 OGRErr SetDataAxisToSRSAxisMapping(const std::vector<int> &mapping);
279
280 // Machinery for accessing parse nodes
281
283 OGR_SRSNode *GetRoot();
285 const OGR_SRSNode *GetRoot() const;
286 void SetRoot(OGR_SRSNode *);
287
288 OGR_SRSNode *GetAttrNode(const char *);
289 const OGR_SRSNode *GetAttrNode(const char *) const;
290 const char *GetAttrValue(const char *, int = 0) const;
291
292 OGRErr SetNode(const char *, const char *);
293 // cppcheck-suppress functionStatic
294 OGRErr SetNode(const char *, double);
295
296 OGRErr
297 SetLinearUnitsAndUpdateParameters(const char *pszName, double dfInMeters,
298 const char *pszUnitAuthority = nullptr,
299 const char *pszUnitCode = nullptr);
300 OGRErr SetLinearUnits(const char *pszName, double dfInMeters);
301 OGRErr SetTargetLinearUnits(const char *pszTargetKey, const char *pszName,
302 double dfInMeters,
303 const char *pszUnitAuthority = nullptr,
304 const char *pszUnitCode = nullptr);
305
306 double GetLinearUnits(char **) const
308 CPL_WARN_DEPRECATED("Use GetLinearUnits(const char**) instead")
310 ;
311 double GetLinearUnits(const char ** = nullptr) const;
312
314 double GetLinearUnits(std::nullptr_t) const
315 {
316 return GetLinearUnits(static_cast<const char **>(nullptr));
317 }
318
321 double GetTargetLinearUnits(const char *pszTargetKey,
322 char **ppszRetName) const
324 CPL_WARN_DEPRECATED(
325 "Use GetTargetLinearUnits(const char*, const char**)")
327 ;
328 double GetTargetLinearUnits(const char *pszTargetKey,
329 const char **ppszRetName = nullptr) const;
330
332 double GetTargetLinearUnits(const char *pszTargetKey, std::nullptr_t) const
333 {
334 return GetTargetLinearUnits(pszTargetKey,
335 static_cast<const char **>(nullptr));
336 }
337
340 OGRErr SetAngularUnits(const char *pszName, double dfInRadians);
341 double GetAngularUnits(char **) const
343 CPL_WARN_DEPRECATED("Use GetAngularUnits(const char**) instead")
345 ;
346 double GetAngularUnits(const char ** = nullptr) const;
347
349 double GetAngularUnits(std::nullptr_t) const
350 {
351 return GetAngularUnits(static_cast<const char **>(nullptr));
352 }
353
356 double GetPrimeMeridian(char **) const
358 CPL_WARN_DEPRECATED("Use GetPrimeMeridian(const char**) instead")
360 ;
361 double GetPrimeMeridian(const char ** = nullptr) const;
362
364 double GetPrimeMeridian(std::nullptr_t) const
365 {
366 return GetPrimeMeridian(static_cast<const char **>(nullptr));
367 }
368
371 bool IsEmpty() const;
372 int IsGeographic() const;
373 int IsDerivedGeographic() const;
374 int IsProjected() const;
375 int IsDerivedProjected() const;
376 int IsGeocentric() const;
377 bool IsDynamic() const;
378
379 // cppcheck-suppress functionStatic
380 bool HasPointMotionOperation() const;
381
382 int IsLocal() const;
383 int IsVertical() const;
384 int IsCompound() const;
385 int IsSameGeogCS(const OGRSpatialReference *) const;
386 int IsSameGeogCS(const OGRSpatialReference *,
387 const char *const *papszOptions) const;
388 int IsSameVertCS(const OGRSpatialReference *) const;
389 int IsSame(const OGRSpatialReference *) const;
390 int IsSame(const OGRSpatialReference *,
391 const char *const *papszOptions) const;
392
393 const char *GetCelestialBodyName() const;
394
395 void Clear();
396 OGRErr SetLocalCS(const char *);
397 OGRErr SetProjCS(const char *);
398 OGRErr SetProjection(const char *);
399 OGRErr SetGeocCS(const char *pszGeocName);
400 OGRErr SetGeogCS(const char *pszGeogName, const char *pszDatumName,
401 const char *pszEllipsoidName, double dfSemiMajor,
402 double dfInvFlattening, const char *pszPMName = nullptr,
403 double dfPMOffset = 0.0, const char *pszUnits = nullptr,
404 double dfConvertToRadians = 0.0);
405 OGRErr SetWellKnownGeogCS(const char *);
406 OGRErr CopyGeogCSFrom(const OGRSpatialReference *poSrcSRS);
407 OGRErr SetVertCS(const char *pszVertCSName, const char *pszVertDatumName,
408 int nVertDatumClass = 2005);
409 OGRErr SetCompoundCS(const char *pszName,
410 const OGRSpatialReference *poHorizSRS,
411 const OGRSpatialReference *poVertSRS);
412
413 void SetCoordinateEpoch(double dfCoordinateEpoch);
414 double GetCoordinateEpoch() const;
415
416 // cppcheck-suppress functionStatic
417 OGRErr PromoteTo3D(const char *pszName);
418 // cppcheck-suppress functionStatic
419 OGRErr DemoteTo2D(const char *pszName);
420
421 OGRErr SetFromUserInput(const char *);
422
423 static const char *const SET_FROM_USER_INPUT_LIMITATIONS[];
424 static CSLConstList SET_FROM_USER_INPUT_LIMITATIONS_get();
425
426 OGRErr SetFromUserInput(const char *, CSLConstList papszOptions);
427
428 OGRErr SetTOWGS84(double, double, double, double = 0.0, double = 0.0,
429 double = 0.0, double = 0.0);
430 OGRErr GetTOWGS84(double *padfCoef, int nCoeff = 7) const;
431 OGRErr AddGuessedTOWGS84();
432
433 double GetSemiMajor(OGRErr * = nullptr) const;
434 double GetSemiMinor(OGRErr * = nullptr) const;
435 double GetInvFlattening(OGRErr * = nullptr) const;
436 double GetEccentricity() const;
437 double GetSquaredEccentricity() const;
438
439 OGRErr SetAuthority(const char *pszTargetKey, const char *pszAuthority,
440 int nCode);
441
442 OGRErr AutoIdentifyEPSG();
443 OGRSpatialReferenceH *FindMatches(char **papszOptions, int *pnEntries,
444 int **ppanMatchConfidence) const;
445 OGRSpatialReference *
446 FindBestMatch(int nMinimumMatchConfidence = 90,
447 const char *pszPreferredAuthority = "EPSG",
448 CSLConstList papszOptions = nullptr) const;
449
450 int GetEPSGGeogCS() const;
451
452 const char *GetAuthorityCode(const char *pszTargetKey) const;
453 const char *GetAuthorityName(const char *pszTargetKey) const;
454 char *GetOGCURN() const;
455
456 bool GetAreaOfUse(double *pdfWestLongitudeDeg, double *pdfSouthLatitudeDeg,
457 double *pdfEastLongitudeDeg, double *pdfNorthLatitudeDeg,
458 const char **ppszAreaName) const;
459
460 const char *GetExtension(const char *pszTargetKey, const char *pszName,
461 const char *pszDefault = nullptr) const;
462 OGRErr SetExtension(const char *pszTargetKey, const char *pszName,
463 const char *pszValue);
464
465 int FindProjParm(const char *pszParameter,
466 const OGR_SRSNode *poPROJCS = nullptr) const;
467 OGRErr SetProjParm(const char *, double);
468 double GetProjParm(const char *, double = 0.0, OGRErr * = nullptr) const;
469
470 OGRErr SetNormProjParm(const char *, double);
471 double GetNormProjParm(const char *, double = 0.0,
472 OGRErr * = nullptr) const;
473
474 static int IsAngularParameter(const char *);
475 static int IsLongitudeParameter(const char *);
476 static int IsLinearParameter(const char *);
477
479 OGRErr SetACEA(double dfStdP1, double dfStdP2, double dfCenterLat,
480 double dfCenterLong, double dfFalseEasting,
481 double dfFalseNorthing);
482
484 OGRErr SetAE(double dfCenterLat, double dfCenterLong, double dfFalseEasting,
485 double dfFalseNorthing);
486
488 OGRErr SetBonne(double dfStdP1, double dfCentralMeridian,
489 double dfFalseEasting, double dfFalseNorthing);
490
492 OGRErr SetCEA(double dfStdP1, double dfCentralMeridian,
493 double dfFalseEasting, double dfFalseNorthing);
494
496 OGRErr SetCS(double dfCenterLat, double dfCenterLong, double dfFalseEasting,
497 double dfFalseNorthing);
498
500 OGRErr SetEC(double dfStdP1, double dfStdP2, double dfCenterLat,
501 double dfCenterLong, double dfFalseEasting,
502 double dfFalseNorthing);
503
505 OGRErr SetEckert(int nVariation, double dfCentralMeridian,
506 double dfFalseEasting, double dfFalseNorthing);
507
509 OGRErr SetEckertIV(double dfCentralMeridian, double dfFalseEasting,
510 double dfFalseNorthing);
511
513 OGRErr SetEckertVI(double dfCentralMeridian, double dfFalseEasting,
514 double dfFalseNorthing);
515
517 OGRErr SetEquirectangular(double dfCenterLat, double dfCenterLong,
518 double dfFalseEasting, double dfFalseNorthing);
520 OGRErr SetEquirectangular2(double dfCenterLat, double dfCenterLong,
521 double dfPseudoStdParallel1,
522 double dfFalseEasting, double dfFalseNorthing);
523
525 OGRErr SetGEOS(double dfCentralMeridian, double dfSatelliteHeight,
526 double dfFalseEasting, double dfFalseNorthing);
527
529 OGRErr SetGH(double dfCentralMeridian, double dfFalseEasting,
530 double dfFalseNorthing);
531
533 OGRErr SetIGH();
534
536 OGRErr SetGS(double dfCentralMeridian, double dfFalseEasting,
537 double dfFalseNorthing);
538
540 OGRErr SetGaussSchreiberTMercator(double dfCenterLat, double dfCenterLong,
541 double dfScale, double dfFalseEasting,
542 double dfFalseNorthing);
543
545 OGRErr SetGnomonic(double dfCenterLat, double dfCenterLong,
546 double dfFalseEasting, double dfFalseNorthing);
547
549 OGRErr SetHOM(double dfCenterLat, double dfCenterLong, double dfAzimuth,
550 double dfRectToSkew, double dfScale, double dfFalseEasting,
551 double dfFalseNorthing);
552
554 OGRErr SetHOM2PNO(double dfCenterLat, double dfLat1, double dfLong1,
555 double dfLat2, double dfLong2, double dfScale,
556 double dfFalseEasting, double dfFalseNorthing);
557
559 OGRErr SetHOMAC(double dfCenterLat, double dfCenterLong, double dfAzimuth,
560 double dfRectToSkew, double dfScale, double dfFalseEasting,
561 double dfFalseNorthing);
562
564 OGRErr SetLOM(double dfCenterLat, double dfCenterLong, double dfAzimuth,
565 double dfScale, double dfFalseEasting,
566 double dfFalseNorthing);
567
569 OGRErr SetIWMPolyconic(double dfLat1, double dfLat2, double dfCenterLong,
570 double dfFalseEasting, double dfFalseNorthing);
571
573 OGRErr SetKrovak(double dfCenterLat, double dfCenterLong, double dfAzimuth,
574 double dfPseudoStdParallelLat, double dfScale,
575 double dfFalseEasting, double dfFalseNorthing);
576
578 OGRErr SetLAEA(double dfCenterLat, double dfCenterLong,
579 double dfFalseEasting, double dfFalseNorthing);
580
582 OGRErr SetLCC(double dfStdP1, double dfStdP2, double dfCenterLat,
583 double dfCenterLong, double dfFalseEasting,
584 double dfFalseNorthing);
585
587 OGRErr SetLCC1SP(double dfCenterLat, double dfCenterLong, double dfScale,
588 double dfFalseEasting, double dfFalseNorthing);
589
591 OGRErr SetLCCB(double dfStdP1, double dfStdP2, double dfCenterLat,
592 double dfCenterLong, double dfFalseEasting,
593 double dfFalseNorthing);
594
596 OGRErr SetMC(double dfCenterLat, double dfCenterLong, double dfFalseEasting,
597 double dfFalseNorthing);
598
600 OGRErr SetMercator(double dfCenterLat, double dfCenterLong, double dfScale,
601 double dfFalseEasting, double dfFalseNorthing);
602
604 OGRErr SetMercator2SP(double dfStdP1, double dfCenterLat,
605 double dfCenterLong, double dfFalseEasting,
606 double dfFalseNorthing);
607
609 OGRErr SetMollweide(double dfCentralMeridian, double dfFalseEasting,
610 double dfFalseNorthing);
611
613 OGRErr SetNZMG(double dfCenterLat, double dfCenterLong,
614 double dfFalseEasting, double dfFalseNorthing);
615
617 OGRErr SetOS(double dfOriginLat, double dfCMeridian, double dfScale,
618 double dfFalseEasting, double dfFalseNorthing);
619
621 OGRErr SetOrthographic(double dfCenterLat, double dfCenterLong,
622 double dfFalseEasting, double dfFalseNorthing);
623
625 OGRErr SetPolyconic(double dfCenterLat, double dfCenterLong,
626 double dfFalseEasting, double dfFalseNorthing);
627
629 OGRErr SetPS(double dfCenterLat, double dfCenterLong, double dfScale,
630 double dfFalseEasting, double dfFalseNorthing);
631
633 OGRErr SetRobinson(double dfCenterLong, double dfFalseEasting,
634 double dfFalseNorthing);
635
637 OGRErr SetSinusoidal(double dfCenterLong, double dfFalseEasting,
638 double dfFalseNorthing);
639
641 OGRErr SetStereographic(double dfCenterLat, double dfCenterLong,
642 double dfScale, double dfFalseEasting,
643 double dfFalseNorthing);
644
646 OGRErr SetSOC(double dfLatitudeOfOrigin, double dfCentralMeridian,
647 double dfFalseEasting, double dfFalseNorthing);
648
650 OGRErr SetTM(double dfCenterLat, double dfCenterLong, double dfScale,
651 double dfFalseEasting, double dfFalseNorthing);
652
654 OGRErr SetTMVariant(const char *pszVariantName, double dfCenterLat,
655 double dfCenterLong, double dfScale,
656 double dfFalseEasting, double dfFalseNorthing);
657
659 OGRErr SetTMG(double dfCenterLat, double dfCenterLong,
660 double dfFalseEasting, double dfFalseNorthing);
661
663 OGRErr SetTMSO(double dfCenterLat, double dfCenterLong, double dfScale,
664 double dfFalseEasting, double dfFalseNorthing);
665
667 OGRErr SetTPED(double dfLat1, double dfLong1, double dfLat2, double dfLong2,
668 double dfFalseEasting, double dfFalseNorthing);
669
671 OGRErr SetVDG(double dfCenterLong, double dfFalseEasting,
672 double dfFalseNorthing);
673
675 OGRErr SetUTM(int nZone, int bNorth = TRUE);
676 int GetUTMZone(int *pbNorth = nullptr) const;
677
679 OGRErr SetWagner(int nVariation, double dfCenterLat, double dfFalseEasting,
680 double dfFalseNorthing);
681
683 OGRErr SetQSC(double dfCenterLat, double dfCenterLong);
684
686 OGRErr SetSCH(double dfPegLat, double dfPegLong, double dfPegHeading,
687 double dfPegHgt);
688
690 OGRErr
691 SetVerticalPerspective(double dfTopoOriginLat, double dfTopoOriginLon,
692 double dfTopoOriginHeight, double dfViewPointHeight,
693 double dfFalseEasting, double dfFalseNorthing);
694
696 OGRErr SetDerivedGeogCRSWithPoleRotationGRIBConvention(
697 const char *pszCRSName, double dfSouthPoleLat, double dfSouthPoleLon,
698 double dfAxisRotation);
699
701 OGRErr SetDerivedGeogCRSWithPoleRotationNetCDFCFConvention(
702 const char *pszCRSName, double dfGridNorthPoleLat,
703 double dfGridNorthPoleLon, double dfNorthPoleGridLon);
704
706 OGRErr SetStatePlane(int nZone, int bNAD83 = TRUE,
707 const char *pszOverrideUnitName = nullptr,
708 double dfOverrideUnit = 0.0);
709
711 OGRErr ImportFromESRIStatePlaneWKT(int nCode, const char *pszDatumName,
712 const char *pszUnitsName, int nPCSCode,
713 const char *pszCRSName = nullptr);
714
716 OGRErr ImportFromESRIWisconsinWKT(const char *pszPrjName,
717 double dfCentralMeridian,
718 double dfLatOfOrigin,
719 const char *pszUnitsName,
720 const char *pszCRSName = nullptr);
721
723 void UpdateCoordinateSystemFromGeogCRS();
726 static OGRSpatialReference *GetWGS84SRS();
727
730 static inline OGRSpatialReferenceH ToHandle(OGRSpatialReference *poSRS)
731 {
732 return reinterpret_cast<OGRSpatialReferenceH>(poSRS);
733 }
734
737 static inline OGRSpatialReference *FromHandle(OGRSpatialReferenceH hSRS)
738 {
739 return reinterpret_cast<OGRSpatialReference *>(hSRS);
740 }
741};
742
744 struct CPL_DLL OGRSpatialReferenceReleaser
745{
746 void operator()(OGRSpatialReference *poSRS) const
747 {
748 if (poSRS)
749 poSRS->Release();
750 }
751};
752
755/************************************************************************/
756/* OGRCoordinateTransformation */
757/* */
758/* This is really just used as a base class for a private */
759/* implementation. */
760/************************************************************************/
761
771 class CPL_DLL OGRCoordinateTransformation
772{
773 public:
774 virtual ~OGRCoordinateTransformation();
775
776 static void DestroyCT(OGRCoordinateTransformation *poCT);
777
778 // From CT_CoordinateTransformation
779
781 virtual const OGRSpatialReference *GetSourceCS() const = 0;
782
784 virtual const OGRSpatialReference *GetTargetCS() const = 0;
785
787 virtual bool GetEmitErrors() const
788 {
789 return false;
790 }
791
793 virtual void SetEmitErrors(bool /*bEmitErrors*/)
794 {
795 }
796
797 // From CT_MathTransform
798
819 int Transform(size_t nCount, double *x, double *y, double *z = nullptr,
820 int *pabSuccess = nullptr);
821
846 virtual int Transform(size_t nCount, double *x, double *y, double *z,
847 double *t, int *pabSuccess) = 0;
848
874 virtual int TransformWithErrorCodes(size_t nCount, double *x, double *y,
875 double *z, double *t,
876 int *panErrorCodes);
877
914 virtual int TransformBounds(const double xmin, const double ymin,
915 const double xmax, const double ymax,
916 double *out_xmin, double *out_ymin,
917 double *out_xmax, double *out_ymax,
918 const int densify_pts)
919 {
920 (void)xmin;
921 (void)xmax;
922 (void)ymin;
923 (void)ymax;
924 (void)densify_pts;
925 *out_xmin = HUGE_VAL;
926 *out_ymin = HUGE_VAL;
927 *out_xmax = HUGE_VAL;
928 *out_ymax = HUGE_VAL;
929 CPLError(CE_Failure, CPLE_AppDefined,
930 "TransformBounds not implemented.");
931 return false;
932 }
933
937 static inline OGRCoordinateTransformationH
938 ToHandle(OGRCoordinateTransformation *poCT)
939 {
940 return reinterpret_cast<OGRCoordinateTransformationH>(poCT);
941 }
942
946 static inline OGRCoordinateTransformation *
947 FromHandle(OGRCoordinateTransformationH hCT)
948 {
949 return reinterpret_cast<OGRCoordinateTransformation *>(hCT);
950 }
951
955 virtual OGRCoordinateTransformation *Clone() const = 0;
956
966 virtual OGRCoordinateTransformation *GetInverse() const = 0;
967
968 protected:
970 OGRCoordinateTransformation() = default;
971 OGRCoordinateTransformation(const OGRCoordinateTransformation &) = default;
972 OGRCoordinateTransformation &
973 operator=(const OGRCoordinateTransformation &) = default;
974 OGRCoordinateTransformation(OGRCoordinateTransformation &&) = default;
975 OGRCoordinateTransformation &
976 operator=(OGRCoordinateTransformation &&) = default;
978};
979
980 OGRCoordinateTransformation CPL_DLL *
981 OGRCreateCoordinateTransformation(const OGRSpatialReference *poSource,
982 const OGRSpatialReference *poTarget);
983
990 struct CPL_DLL OGRCoordinateTransformationOptions
991{
993 private:
994 friend class OGRProjCT;
995 struct Private;
996 std::unique_ptr<Private> d;
999 public:
1000 OGRCoordinateTransformationOptions();
1001 OGRCoordinateTransformationOptions(
1002 const OGRCoordinateTransformationOptions &);
1003 OGRCoordinateTransformationOptions &
1004 operator=(const OGRCoordinateTransformationOptions &);
1005 ~OGRCoordinateTransformationOptions();
1006
1007 bool SetAreaOfInterest(double dfWestLongitudeDeg, double dfSouthLatitudeDeg,
1008 double dfEastLongitudeDeg,
1009 double dfNorthLatitudeDeg);
1010 bool SetDesiredAccuracy(double dfAccuracy);
1011 bool SetBallparkAllowed(bool bAllowBallpark);
1012 bool SetOnlyBest(bool bOnlyBest);
1013
1014 bool SetCoordinateOperation(const char *pszCT, bool bReverseCT);
1016 void SetSourceCenterLong(double dfCenterLong);
1017 void SetTargetCenterLong(double dfCenterLong);
1019};
1020
1021 OGRCoordinateTransformation CPL_DLL *OGRCreateCoordinateTransformation(
1022 const OGRSpatialReference *poSource, const OGRSpatialReference *poTarget,
1023 const OGRCoordinateTransformationOptions &options);
1024
1025#endif /* ndef OGR_SPATIALREF_H_INCLUDED */
CPLString
Convenient string class based on std::string.
Definition cpl_string.h:320
OGRCoordinateTransformation
Interface for transforming between coordinate systems.
Definition ogr_spatialref.h:772
OGRCoordinateTransformation::SetEmitErrors
virtual void SetEmitErrors(bool)
Set if the transformer must emit CPLError.
Definition ogr_spatialref.h:793
OGRCoordinateTransformation::TransformWithErrorCodes
virtual int TransformWithErrorCodes(size_t nCount, double *x, double *y, double *z, double *t, int *panErrorCodes)
Transform points from source to destination space.
OGRCoordinateTransformation::GetTargetCS
virtual const OGRSpatialReference * GetTargetCS() const =0
Fetch internal target coordinate system.
OGRCoordinateTransformation::Transform
int Transform(size_t nCount, double *x, double *y, double *z=nullptr, int *pabSuccess=nullptr)
Transform points from source to destination space.
OGRCoordinateTransformation::GetInverse
virtual OGRCoordinateTransformation * GetInverse() const =0
Return a coordinate transformation that performs the inverse transformation of the current one.
OGRCoordinateTransformation::TransformBounds
virtual int TransformBounds(const double xmin, const double ymin, const double xmax, const double ymax, double *out_xmin, double *out_ymin, double *out_xmax, double *out_ymax, const int densify_pts)
Transform boundary.
Definition ogr_spatialref.h:914
OGRCoordinateTransformation::GetEmitErrors
virtual bool GetEmitErrors() const
Whether the transformer will emit CPLError.
Definition ogr_spatialref.h:787
OGRCoordinateTransformation::FromHandle
static OGRCoordinateTransformation * FromHandle(OGRCoordinateTransformationH hCT)
Convert a OGRCoordinateTransformationH to a OGRCoordinateTransformation*.
Definition ogr_spatialref.h:947
OGRCoordinateTransformation::Transform
virtual int Transform(size_t nCount, double *x, double *y, double *z, double *t, int *pabSuccess)=0
Transform points from source to destination space.
OGRCoordinateTransformation::GetSourceCS
virtual const OGRSpatialReference * GetSourceCS() const =0
Fetch internal source coordinate system.
OGRCoordinateTransformation::ToHandle
static OGRCoordinateTransformationH ToHandle(OGRCoordinateTransformation *poCT)
Convert a OGRCoordinateTransformation* to a OGRCoordinateTransformationH.
Definition ogr_spatialref.h:938
OGRCoordinateTransformation::Clone
virtual OGRCoordinateTransformation * Clone() const =0
Clone.
OGRSpatialReference
This class represents an OpenGIS Spatial Reference System, and contains methods for converting betwee...
Definition ogr_spatialref.h:152
OGRSpatialReference::ToHandle
static OGRSpatialReferenceH ToHandle(OGRSpatialReference *poSRS)
Convert a OGRSpatialReference* to a OGRSpatialReferenceH.
Definition ogr_spatialref.h:730
OGRSpatialReference::FromHandle
static OGRSpatialReference * FromHandle(OGRSpatialReferenceH hSRS)
Convert a OGRSpatialReferenceH to a OGRSpatialReference*.
Definition ogr_spatialref.h:737
OGRSpatialReference::Release
void Release()
Decrements the reference count by one, and destroy if zero.
Definition ogrspatialreference.cpp:1156
OGR_SRSNode
Objects of this class are used to represent value nodes in the parsed representation of the WKT SRS f...
Definition ogr_spatialref.h:50
OGR_SRSNode::GetChildCount
int GetChildCount() const
Get number of children nodes.
Definition ogr_spatialref.h:74
OGR_SRSNode::GetValue
const char * GetValue() const
Fetch value string for this node.
Definition ogr_spatialref.h:92
OGR_SRSNode::IsLeafNode
int IsLeafNode() const
Return whether this is a leaf node.
Definition ogr_spatialref.h:69
CPLE_AppDefined
#define CPLE_AppDefined
Application defined error.
Definition cpl_error.h:85
CPL_DISALLOW_COPY_ASSIGN
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition cpl_port.h:936
CSLConstList
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1087
cpl_string.h
Various convenience functions for working with strings and string lists.
OGRCoordinateTransformationH
void * OGRCoordinateTransformationH
Opaque type for a coordinate transformation object.
Definition gdal_fwd.h:197
OGRSpatialReferenceH
void * OGRSpatialReferenceH
Opaque type for a spatial reference system.
Definition gdal_fwd.h:195
OGRErr
int OGRErr
Type for a OGR error.
Definition ogr_core.h:370
USGS_ANGLE_PACKEDDMS
#define USGS_ANGLE_PACKEDDMS
Angle is in packed degree minute second.
Definition ogr_spatialref.h:231
OGRCreateCoordinateTransformation
OGRCoordinateTransformation * OGRCreateCoordinateTransformation(const OGRSpatialReference *poSource, const OGRSpatialReference *poTarget)
Create transformation object.
Definition ogrct.cpp:1027
ogr_srs_api.h
C spatial reference system services and defines.
OSRAxisMappingStrategy
OSRAxisMappingStrategy
Data axis to CRS axis mapping strategy.
Definition ogr_srs_api.h:637
OGRAxisOrientation
OGRAxisOrientation
Axis orientations (corresponds to CS_AxisOrientationEnum).
Definition ogr_srs_api.h:35
OGRCoordinateTransformationOptions
Context for coordinate transformation.
Definition ogr_spatialref.h:991
OGR_SRSNode::Listener
Listener that is notified of modification to nodes.
Definition ogr_spatialref.h:54
OGR_SRSNode::Listener::notifyChange
virtual void notifyChange(OGR_SRSNode *)=0
Method triggered when a node is modified.