1/****************************************************************************
2**
3** Qt adaptation of geosimplify.js, https://github.com/mapbox/geosimplify-js, (c) 2017, Mapbox
4**
5** Copyright (C) 2020 Paolo Angelelli <paolo.angelelli@gmail.com>
6** Copyright (C) 2020 The Qt Company Ltd.
7** Contact: http://www.qt.io/licensing/
8**
9** This file is part of the QtLocation module of the Qt Toolkit.
10**
11** $QT_BEGIN_LICENSE:LGPL3$
12** Commercial License Usage
13** Licensees holding valid commercial Qt licenses may use this file in
14** accordance with the commercial license agreement provided with the
15** Software or, alternatively, in accordance with the terms contained in
16** a written agreement between you and The Qt Company. For licensing terms
17** and conditions see http://www.qt.io/terms-conditions. For further
18** information use the contact form at http://www.qt.io/contact-us.
19**
20** GNU Lesser General Public License Usage
21** Alternatively, this file may be used under the terms of the GNU Lesser
22** General Public License version 3 as published by the Free Software
23** Foundation and appearing in the file LICENSE.LGPLv3 included in the
24** packaging of this file. Please review the following information to
25** ensure the GNU Lesser General Public License version 3 requirements
26** will be met: https://www.gnu.org/licenses/lgpl.html.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 2.0 or later as published by the Free
31** Software Foundation and appearing in the file LICENSE.GPL included in
32** the packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 2.0 requirements will be
34** met: http://www.gnu.org/licenses/gpl-2.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QGEOSIMPLIFY_P_H
41#define QGEOSIMPLIFY_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QtPositioning/QGeoCoordinate>
55#include <QtPositioning/private/qdoublevector2d_p.h>
56#include <QtPositioning/private/qwebmercator_p.h>
57
58QT_BEGIN_NAMESPACE
59
60class QGeoSimplify {
61protected:
62 // Distance between two points in metres
63 static double getDist(const QGeoCoordinate &p1, const QGeoCoordinate &p2);
64
65 // p, a and b are intended as "unwrapped" around the left bound
66 static QDoubleVector2D closestPoint( const QDoubleVector2D &p,
67 const QDoubleVector2D &a,
68 const QDoubleVector2D &b);
69
70 static QGeoCoordinate closestPoint( const QGeoCoordinate &pc,
71 const QGeoCoordinate &ac,
72 const QGeoCoordinate &bc,
73 const double &leftBound);
74
75 // Distance from a point to a segment (line between two points) in metres
76 static double getSegDist(const QGeoCoordinate &pc,
77 const QGeoCoordinate &ac,
78 const QGeoCoordinate &bc,
79 const double &leftBound);
80
81 // doublevectors Intended as wrapped
82 static double getSegDist(const QDoubleVector2D &p,
83 const QDoubleVector2D &a,
84 const QDoubleVector2D &b,
85 const double &leftBound);
86
87 static void simplifyDPStep(const QList<QGeoCoordinate> &points,
88 const double &leftBound,
89 int first,
90 int last,
91 double offsetTolerance,
92 QList<QGeoCoordinate> &simplified);
93
94 static double getDist(QDoubleVector2D a,
95 QDoubleVector2D b,
96 const double &leftBound);
97
98 static void simplifyDPStep(const QList<QDoubleVector2D> &points,
99 const double &leftBound,
100 int first,
101 int last,
102 double offsetTolerance,
103 QList<QDoubleVector2D> &simplified);
104
105 static void simplifyDPStepZL(const QList<QDoubleVector2D> &points,
106 const double &leftBound,
107 int first,
108 int last,
109 int zoomLevel,
110 QList<QDoubleVector2D> &simplified);
111
112 // simplification using Ramer-Douglas-Peucker algorithm
113 static QList<QGeoCoordinate> simplifyDouglasPeucker(const QList<QGeoCoordinate> &points,
114 const double &leftBound,
115 double offsetTolerance);
116
117 static QList<QDoubleVector2D> simplifyDouglasPeucker(const QList<QDoubleVector2D> &points,
118 const double &leftBound,
119 double offsetTolerance);
120
121 static QList<QDoubleVector2D> simplifyDouglasPeuckerZL(const QList<QDoubleVector2D> &points,
122 const double &leftBound,
123 int zoomLevel);
124
125public:
126 /*
127 offsetTolerance - how far outside the straight line a point
128 needs to be for it to be "kept"
129 */
130 static QList<QGeoCoordinate> geoSimplify(const QList<QGeoCoordinate> &points,
131 const double &leftBound,
132 double offsetTolerance); // in meters
133
134 static QList<QDoubleVector2D> geoSimplify(const QList<QDoubleVector2D> &points,
135 const double &leftBound,
136 double offsetTolerance); // in meters
137
138 // This overload tries to be adaptive in the offsetTolerance across latitudes,
139 // and return a simplification adequate for the given zoomLevel.
140 static QList<QDoubleVector2D> geoSimplifyZL(const QList<QDoubleVector2D> &points,
141 const double &leftBound,
142 int zoomLevel); // in meters
143};
144
145QT_END_NAMESPACE
146
147#endif // QGEOSIMPLIFY_P_H
148

source code of qtlocation/src/location/declarativemaps/qgeosimplify_p.h