QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsonlineterraingenerator.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsonlineterraingenerator.cpp
3 --------------------------------------
4 Date : March 2019
5 Copyright : (C) 2019 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
19
20
22
24
25QgsChunkLoader *QgsOnlineTerrainGenerator::createChunkLoader( QgsChunkNode *node ) const
26{
27 return new QgsDemTerrainTileLoader( mTerrain, node, const_cast<QgsOnlineTerrainGenerator *>( this ) );
28}
29
31{
33 cloned->setTerrain( mTerrain );
34 cloned->mCrs = mCrs;
35 cloned->mExtent = mExtent;
36 cloned->mResolution = mResolution;
37 cloned->mSkirtHeight = mSkirtHeight;
38 cloned->updateGenerator();
39 return cloned;
40}
41
43{
45}
46
48{
49 return mTerrainTilingScheme.tileToExtent( 0, 0, 0 );
50}
51
52float QgsOnlineTerrainGenerator::heightAt( double x, double y, const Qgs3DMapSettings &map ) const
53{
54 Q_UNUSED( map )
55 if ( mHeightMapGenerator )
56 return mHeightMapGenerator->heightAt( x, y );
57 else
58 return 0;
59}
60
61void QgsOnlineTerrainGenerator::writeXml( QDomElement &elem ) const
62{
63 const QgsRectangle r = mExtent;
64 QDomElement elemExtent = elem.ownerDocument().createElement( QStringLiteral( "extent" ) );
65 elemExtent.setAttribute( QStringLiteral( "xmin" ), QString::number( r.xMinimum() ) );
66 elemExtent.setAttribute( QStringLiteral( "xmax" ), QString::number( r.xMaximum() ) );
67 elemExtent.setAttribute( QStringLiteral( "ymin" ), QString::number( r.yMinimum() ) );
68 elemExtent.setAttribute( QStringLiteral( "ymax" ), QString::number( r.yMaximum() ) );
69 elem.appendChild( elemExtent );
70
71 elem.setAttribute( QStringLiteral( "resolution" ), mResolution );
72 elem.setAttribute( QStringLiteral( "skirt-height" ), mSkirtHeight );
73
74 // crs is not read/written - it should be the same as destination crs of the map
75}
76
77void QgsOnlineTerrainGenerator::readXml( const QDomElement &elem )
78{
79 mResolution = elem.attribute( QStringLiteral( "resolution" ) ).toInt();
80 mSkirtHeight = elem.attribute( QStringLiteral( "skirt-height" ) ).toFloat();
81
82 const QDomElement elemExtent = elem.firstChildElement( QStringLiteral( "extent" ) );
83 const double xmin = elemExtent.attribute( QStringLiteral( "xmin" ) ).toDouble();
84 const double xmax = elemExtent.attribute( QStringLiteral( "xmax" ) ).toDouble();
85 const double ymin = elemExtent.attribute( QStringLiteral( "ymin" ) ).toDouble();
86 const double ymax = elemExtent.attribute( QStringLiteral( "ymax" ) ).toDouble();
87
88 setExtent( QgsRectangle( xmin, ymin, xmax, ymax ) );
89
90 // crs is not read/written - it should be the same as destination crs of the map
91}
92
94{
95 mCrs = crs;
96 mTransformContext = context;
97 updateGenerator();
98}
99
101{
102 if ( mExtent == extent )
103 return;
104
105 mExtent = extent;
106 updateGenerator();
107
108 emit extentChanged();
109}
110
111void QgsOnlineTerrainGenerator::updateGenerator()
112{
113 if ( mExtent.isNull() )
114 {
116 }
117 else
118 {
119 // the real extent will be a square where the given extent fully fits
120 mTerrainTilingScheme = QgsTilingScheme( mExtent, mCrs );
121 }
122
123 mHeightMapGenerator.reset( new QgsDemHeightMapGenerator( nullptr, mTerrainTilingScheme, mResolution, mTransformContext ) );
124}
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
void setExtent(const QgsRectangle &extent) override
sets the extent of the terrain in terrain's CRS
void setCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets CRS of the terrain.
QgsTerrainGenerator * clone() const override SIP_FACTORY
Makes a copy of the current instance.
~QgsOnlineTerrainGenerator() override
QgsOnlineTerrainGenerator()
Constructor for QgsOnlineTerrainGenerator.
void writeXml(QDomElement &elem) const override
Write terrain generator's configuration to XML.
QgsRectangle extent() const override
extent of the terrain in terrain's CRS
float heightAt(double x, double y, const Qgs3DMapSettings &map) const override
Returns height at (x,y) in terrain's CRS.
Type type() const override
What texture generator implementation is this.
QgsCoordinateReferenceSystem crs() const
Returns CRS of the terrain.
void readXml(const QDomElement &elem) override
Read terrain generator's configuration from XML.
QgsChunkLoader * createChunkLoader(QgsChunkNode *node) const override SIP_FACTORY
A rectangle specified with double values.
Definition: qgsrectangle.h:42
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:193
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:183
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:188
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:198
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
Definition: qgsrectangle.h:479
Type
Enumeration of the available terrain generators.
@ Online
Terrain is built from downloaded tiles with digital elevation model.
QgsTilingScheme mTerrainTilingScheme
Tiling scheme of the terrain.
void extentChanged()
Emitted when the terrain extent has changed.
QgsTerrainEntity * mTerrain
void setTerrain(QgsTerrainEntity *t)
Sets terrain entity for the generator (does not transfer ownership)
QgsRectangle tileToExtent(int x, int y, int z) const
Returns map coordinates of the extent of a tile.
const QgsCoordinateReferenceSystem & crs