QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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
109void QgsOnlineTerrainGenerator::updateGenerator()
110{
111 if ( mExtent.isNull() )
112 {
114 }
115 else
116 {
117 // the real extent will be a square where the given extent fully fits
119 }
120
121 mHeightMapGenerator.reset( new QgsDemHeightMapGenerator( nullptr, mTerrainTilingScheme, mResolution, mTransformContext ) );
122}
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 rootChunkExtent() const override
extent of the terrain's root chunk 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 xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:201
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:211
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:196
bool isNull() const
Test if the rectangle is null (holding no spatial information).
Definition: qgsrectangle.h:505
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:206
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.
virtual QgsRectangle extent() const
extent of the terrain in terrain's CRS, might be non-square and smaller than rootChunkExtent()
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