Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GUI for adding Quantized Mesh layers #58642

Merged
merged 2 commits into from
Sep 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions src/core/tiledscene/qgsquantizedmeshdataprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include "qgsquantizedmeshdataprovider.h"
#include "qgsapplication.h"
#include "qgsauthmanager.h"
#include "qgsblockingnetworkrequest.h"
#include "qgscoordinatereferencesystem.h"
#include "qgscoordinatetransform.h"
Expand All @@ -44,9 +45,6 @@

///@cond PRIVATE

constexpr const char *providerName = "quantizedmesh";
constexpr const char *providerDescription = "Cesium Quantized Mesh tiles";

class MissingFieldException : public std::exception
{
public:
Expand Down Expand Up @@ -76,11 +74,19 @@ QgsQuantizedMeshMetadata::QgsQuantizedMeshMetadata(
const QgsCoordinateTransformContext &transformContext,
QgsError &error )
{
// The provided URI should be the metadata JSON's location
QNetworkRequest requestData( uri );
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( uri );
mAuthCfg = dsUri.authConfigId();
mHeaders = dsUri.httpHeaders();

// The provided URL should be the metadata JSON's location
QUrl metadataUrl = dsUri.param( "url" );
QNetworkRequest requestData( metadataUrl );
mHeaders.updateNetworkRequest( requestData );
QgsSetRequestInitiatorClass( requestData,
QStringLiteral( "QgsQuantizedMeshDataProvider" ) );
QgsBlockingNetworkRequest request;
request.setAuthCfg( mAuthCfg );
auto respCode = request.get( requestData );
if ( respCode != QgsBlockingNetworkRequest::ErrorCode::NoError )
{
Expand Down Expand Up @@ -166,7 +172,6 @@ QgsQuantizedMeshMetadata::QgsQuantizedMeshMetadata(

QString versionStr =
QString::fromStdString( jsonGet<std::string>( replyJson, "version" ) );
QUrl metadataUrl = uri;
for ( auto &urlStr : jsonGet<std::vector<std::string>>( replyJson, "tiles" ) )
{
QUrl url = metadataUrl.resolved( QString::fromStdString( urlStr ) );
Expand Down Expand Up @@ -407,6 +412,8 @@ QByteArray QgsQuantizedMeshIndex::fetchContent( const QString &uri,
QNetworkRequest requestData( uri );
requestData.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
requestData.setRawHeader( "Accept", "application/vnd.quantized-mesh,application/octet-stream;q=0.9" );
mMetadata.mHeaders.updateNetworkRequest( requestData );
QgsApplication::authManager()->updateNetworkRequest( requestData, mMetadata.mAuthCfg );
QgsSetRequestInitiatorClass( requestData,
QStringLiteral( "QgsQuantizedMeshIndex" ) );

Expand Down Expand Up @@ -492,7 +499,8 @@ const QgsQuantizedMeshMetadata &QgsQuantizedMeshDataProvider::quantizedMeshMetad
}

QgsQuantizedMeshProviderMetadata::QgsQuantizedMeshProviderMetadata()
: QgsProviderMetadata( providerName, providerDescription ) {}
: QgsProviderMetadata( QgsQuantizedMeshDataProvider::providerName,
QgsQuantizedMeshDataProvider::providerDescription ) {}

QgsDataProvider *QgsQuantizedMeshProviderMetadata::createProvider(
const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions,
Expand Down
8 changes: 8 additions & 0 deletions src/core/tiledscene/qgsquantizedmeshdataprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "qgis.h"
#include "qgscoordinatereferencesystem.h"
#include "qgscoordinatetransformcontext.h"
#include "qgshttpheaders.h"
#include "qgsprovidermetadata.h"
#include "qgstiledsceneboundingvolume.h"
#include "qgstiledscenedataprovider.h"
Expand Down Expand Up @@ -48,6 +49,9 @@ class CORE_EXPORT QgsQuantizedMeshMetadata
bool containsTile( QgsTileXYZ tile ) const;
double geometricErrorAtZoom( int zoom ) const;

QString mAuthCfg;
QgsHttpHeaders mHeaders;

QgsRectangle mExtent;
QgsTiledSceneBoundingVolume mBoundingVolume;
// Map of zoom level -> list of AABBs of available tiles (tile index ranges)
Expand Down Expand Up @@ -112,6 +116,10 @@ class CORE_EXPORT QgsQuantizedMeshDataProvider: public QgsTiledSceneDataProvider

const QgsQuantizedMeshMetadata &quantizedMeshMetadata() const;

static constexpr const char *providerName = "quantizedmesh";
static constexpr const char *providerDescription = "Cesium Quantized Mesh tiles";


private:
QString mUri; // For clone()
QgsDataProvider::ProviderOptions mProviderOptions; // For clone()
Expand Down
11 changes: 8 additions & 3 deletions src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
***************************************************************************/

#include "qgstiledscenedataitemguiprovider.h"
#include "qgsquantizedmeshdataprovider.h"
#include "qgstiledscenedataitems.h"
#include "qgstiledsceneconnection.h"
#include "qgstiledsceneconnectiondialog.h"
Expand Down Expand Up @@ -52,9 +53,13 @@ void QgsTiledSceneDataItemGuiProvider::populateContextMenu( QgsDataItem *item, Q
if ( QgsTiledSceneRootItem *rootItem = qobject_cast< QgsTiledSceneRootItem * >( item ) )
{
QAction *actionNewCesium = new QAction( tr( "New Cesium 3D Tiles Connection…" ), menu );
connect( actionNewCesium, &QAction::triggered, this, [rootItem] { newCesium3dTilesConnection( rootItem ); } );
connect( actionNewCesium, &QAction::triggered, this, [rootItem] { newConnection( rootItem, "cesiumtiles" ); } );
menu->addAction( actionNewCesium );

QAction *actionNewQM = new QAction( tr( "New Quantized Mesh Connection…" ), menu );
connect( actionNewQM, &QAction::triggered, this, [rootItem] { newConnection( rootItem, "quantizedmesh" ); } );
menu->addAction( actionNewQM );

menu->addSeparator();

QAction *actionSave = new QAction( tr( "Save Connections…" ), menu );
Expand Down Expand Up @@ -100,14 +105,14 @@ void QgsTiledSceneDataItemGuiProvider::duplicateConnection( QgsDataItem *item )
item->parent()->refreshConnections();
}

void QgsTiledSceneDataItemGuiProvider::newCesium3dTilesConnection( QgsDataItem *item )
void QgsTiledSceneDataItemGuiProvider::newConnection( QgsDataItem *item, QString provider )
{
QgsTiledSceneConnectionDialog dlg;
if ( !dlg.exec() )
return;

QgsTiledSceneProviderConnection::Data conn = QgsTiledSceneProviderConnection::decodedUri( dlg.connectionUri() );
conn.provider = QStringLiteral( "cesiumtiles" );
conn.provider = provider;

QgsTiledSceneProviderConnection::addConnection( dlg.connectionName(), conn );

Expand Down
2 changes: 1 addition & 1 deletion src/gui/tiledscene/qgstiledscenedataitemguiprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class QgsTiledSceneDataItemGuiProvider : public QObject, public QgsDataItemGuiPr
private:
static void editConnection( QgsDataItem *item );
static void duplicateConnection( QgsDataItem *item );
static void newCesium3dTilesConnection( QgsDataItem *item );
static void newConnection( QgsDataItem *item, QString provider );
static void saveConnections();
static void loadConnections( QgsDataItem *item );

Expand Down
39 changes: 22 additions & 17 deletions src/gui/tiledscene/qgstiledscenesourceselect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ QgsTiledSceneSourceSelect::QgsTiledSceneSourceSelect( QWidget *parent, Qt::Windo
QMenu *newMenu = new QMenu( btnNew );

QAction *actionNew = new QAction( tr( "New Cesium 3D Tiles Connection…" ), this );
connect( actionNew, &QAction::triggered, this, &QgsTiledSceneSourceSelect::btnNewCesium3DTiles_clicked );
connect( actionNew, &QAction::triggered, this, [ this ]() { newConnection( "cesiumtiles" ); } );
newMenu->addAction( actionNew );

actionNew = new QAction( tr( "New Quantized Mesh Connection…" ), this );
connect( actionNew, &QAction::triggered, this, [ this ]() { newConnection( "quantizedmesh" ); } );
newMenu->addAction( actionNew );

btnNew->setMenu( newMenu );
Expand All @@ -83,22 +87,6 @@ QgsTiledSceneSourceSelect::QgsTiledSceneSourceSelect( QWidget *parent, Qt::Windo
} );
}

void QgsTiledSceneSourceSelect::btnNewCesium3DTiles_clicked()
{
QgsTiledSceneConnectionDialog nc( this );
if ( nc.exec() )
{
QgsTiledSceneProviderConnection::Data connectionData = QgsTiledSceneProviderConnection::decodedUri( nc.connectionUri() );
connectionData.provider = QStringLiteral( "cesiumtiles" );

QgsTiledSceneProviderConnection::addConnection( nc.connectionName(), connectionData );
populateConnectionList();
QgsTiledSceneProviderConnection::setSelectedConnection( nc.connectionName() );
setConnectionListPosition();
emit connectionsChanged();
}
}

void QgsTiledSceneSourceSelect::btnEdit_clicked()
{
const QgsTiledSceneProviderConnection::Data connection = QgsTiledSceneProviderConnection::connection( cmbConnections->currentText() );
Expand Down Expand Up @@ -181,6 +169,23 @@ void QgsTiledSceneSourceSelect::addButtonClicked()
}
}

void QgsTiledSceneSourceSelect::newConnection( QString provider )
{
QgsTiledSceneConnectionDialog nc( this );
if ( nc.exec() )
{
QgsTiledSceneProviderConnection::Data connectionData = QgsTiledSceneProviderConnection::decodedUri( nc.connectionUri() );
connectionData.provider = provider;

QgsTiledSceneProviderConnection::addConnection( nc.connectionName(), connectionData );
populateConnectionList();
QgsTiledSceneProviderConnection::setSelectedConnection( nc.connectionName() );
setConnectionListPosition();
emit connectionsChanged();
}
}


void QgsTiledSceneSourceSelect::populateConnectionList()
{
cmbConnections->blockSignals( true );
Expand Down
4 changes: 2 additions & 2 deletions src/gui/tiledscene/qgstiledscenesourceselect.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ class QgsTiledSceneSourceSelect : public QgsAbstractDataSourceWidget, private Ui

private slots:

//! Opens the create connection dialog to build a new connection
void btnNewCesium3DTiles_clicked();
//! Opens a dialog to edit an existing connection
void btnEdit_clicked();
//! Deletes the selected connection
Expand All @@ -62,6 +60,8 @@ class QgsTiledSceneSourceSelect : public QgsAbstractDataSourceWidget, private Ui
void showHelp();

private:
//! Opens the create connection dialog to build a new connection
void newConnection( QString provider );
void populateConnectionList();
void setConnectionListPosition();
};
Expand Down
Loading