Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qgeoprojection_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QGEOPROJECTION_H
6#define QGEOPROJECTION_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QMatrix4x4>
20#include <QTransform>
21
22#include <QtLocation/private/qlocationglobal_p.h>
23#include <QtLocation/private/qgeocameradata_p.h>
24#include <QtPositioning/private/qdoublematrix4x4_p.h>
25
26QT_BEGIN_NAMESPACE
27
28class QGeoShape;
29class QGeoRectangle;
30
31class Q_LOCATION_EXPORT QGeoProjection
32{
33public:
34 enum ProjectionGroup {
35 ProjectionOther,
36 ProjectionCylindrical,
37 ProjectionPseudocylindrical,
38 ProjectionAzimuthal,
39 ProjectionPseudoazimuthal,
40 ProjectionConic,
41 ProjectionPseudoconic
42 //Polyhedral
43 //Retroazimuthal
44 };
45
46 enum Datum {
47 DatumUnknown,
48 DatumWGS84,
49 DatumSphere
50 };
51
52 enum ProjectionType {
53 ProjectionUnknown,
54 ProjectionGeneralPerspective,
55 ProjectionWebMercator
56 };
57
58 QGeoProjection();
59 virtual ~QGeoProjection();
60
61 virtual void setVisibleArea(const QRectF &visibleArea) = 0;
62 virtual void setViewportSize(const QSize &size) = 0;
63 virtual void setCameraData(const QGeoCameraData &cameraData, bool force = true) = 0;
64 virtual QGeoCameraData cameraData() const = 0;
65
66 // returns the minimum zoom at the current viewport size
67 virtual double minimumZoom() const = 0;
68 virtual double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const = 0;
69 virtual double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const = 0;
70
71 virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0;
72 virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0;
73
74 virtual ProjectionGroup projectionGroup() const = 0;
75 virtual Datum datum() const = 0;
76 virtual ProjectionType projectionType() const = 0;
77
78 // Returns the new map center after anchoring coordinate to anchorPoint on the screen
79 virtual QGeoCoordinate anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint) const;
80
81 virtual QGeoShape visibleRegion() const;
82 virtual bool setBearing(qreal bearing, const QGeoCoordinate &coordinate);
83 virtual QMatrix4x4 projectionTransformation() const = 0; // This brings a mercator coord into the correct viewport coordinate.
84 virtual QMatrix4x4 projectionTransformation_centered() const = 0; // Same as projectionTransformation, but the center of the camera is around 0,0.
85 // Requires subsequent shifting of the geometry to fit such camera.
86 virtual const QMatrix4x4 &qsgTransform() const = 0;
87 virtual QDoubleVector3D centerMercator() const = 0;
88
89 void setItemToWindowTransform(const QTransform &itemToWindowTransform);
90 virtual QTransform itemToWindowTransform() const;
91
92 QTransform m_itemToWindowTransform;
93 mutable bool m_qsgTransformDirty = true;
94};
95
96class Q_LOCATION_EXPORT QGeoProjectionWebMercator : public QGeoProjection
97{
98public:
99 QGeoProjectionWebMercator();
100 ~QGeoProjectionWebMercator();
101
102 // From QGeoProjection
103 double minimumZoom() const override;
104 QMatrix4x4 projectionTransformation() const override;
105 QMatrix4x4 projectionTransformation_centered() const override;
106 const QMatrix4x4 &qsgTransform() const override;
107 QDoubleVector3D centerMercator() const override;
108
109 double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const override;
110 double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const override;
111
112 void setVisibleArea(const QRectF &visibleArea) override;
113 void setViewportSize(const QSize &size) override;
114 void setCameraData(const QGeoCameraData &cameraData, bool force = true) override;
115 QGeoCameraData cameraData() const override;
116
117 QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const override;
118 QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const override;
119
120 QGeoProjection::ProjectionGroup projectionGroup() const override;
121 QGeoProjection::Datum datum() const override;
122 QGeoProjection::ProjectionType projectionType() const override;
123
124 QGeoCoordinate anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint) const override;
125 bool setBearing(qreal bearing, const QGeoCoordinate &coordinate) override;
126
127 QGeoShape visibleRegion() const override;
128
129 // Specific to QGeoProjectionWebMercator
130 double mapWidth() const; // The size of the underlying map, at the current zoom level.
131 double mapHeight() const;
132
133 QDoubleVector2D geoToMapProjection(const QGeoCoordinate &coordinate) const;
134 QGeoCoordinate mapProjectionToGeo(const QDoubleVector2D &projection) const;
135
136 int projectionWrapFactor(const QDoubleVector2D &projection) const;
137 QDoubleVector2D wrapMapProjection(const QDoubleVector2D &projection) const;
138 QDoubleVector2D unwrapMapProjection(const QDoubleVector2D &wrappedProjection) const;
139
140 QDoubleVector2D wrappedMapProjectionToItemPosition(const QDoubleVector2D &wrappedProjection) const;
141 QDoubleVector2D itemPositionToWrappedMapProjection(const QDoubleVector2D &itemPosition) const;
142
143 QDoubleVector2D geoToWrappedMapProjection(const QGeoCoordinate &coordinate) const;
144 QGeoCoordinate wrappedMapProjectionToGeo(const QDoubleVector2D &wrappedProjection) const;
145 QMatrix4x4 quickItemTransformation(const QGeoCoordinate &coordinate, const QPointF &anchorPoint, qreal zoomLevel) const;
146
147 bool isProjectable(const QDoubleVector2D &wrappedProjection) const;
148 QList<QDoubleVector2D> visibleGeometry() const;
149 QList<QDoubleVector2D> visibleGeometryExpanded() const;
150 QList<QDoubleVector2D> projectableGeometry() const;
151
152 inline QDoubleVector2D viewportToWrappedMapProjection(const QDoubleVector2D &itemPosition) const;
153 inline QDoubleVector2D viewportToWrappedMapProjection(const QDoubleVector2D &itemPosition, double &s) const;
154
155 QPair<QGeoCoordinate, qreal> fitViewportToGeoRectangle(const QGeoRectangle &rectangle,
156 const QMargins &margins) const;
157
158private:
159 void setupCamera();
160 void updateVisibleRegion();
161
162public:
163 struct Line2D
164 {
165 Line2D();
166 Line2D(const QDoubleVector2D &linePoint, const QDoubleVector2D &lineDirection);
167
168 bool isValid() const;
169
170 QDoubleVector2D m_point;
171 QDoubleVector2D m_direction;
172 };
173
174 struct Plane
175 {
176 Plane();
177 Plane(const QDoubleVector3D &planePoint, const QDoubleVector3D &planeNormal);
178
179 QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection) const;
180 inline QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection, double &s) const;
181 Line2D planeXYIntersection() const;
182 bool isValid() const;
183
184 QDoubleVector3D m_point;
185 QDoubleVector3D m_normal;
186 };
187
188#ifdef QT_LOCATION_DEBUG
189public:
190#else
191protected:
192#endif
193 QGeoCameraData m_cameraData;
194 double m_mapEdgeSize;
195 double m_minimumZoom;
196 // mercator to camera transform for coordinates (not tiles!)
197 double m_cameraCenterXMercator;
198 double m_cameraCenterYMercator;
199
200 // cameraToScreen transform
201 double m_viewportWidth; // in pixels
202 double m_viewportHeight; // in pixels
203 double m_1_viewportWidth;
204 double m_1_viewportHeight;
205
206 QDoubleMatrix4x4 m_cameraMatrix;
207 QDoubleMatrix4x4 m_cameraMatrix0;
208 QDoubleMatrix4x4 m_transformation;
209 QDoubleMatrix4x4 m_transformation0;
210 QDoubleMatrix4x4 m_quickItemTransformation;
211 QDoubleVector3D m_eye;
212 QDoubleVector3D m_up;
213 QDoubleVector3D m_center;
214 QDoubleVector3D m_view;
215 QDoubleVector3D m_viewNormalized;
216 QDoubleVector3D m_side;
217 QDoubleVector3D m_centerNearPlane;
218 double m_sideLengthPixels; // map edge size at integer zoom level
219 double m_aperture;
220 double m_nearPlane;
221 double m_farPlane;
222 double m_halfWidth;
223 double m_halfHeight;
224 double m_minimumUnprojectableY;
225 double m_verticalEstateToSkip;
226
227 // For the clipping region
228 QDoubleVector3D m_centerMercator;
229 QDoubleVector3D m_eyeMercator;
230 QDoubleVector3D m_eyeMercator0;
231 QDoubleVector3D m_viewMercator;
232 QDoubleVector3D m_upMercator;
233 QDoubleVector3D m_sideMercator;
234 QDoubleVector3D m_centerNearPlaneMercator;
235 double m_nearPlaneMercator;
236 Line2D m_nearPlaneMapIntersection;
237
238 QList<QDoubleVector2D> m_visibleRegion;
239 QList<QDoubleVector2D> m_visibleRegionExpanded;
240 QList<QDoubleVector2D> m_projectableRegion;
241 bool m_visibleRegionDirty;
242
243 mutable QMatrix4x4 m_qsgTransform;
244 QRectF m_visibleArea;
245
246 Q_DISABLE_COPY(QGeoProjectionWebMercator)
247};
248
249QT_END_NAMESPACE
250
251#endif // QGEOPROJECTION_H
static QPointF centerOffset(const QSizeF &screenSize, const QRectF &visibleArea)
static QPointF marginsOffset(const QSizeF &screenSize, const QRectF &visibleArea)
static QMatrix4x4 toMatrix4x4(const QDoubleMatrix4x4 &m)