QGIS API Documentation 3.41.0-Master (3440c17df1d)
Loading...
Searching...
No Matches
qgsdemterraingenerator.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdemterraingenerator.cpp
3 --------------------------------------
4 Date : July 2017
5 Copyright : (C) 2017 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#include "moc_qgsdemterraingenerator.cpp"
18
20
21#include "qgs3dutils.h"
22#include "qgsrasterlayer.h"
24
26{
27 delete mHeightMapGenerator;
28}
29
31{
32 mLayer = QgsMapLayerRef( layer );
33 updateGenerator();
34}
35
37{
38 return qobject_cast<QgsRasterLayer *>( mLayer.layer.data() );
39}
40
42{
43 mCrs = crs;
44 mTransformContext = context;
45 updateGenerator();
46}
47
49{
51 cloned->setTerrain( mTerrain );
52 cloned->mCrs = mCrs;
53 cloned->mLayer = mLayer;
54 cloned->mResolution = mResolution;
55 cloned->mSkirtHeight = mSkirtHeight;
56 cloned->mExtent = mExtent;
57 cloned->updateGenerator();
58 return cloned;
59}
60
65
70
71float QgsDemTerrainGenerator::heightAt( double x, double y, const Qgs3DRenderContext &context ) const
72{
73 Q_UNUSED( context )
74 if ( mHeightMapGenerator )
75 return mHeightMapGenerator->heightAt( x, y );
76 else
77 return 0;
78}
79
80void QgsDemTerrainGenerator::writeXml( QDomElement &elem ) const
81{
82 elem.setAttribute( QStringLiteral( "layer" ), mLayer.layerId );
83 elem.setAttribute( QStringLiteral( "resolution" ), mResolution );
84 elem.setAttribute( QStringLiteral( "skirt-height" ), mSkirtHeight );
85
86 // crs is not read/written - it should be the same as destination crs of the map
87}
88
89void QgsDemTerrainGenerator::readXml( const QDomElement &elem )
90{
91 mLayer = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );
92 mResolution = elem.attribute( QStringLiteral( "resolution" ) ).toInt();
93 mSkirtHeight = elem.attribute( QStringLiteral( "skirt-height" ) ).toFloat();
94
95 // crs is not read/written - it should be the same as destination crs of the map
96}
97
99{
100 mLayer = QgsMapLayerRef( project.mapLayer( mLayer.layerId ) );
101 // now that we have the layer, call setExtent() again so we can keep the intersection of mExtent and layer's extent
103}
104
105QgsChunkLoader *QgsDemTerrainGenerator::createChunkLoader( QgsChunkNode *node ) const
106{
107 // A bit of a hack to make cloning terrain generator work properly
108 return new QgsDemTerrainTileLoader( mTerrain, node, const_cast<QgsDemTerrainGenerator *>( this ) );
109}
110
112{
113 if ( !mLayer )
114 {
115 // Keep the whole extent for now and setExtent() will be called by again by resolveReferences()
116 mExtent = extent;
117 return;
118 }
119
120 QgsRectangle layerExtent = Qgs3DUtils::tryReprojectExtent2D( mLayer->extent(), mLayer->crs(), mCrs, mTransformContext );
121 // no need to have an mExtent larger than the actual layer's extent
122 mExtent = extent.intersect( layerExtent );
123 updateGenerator();
124}
125
126void QgsDemTerrainGenerator::updateGenerator()
127{
128 QgsRasterLayer *dem = layer();
129 if ( dem && mCrs.isValid() )
130 {
132 delete mHeightMapGenerator;
133 mHeightMapGenerator = new QgsDemHeightMapGenerator( dem, mTerrainTilingScheme, mResolution, mTransformContext );
134 mIsValid = true;
135 }
136 else
137 {
139 delete mHeightMapGenerator;
140 mHeightMapGenerator = nullptr;
141 mIsValid = false;
142 }
143}
static QgsRectangle tryReprojectExtent2D(const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs1, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context)
Reprojects extent from crs1 to crs2 coordinate reference system with context context.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Contains information about the context in which a coordinate transform is executed.
QgsRectangle rootChunkExtent() const override
extent of the terrain's root chunk in terrain's CRS
float heightAt(double x, double y, const Qgs3DRenderContext &context) const override
Returns height at (x,y) in map's CRS.
Type type() const override
What texture generator implementation is this.
void setCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets CRS of the terrain.
void readXml(const QDomElement &elem) override
Read terrain generator's configuration from XML.
QgsTerrainGenerator * clone() const override
Makes a copy of the current instance.
void resolveReferences(const QgsProject &project) override
After read of XML, resolve references to any layers that have been read as layer IDs.
QgsRasterLayer * layer() const
Returns raster layer with elevation model to be used for terrain generation.
void setExtent(const QgsRectangle &extent) override
sets the extent of the terrain in terrain's CRS
QgsCoordinateReferenceSystem crs() const override
Returns CRS of the terrain.
void writeXml(QDomElement &elem) const override
Write terrain generator's configuration to XML.
QgsChunkLoader * createChunkLoader(QgsChunkNode *node) const override
void setLayer(QgsRasterLayer *layer)
Sets raster layer with elevation model to be used for terrain generation.
QgsDemTerrainGenerator()=default
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:83
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:107
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
Represents a raster layer.
A rectangle specified with double values.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Type
Enumeration of the available terrain generators.
@ Dem
Terrain is built from raster layer 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
virtual 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.
_LayerRef< QgsMapLayer > QgsMapLayerRef
const QgsCoordinateReferenceSystem & crs
QPointer< TYPE > layer
Weak pointer to map layer.
QString layerId
Original layer ID.