Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
4#ifndef QGEOPROJECTION_H
5#define QGEOPROJECTION_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QMatrix4x4>
19#include <QTransform>
20
21#include <QtLocation/private/qlocationglobal_p.h>
22#include <QtLocation/private/qgeocameradata_p.h>
23#include <QtPositioning/private/qdoublematrix4x4_p.h>
24
26
27class QGeoShape;
28class QGeoRectangle;
29
30class Q_LOCATION_EXPORT QGeoProjection
31{
32public:
44
45 enum Datum {
48 DatumSphere
49 };
50
56
58 virtual ~QGeoProjection();
59
60 virtual void setVisibleArea(const QRectF &visibleArea) = 0;
61 virtual void setViewportSize(const QSize &size) = 0;
62 virtual void setCameraData(const QGeoCameraData &cameraData, bool force = true) = 0;
63 virtual QGeoCameraData cameraData() const = 0;
64
65 // returns the minimum zoom at the current viewport size
66 virtual double minimumZoom() const = 0;
67 virtual double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const = 0;
68 virtual double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const = 0;
69
70 virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0;
71 virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0;
72
73 virtual ProjectionGroup projectionGroup() const = 0;
74 virtual Datum datum() const = 0;
75 virtual ProjectionType projectionType() const = 0;
76
77 // Returns the new map center after anchoring coordinate to anchorPoint on the screen
78 virtual QGeoCoordinate anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint) const;
79
80 virtual QGeoShape visibleRegion() const;
81 virtual bool setBearing(qreal bearing, const QGeoCoordinate &coordinate);
82 virtual QMatrix4x4 projectionTransformation() const = 0; // This brings a mercator coord into the correct viewport coordinate.
83 virtual QMatrix4x4 projectionTransformation_centered() const = 0; // Same as projectionTransformation, but the center of the camera is around 0,0.
84 // Requires subsequent shifting of the geometry to fit such camera.
85 virtual const QMatrix4x4 &qsgTransform() const = 0;
86 virtual QDoubleVector3D centerMercator() const = 0;
87
88 void setItemToWindowTransform(const QTransform &itemToWindowTransform);
89 virtual QTransform itemToWindowTransform() const;
90
92 mutable bool m_qsgTransformDirty = true;
93};
94
95class Q_LOCATION_EXPORT QGeoProjectionWebMercator : public QGeoProjection
96{
97public:
100
101 // From QGeoProjection
102 double minimumZoom() const override;
103 QMatrix4x4 projectionTransformation() const override;
104 QMatrix4x4 projectionTransformation_centered() const override;
105 const QMatrix4x4 &qsgTransform() const override;
106 QDoubleVector3D centerMercator() const override;
107
108 double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const override;
109 double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const override;
110
111 void setVisibleArea(const QRectF &visibleArea) override;
112 void setViewportSize(const QSize &size) override;
113 void setCameraData(const QGeoCameraData &cameraData, bool force = true) override;
114 QGeoCameraData cameraData() const override;
115
116 QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const override;
117 QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const override;
118
119 QGeoProjection::ProjectionGroup projectionGroup() const override;
120 QGeoProjection::Datum datum() const override;
121 QGeoProjection::ProjectionType projectionType() const override;
122
123 QGeoCoordinate anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint) const override;
124 bool setBearing(qreal bearing, const QGeoCoordinate &coordinate) override;
125
126 QGeoShape visibleRegion() const override;
127
128 // Specific to QGeoProjectionWebMercator
129 double mapWidth() const; // The size of the underlying map, at the current zoom level.
130 double mapHeight() const;
131
132 QDoubleVector2D geoToMapProjection(const QGeoCoordinate &coordinate) const;
133 QGeoCoordinate mapProjectionToGeo(const QDoubleVector2D &projection) const;
134
135 int projectionWrapFactor(const QDoubleVector2D &projection) const;
136 QDoubleVector2D wrapMapProjection(const QDoubleVector2D &projection) const;
137 QDoubleVector2D unwrapMapProjection(const QDoubleVector2D &wrappedProjection) const;
138
139 QDoubleVector2D wrappedMapProjectionToItemPosition(const QDoubleVector2D &wrappedProjection) const;
140 QDoubleVector2D itemPositionToWrappedMapProjection(const QDoubleVector2D &itemPosition) const;
141
142 QDoubleVector2D geoToWrappedMapProjection(const QGeoCoordinate &coordinate) const;
143 QGeoCoordinate wrappedMapProjectionToGeo(const QDoubleVector2D &wrappedProjection) const;
144 QMatrix4x4 quickItemTransformation(const QGeoCoordinate &coordinate, const QPointF &anchorPoint, qreal zoomLevel) const;
145
146 bool isProjectable(const QDoubleVector2D &wrappedProjection) const;
147 QList<QDoubleVector2D> visibleGeometry() const;
148 QList<QDoubleVector2D> visibleGeometryExpanded() const;
149 QList<QDoubleVector2D> projectableGeometry() const;
150
151 inline QDoubleVector2D viewportToWrappedMapProjection(const QDoubleVector2D &itemPosition) const;
152 inline QDoubleVector2D viewportToWrappedMapProjection(const QDoubleVector2D &itemPosition, double &s) const;
153
154 QPair<QGeoCoordinate, qreal> fitViewportToGeoRectangle(const QGeoRectangle &rectangle,
155 const QMargins &margins) const;
156
157private:
158 void setupCamera();
159 void updateVisibleRegion();
160
161public:
162 struct Line2D
163 {
164 Line2D();
165 Line2D(const QDoubleVector2D &linePoint, const QDoubleVector2D &lineDirection);
166
167 bool isValid() const;
168
171 };
172
173 struct Plane
174 {
175 Plane();
176 Plane(const QDoubleVector3D &planePoint, const QDoubleVector3D &planeNormal);
177
178 QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection) const;
179 inline QDoubleVector3D lineIntersection(const QDoubleVector3D &linePoint, const QDoubleVector3D &lineDirection, double &s) const;
180 Line2D planeXYIntersection() const;
181 bool isValid() const;
182
185 };
186
187#ifdef QT_LOCATION_DEBUG
188public:
189#else
190protected:
191#endif
195 // mercator to camera transform for coordinates (not tiles!)
198
199 // cameraToScreen transform
200 double m_viewportWidth; // in pixels
201 double m_viewportHeight; // in pixels
204
217 double m_sideLengthPixels; // map edge size at integer zoom level
225
226 // For the clipping region
236
237 QList<QDoubleVector2D> m_visibleRegion;
238 QList<QDoubleVector2D> m_visibleRegionExpanded;
239 QList<QDoubleVector2D> m_projectableRegion;
241
244
245 Q_DISABLE_COPY(QGeoProjectionWebMercator)
246};
247
249
250#endif // QGEOPROJECTION_H
\inmodule QtPositioning
QList< QDoubleVector2D > m_visibleRegionExpanded
QDoubleVector3D m_centerNearPlane
QList< QDoubleVector2D > m_visibleRegion
QDoubleMatrix4x4 m_transformation0
QDoubleVector3D m_centerNearPlaneMercator
QDoubleMatrix4x4 m_transformation
QDoubleMatrix4x4 m_cameraMatrix
QDoubleMatrix4x4 m_cameraMatrix0
QList< QDoubleVector2D > m_projectableRegion
QDoubleMatrix4x4 m_quickItemTransformation
virtual QGeoCameraData cameraData() const =0
virtual ProjectionGroup projectionGroup() const =0
virtual QMatrix4x4 projectionTransformation() const =0
virtual const QMatrix4x4 & qsgTransform() const =0
virtual double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const =0
virtual ProjectionType projectionType() const =0
virtual void setCameraData(const QGeoCameraData &cameraData, bool force=true)=0
virtual void setVisibleArea(const QRectF &visibleArea)=0
virtual void setViewportSize(const QSize &size)=0
virtual double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const =0
virtual double minimumZoom() const =0
virtual Datum datum() const =0
QTransform m_itemToWindowTransform
virtual QMatrix4x4 projectionTransformation_centered() const =0
virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport=true) const =0
virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport=true) const =0
virtual QDoubleVector3D centerMercator() const =0
\inmodule QtPositioning
\inmodule QtPositioning
Definition qgeoshape.h:17
\inmodule QtCore
Definition qmargins.h:24
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
\inmodule QtCore\reentrant
Definition qpoint.h:217
\inmodule QtCore\reentrant
Definition qrect.h:484
\inmodule QtCore
Definition qsize.h:25
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
Combined button and popup list for selecting options.
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLdouble s
[6]
Definition qopenglext.h:235
double qreal
Definition qtypes.h:187