digiKam
Loading...
Searching...
No Matches
geodetictools.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2008-05-05
7 * Description : Geodetic tools
8 *
9 * SPDX-FileCopyrightText: 2008-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2015-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// C++ includes
19
20#include <cmath>
21
22// Qt includes
23
24#include <QString>
25#include <QPointF>
26
27// Local includes
28
29#include "digikam_export.h"
30
31namespace Digikam
32{
33
34namespace Coordinates
35{
36
38
39inline double toRadians(double deg)
40{
41 return (deg * M_PI / 180.0);
42}
43
44inline double toRadiansFactor()
45{
46 return (M_PI / 180.0);
47}
48
49inline double toDegrees(double rad)
50{
51 return (rad * 180.0 / M_PI);
52}
53
54inline double toDegreesFactor()
55{
56 return (180.0 / M_PI);
57}
58
59} // namespace Coordinates
60
61// ------------------------------------------------------------------------------------------------
62
70class DIGIKAM_EXPORT Ellipsoid
71{
72
73public:
74
79 static Ellipsoid WGS84();
80
84 static Ellipsoid GRS80();
85
89 static Ellipsoid INTERNATIONAL_1924();
90
94 static Ellipsoid CLARKE_1866();
95
101 static Ellipsoid SPHERE();
102
110 static Ellipsoid createEllipsoid(const QString& name,
111 double semiMajorAxis,
112 double semiMinorAxis);
113
122 static Ellipsoid createFlattenedSphere(const QString& name,
123 double semiMajorAxis,
124 double inverseFlattening);
125
132 double semiMajorAxis() const;
133
140 double semiMinorAxis() const;
141
147 double eccentricity() const;
148
161 double inverseFlattening() const;
162
173 bool isIvfDefinitive() const;
174
182 bool isSphere() const;
183
197 double orthodromicDistance(double x1, double y1, double x2, double y2);
198
205 double radiusOfCurvature(double latitude);
206
207protected:
208
222 Ellipsoid(const QString& name,
223 double semiMajorAxis,
224 double semiMinorAxis,
225 double inverseFlattening,
226 bool ivfDefinitive);
227 Ellipsoid(const QString& name,
228 double radius,
229 bool ivfDefinitive);
230
231protected:
232
233 QString name;
234
239 double m_semiMajorAxis = 0.0;
240
245 double m_semiMinorAxis = 0.0;
246
253 double m_inverseFlattening = 0.0;
254
260 bool m_ivfDefinitive = false;
261
262 bool m_isSphere = false;
263};
264
265// ------------------------------------------------------------------------------------------------
266
267class DIGIKAM_EXPORT GeodeticCalculator
268{
293public:
294
295 explicit GeodeticCalculator(const Ellipsoid& e = Ellipsoid::WGS84());
296
300 Ellipsoid ellipsoid() const;
301
311 void setStartingGeographicPoint(double longitude, double latitude);
312
323 void setDestinationGeographicPoint(double longitude, double latitude);
324
336 bool destinationGeographicPoint(double* longitude, double* latitude);
337 QPointF destinationGeographicPoint();
338
348 void setDirection(double azimuth, double distance);
349
360 double azimuth();
361
373 double orthodromicDistance();
374
380 bool checkOrthodromicDistance();
381
386 bool computeDestinationPoint();
387
396 double meridianArcLength(double latitude1, double latitude2);
397
406 double meridianArcLengthRadians(double P1, double P2);
407
413 bool computeDirection();
414
415protected:
416
417 double castToAngleRange(const double alpha);
418
426 bool checkLatitude(double* latitude);
427
435 bool checkLongitude(double* longitude);
436
444 bool checkAzimuth(double* azimuth);
445
452 bool checkOrthodromicDistance(const double distance);
453
454protected:
455
460 double m_TOLERANCE_0 = 5.0e-15;
461 double m_TOLERANCE_1 = 5.0e-14;
462 double m_TOLERANCE_2 = 5.0e-13;
463 double m_TOLERANCE_3 = 7.0e-3;
464
468 double m_TOLERANCE_CHECK = 1E-8;
469
474
478 double m_semiMajorAxis = 0.0;
479
483 double m_semiMinorAxis = 0.0;
484
488 double m_eccentricitySquared = 0.0;
489
493 double m_maxOrthodromicDistance = 0.0;
494
498 double m_A = 0.0;
499 double m_B = 0.0;
500 double m_C = 0.0;
501 double m_D = 0.0;
502 double m_E = 0.0;
503 double m_F = 0.0;
504
512 double fo = 0.0;
513 double f = 0.0;
514 double f2 = 0.0;
515 double f3 = 0.0;
516 double f4 = 0.0;
517
521 double T1 = 1.0;
522 double T2 = 0.0;
523 double T4 = 0.0;
524 double T6 = 0.0;
525
529 double a01 = 0.0;
530 double a02 = 0.0;
531 double a03 = 0.0;
532 double a21 = 0.0;
533 double a22 = 0.0;
534 double a23 = 0.0;
535 double a42 = 0.0;
536 double a43 = 0.0;
537 double a63 = 0.0;
538
543 double m_lat1 = 0.0;
544 double m_long1 = 0.0;
545
550 double m_lat2 = 0.0;
551 double m_long2 = 0.0;
552
558 double m_distance = 0.0;
559 double m_azimuth = 0.0;
560
565 bool m_destinationValid = false;
566
571 bool m_directionValid = false;
572};
573
574} // namespace Digikam
Definition geodetictools.h:71
QString name
Definition geodetictools.h:233
Definition geodetictools.h:268
Ellipsoid m_ellipsoid
Definition geodetictools.h:473
double toDegrees(double rad)
Definition geodetictools.h:49
double toRadians(double deg)
Converting between radians and degrees.
Definition geodetictools.h:39
double toDegreesFactor()
Definition geodetictools.h:54
double toRadiansFactor()
Definition geodetictools.h:44
Definition datefolderview.cpp:34