Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Setup framework for data provider's to provide information about
elevation related properties to their layers

And use this to ensure that wms tiles with maptiler terrain
or terrarium terrain interpretation are always included by
default in elevation profile plots.

Most specifically, this ensures that projects containing the
out-of-the-box "Mapzen Global Terrain" layer will be automatically
included in elevation plots.
  • Loading branch information
nyalldawson committed May 19, 2023
1 parent c5f9dc5 commit e036570
Show file tree
Hide file tree
Showing 18 changed files with 398 additions and 1 deletion.
10 changes: 10 additions & 0 deletions python/core/auto_generated/providers/qgsdataprovider.sip.in
Expand Up @@ -166,6 +166,16 @@ This may be ``None``, depending on the data provider.
%End


virtual QgsDataProviderElevationProperties *elevationProperties();
%Docstring
Returns the provider's elevation properties.

This may be ``None``, depending on the data provider.

.. versionadded:: 3.32
%End


virtual QgsRectangle extent() const = 0;
%Docstring
Returns the extent of the layer
Expand Down
@@ -0,0 +1,50 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/qgsdataproviderelevationproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/





class QgsDataProviderElevationProperties
{
%Docstring(signature="appended")
Base class for handling elevation related properties for a data provider.

.. versionadded:: 3.32
%End

%TypeHeaderCode
#include "qgsdataproviderelevationproperties.h"
%End
%ConvertToSubClassCode
if ( dynamic_cast<QgsRasterDataProviderElevationProperties *>( sipCpp ) )
{
sipType = sipType_QgsRasterDataProviderElevationProperties;
}
else
{
sipType = 0;
}
%End
public:

QgsDataProviderElevationProperties();
%Docstring
Constructor for QgsDataProviderElevationProperties.
%End

virtual ~QgsDataProviderElevationProperties();
};

/************************************************************************
* This file has been generated automatically from *
* *
* src/core/qgsdataproviderelevationproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
Expand Up @@ -213,6 +213,8 @@ their own layers, such as WMS

virtual QgsRasterDataProviderTemporalCapabilities *temporalCapabilities();

virtual QgsRasterDataProviderElevationProperties *elevationProperties();


virtual bool supportsLegendGraphic() const;
%Docstring
Expand Down
@@ -0,0 +1,58 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/raster/qgsrasterdataproviderelevationproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/





class QgsRasterDataProviderElevationProperties : QgsDataProviderElevationProperties
{
%Docstring(signature="appended")
Handles elevation related properties for a raster data provider.

.. versionadded:: 3.32
%End

%TypeHeaderCode
#include "qgsrasterdataproviderelevationproperties.h"
%End
public:

QgsRasterDataProviderElevationProperties();
%Docstring
Constructor for QgsRasterDataProviderElevationProperties.
%End

bool containsElevationData() const;
%Docstring
Returns ``True`` if the raster data provider definitely contains elevation related data.

.. note::

Even if this method returns ``False``, the raster data may still relate to elevation values. ``True`` will only
be returned in situations where elevation data is definitively present.

.. seealso:: :py:func:`setContainsElevationData`
%End

void setContainsElevationData( bool contains );
%Docstring
Sets whether the raster data provider definitely contains elevation related data.

.. seealso:: :py:func:`containsElevationData`
%End

};

/************************************************************************
* This file has been generated automatically from *
* *
* src/core/raster/qgsrasterdataproviderelevationproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
2 changes: 2 additions & 0 deletions python/core/core_auto.sip
Expand Up @@ -31,6 +31,7 @@
%Include auto_generated/qgsdatabaseschemamodel.sip
%Include auto_generated/qgsdatabasetablemodel.sip
%Include auto_generated/qgsdatadefinedsizelegend.sip
%Include auto_generated/qgsdataproviderelevationproperties.sip
%Include auto_generated/qgsdataprovidertemporalcapabilities.sip
%Include auto_generated/qgsdatasourceuri.sip
%Include auto_generated/qgsdatetimestatisticalsummary.sip
Expand Down Expand Up @@ -610,6 +611,7 @@
%Include auto_generated/raster/qgsrasterchecker.sip
%Include auto_generated/raster/qgsrastercontourrenderer.sip
%Include auto_generated/raster/qgsrasterdataprovider.sip
%Include auto_generated/raster/qgsrasterdataproviderelevationproperties.sip
%Include auto_generated/raster/qgsrasterdataprovidertemporalcapabilities.sip
%Include auto_generated/raster/qgsrasterdrawer.sip
%Include auto_generated/raster/qgsrasterfilewriter.sip
Expand Down
4 changes: 4 additions & 0 deletions src/core/CMakeLists.txt
Expand Up @@ -378,6 +378,7 @@ set(QGIS_CORE_SRCS
qgsdatabasetablemodel.cpp
qgsdatadefinedsizelegend.cpp
qgsdatasourceuri.cpp
qgsdataproviderelevationproperties.cpp
qgsdataprovidertemporalcapabilities.cpp
qgsdatetimestatisticalsummary.cpp
qgsdbfilterproxymodel.cpp
Expand Down Expand Up @@ -705,6 +706,7 @@ set(QGIS_CORE_SRCS
raster/qgsrasterchecker.cpp
raster/qgsrastercontourrenderer.cpp
raster/qgsrasterdataprovider.cpp
raster/qgsrasterdataproviderelevationproperties.cpp
raster/qgsrasterdataprovidertemporalcapabilities.cpp
raster/qgsrasterfilewritertask.cpp
raster/qgsrasteridentifyresult.cpp
Expand Down Expand Up @@ -1048,6 +1050,7 @@ set(QGIS_CORE_HDRS
qgsdatabaseschemamodel.h
qgsdatabasetablemodel.h
qgsdatadefinedsizelegend.h
qgsdataproviderelevationproperties.h
qgsdataprovidertemporalcapabilities.h
qgsdatasourceuri.h
qgsdatetimestatisticalsummary.h
Expand Down Expand Up @@ -1777,6 +1780,7 @@ set(QGIS_CORE_HDRS
raster/qgsrasterchecker.h
raster/qgsrastercontourrenderer.h
raster/qgsrasterdataprovider.h
raster/qgsrasterdataproviderelevationproperties.h
raster/qgsrasterdataprovidertemporalcapabilities.h
raster/qgsrasterdrawer.h
raster/qgsrasterfilewriter.h
Expand Down
14 changes: 14 additions & 0 deletions src/core/providers/qgsdataprovider.cpp
Expand Up @@ -49,6 +49,20 @@ const QgsDataProviderTemporalCapabilities *QgsDataProvider::temporalCapabilities
return nullptr;
}

QgsDataProviderElevationProperties *QgsDataProvider::elevationProperties()
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return nullptr;
}

const QgsDataProviderElevationProperties *QgsDataProvider::elevationProperties() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return nullptr;
}

void QgsDataProvider::reloadData()
{
// Because QgsVirtualLayerTask is not thread safe:
Expand Down
19 changes: 19 additions & 0 deletions src/core/providers/qgsdataprovider.h
Expand Up @@ -31,6 +31,7 @@
class QgsRectangle;
class QgsCoordinateReferenceSystem;
class QgsDataProviderTemporalCapabilities;
class QgsDataProviderElevationProperties;


/**
Expand Down Expand Up @@ -233,6 +234,24 @@ class CORE_EXPORT QgsDataProvider : public QObject
*/
virtual const QgsDataProviderTemporalCapabilities *temporalCapabilities() const SIP_SKIP;

/**
* Returns the provider's elevation properties.
*
* This may be NULLPTR, depending on the data provider.
*
* \since QGIS 3.32
*/
virtual QgsDataProviderElevationProperties *elevationProperties();

/**
* Returns the provider's elevation properties.
*
* This may be NULLPTR, depending on the data provider.
*
* \since QGIS 3.32
*/
virtual const QgsDataProviderElevationProperties *elevationProperties() const SIP_SKIP;

/**
* Returns the extent of the layer
* \returns QgsRectangle containing the extent of the layer
Expand Down
21 changes: 21 additions & 0 deletions src/core/qgsdataproviderelevationproperties.cpp
@@ -0,0 +1,21 @@
/***************************************************************************
qgsdataproviderelevationproperties.h
---------------
begin : May 2023
copyright : (C) 2023 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsdataproviderelevationproperties.h"

QgsDataProviderElevationProperties::QgsDataProviderElevationProperties() = default;

QgsDataProviderElevationProperties::~QgsDataProviderElevationProperties() = default;
58 changes: 58 additions & 0 deletions src/core/qgsdataproviderelevationproperties.h
@@ -0,0 +1,58 @@
/***************************************************************************
qgsdataproviderelevationproperties.h
---------------
begin : May 2023
copyright : (C) 2023 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/


#ifndef QGSDATAPROVIDERELEVATIONPROPERTIES_H
#define QGSDATAPROVIDERELEVATIONPROPERTIES_H

#include "qgis_core.h"
#include "qgis_sip.h"

/**
* \class QgsDataProviderElevationProperties
* \ingroup core
* \brief Base class for handling elevation related properties for a data provider.
*
* \since QGIS 3.32
*/
class CORE_EXPORT QgsDataProviderElevationProperties
{

#ifdef SIP_RUN
SIP_CONVERT_TO_SUBCLASS_CODE
if ( dynamic_cast<QgsRasterDataProviderElevationProperties *>( sipCpp ) )
{
sipType = sipType_QgsRasterDataProviderElevationProperties;
}
else
{
sipType = 0;
}
SIP_END
#endif

public:

/**
* Constructor for QgsDataProviderElevationProperties.
*/
QgsDataProviderElevationProperties();

virtual ~QgsDataProviderElevationProperties();
};

#endif // QGSDATAPROVIDERELEVATIONPROPERTIES_H
21 changes: 20 additions & 1 deletion src/core/raster/qgsrasterdataprovider.cpp
Expand Up @@ -236,6 +236,7 @@ QgsRasterDataProvider::QgsRasterDataProvider()
: QgsDataProvider( QString(), QgsDataProvider::ProviderOptions(), QgsDataProvider::ReadFlags() )
, QgsRasterInterface( nullptr )
, mTemporalCapabilities( std::make_unique< QgsRasterDataProviderTemporalCapabilities >() )
, mElevationProperties( std::make_unique< QgsRasterDataProviderElevationProperties >() )
{

}
Expand All @@ -245,6 +246,7 @@ QgsRasterDataProvider::QgsRasterDataProvider( const QString &uri, const Provider
: QgsDataProvider( uri, options, flags )
, QgsRasterInterface( nullptr )
, mTemporalCapabilities( std::make_unique< QgsRasterDataProviderTemporalCapabilities >() )
, mElevationProperties( std::make_unique< QgsRasterDataProviderElevationProperties >() )
{
}

Expand Down Expand Up @@ -434,6 +436,20 @@ const QgsRasterDataProviderTemporalCapabilities *QgsRasterDataProvider::temporal
return mTemporalCapabilities.get();
}

QgsRasterDataProviderElevationProperties *QgsRasterDataProvider::elevationProperties()
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mElevationProperties.get();
}

const QgsRasterDataProviderElevationProperties *QgsRasterDataProvider::elevationProperties() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mElevationProperties.get();
}

QgsRasterDataProvider *QgsRasterDataProvider::create( const QString &providerKey,
const QString &uri,
const QString &format, int nBands,
Expand Down Expand Up @@ -571,11 +587,14 @@ void QgsRasterDataProvider::copyBaseSettings( const QgsRasterDataProvider &other
mZoomedOutResamplingMethod = other.mZoomedOutResamplingMethod;
mMaxOversampling = other.mMaxOversampling;

// copy temporal properties
if ( mTemporalCapabilities && other.mTemporalCapabilities )
{
*mTemporalCapabilities = *other.mTemporalCapabilities;
}
if ( mElevationProperties && other.mElevationProperties )
{
*mElevationProperties = *other.mElevationProperties;
}
}

static QgsRasterDataProvider::ResamplingMethod resamplingMethodFromString( const QString &str )
Expand Down
5 changes: 5 additions & 0 deletions src/core/raster/qgsrasterdataprovider.h
Expand Up @@ -41,6 +41,7 @@
#include "qgsrectangle.h"
#include "qgsrasteriterator.h"
#include "qgsrasterdataprovidertemporalcapabilities.h"
#include "qgsrasterdataproviderelevationproperties.h"

class QImage;
class QByteArray;
Expand Down Expand Up @@ -274,6 +275,8 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast

QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() override;
const QgsRasterDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
QgsRasterDataProviderElevationProperties *elevationProperties() override;
const QgsRasterDataProviderElevationProperties *elevationProperties() const override SIP_SKIP;

//! \brief Returns whether the provider supplies a legend graphic
virtual bool supportsLegendGraphic() const { return false; }
Expand Down Expand Up @@ -914,6 +917,8 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast
*/
std::unique_ptr< QgsRasterDataProviderTemporalCapabilities > mTemporalCapabilities;

std::unique_ptr< QgsRasterDataProviderElevationProperties > mElevationProperties;

std::map<int, std::unique_ptr<QgsRasterAttributeTable>> mAttributeTables;

};
Expand Down

0 comments on commit e036570

Please sign in to comment.