Skip to content

Commit

Permalink
Adding named image GUI
Browse files Browse the repository at this point in the history
  • Loading branch information
zacdezgeo committed Feb 11, 2025
1 parent 92a2b94 commit dea2349
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 0 deletions.
102 changes: 102 additions & 0 deletions ee_plugin/ee_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from builtins import object
from typing import cast

import ee
import requests # type: ignore
from qgis import gui
from qgis.core import QgsProject
Expand All @@ -20,6 +21,7 @@
from qgis.PyQt.QtGui import QIcon

from .config import EarthEngineConfig
from .Map import addLayer
from .ui.utils import (
build_form_group_box,
build_vbox_dialog,
Expand Down Expand Up @@ -118,6 +120,13 @@ def initGui(self):
triggered=self._run_cmd_set_cloud_project,
)

add_gee_layer_action = QtWidgets.QAction(
icon=icon("add-layer.svg"),
text=self.tr("Add GEE Dataset"),
parent=self.iface.mainWindow(),
triggered=self._add_gee_layer_dialog,
)

# Build plugin menu
plugin_menu = cast(QtWidgets.QMenu, self.iface.pluginMenu())
ee_menu = plugin_menu.addMenu(
Expand All @@ -129,6 +138,7 @@ def initGui(self):
ee_menu.addSeparator()
ee_menu.addAction(sign_in_action)
ee_menu.addAction(self.set_cloud_project_action)
ee_menu.addAction(add_gee_layer_action)

# Build toolbar
toolButton = QtWidgets.QToolButton()
Expand All @@ -145,6 +155,7 @@ def initGui(self):
toolButton.menu().addSeparator()
toolButton.menu().addAction(sign_in_action)
toolButton.menu().addAction(self.set_cloud_project_action)
toolButton.menu().addAction(add_gee_layer_action)
self.iface.pluginToolBar().addWidget(toolButton)
self.toolButton = toolButton

Expand Down Expand Up @@ -321,3 +332,94 @@ def _test_dock_widget(self):
),
rejected=lambda: self.iface.messageBar().pushMessage("Cancelled"),
)

def _add_gee_layer_dialog(self):
"""Display a dialog to add a GEE dataset to the QGIS map."""

dialog = build_vbox_dialog(
windowTitle="Add Google Earth Engine Layer",
widgets=[
build_form_group_box(
title="Dataset",
rows=[
(
QtWidgets.QLabel(
text="Enter GEE Dataset Name (e.g., COPERNICUS/S2, USGS/SRTMGL1_003)",
toolTip="Provide the full Earth Engine dataset ID.",
),
QtWidgets.QLineEdit(objectName="datasetId"),
)
],
),
build_form_group_box(
title="Visualization Parameters (JSON)",
collapsable=True,
collapsed=True,
rows=[
(
QtWidgets.QLabel(
text="Enter JSON for visualization parameters",
toolTip="Example: {'min': 0, 'max': 4000, 'palette': ['006633', 'E5FFCC', '662A00']}",
),
QtWidgets.QTextEdit(
objectName="vizParams",
placeholderText='{"min": 0, "max": 4000, "palette": ["006633", "E5FFCC", "662A00"]}',
),
)
],
),
],
accepted=lambda: self._load_gee_layer(dialog),
rejected=lambda: self.iface.messageBar().pushMessage("Cancelled"),
)

def _load_gee_layer(self, dialog):
"""Fetch and add the selected Earth Engine dataset to the map with user-defined visualization parameters."""
values = get_values(dialog)
dataset_id = values["datasetId"]

if not dataset_id:
self.iface.messageBar().pushMessage(
"Error", "Dataset ID is required", level=3
)
return

try:
# Get asset metadata
asset_info = ee.data.getAsset(dataset_id)
asset_type = asset_info.get("type", "")

# Determine if it's an ImageCollection or Image
if asset_type == "IMAGE_COLLECTION":
ee_object = ee.ImageCollection(dataset_id).mosaic()
elif asset_type == "IMAGE":
ee_object = ee.Image(dataset_id)
else:
raise ValueError(f"Unsupported asset type: {asset_type}")

# Get visualization parameters from user as JSON
vis_params_input = values.get("vizParams", "{}")

try:
vis_params_input = vis_params_input.replace("'", '"')
vis_params = json.loads(vis_params_input)
except json.JSONDecodeError:
raise ValueError("Invalid JSON format in visualization parameters")

# Add the dataset to QGIS map
addLayer(ee_object, vis_params, dataset_id)

self.iface.messageBar().pushMessage(
f"Added {dataset_id} to map with custom visualization"
)

except ee.EEException as e:
self.iface.messageBar().pushMessage(
"Error", f"Earth Engine Error: {str(e)}", level=3
)
except ValueError as e:
self.iface.messageBar().pushMessage("Error", str(e), level=3)
except Exception as e:
self.iface.messageBar().pushMessage(
"Error", f"Unexpected error: {str(e)}", level=3
)
2 changes: 2 additions & 0 deletions ee_plugin/ui/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
QDateEdit,
QCheckBox,
QLayout,
QTextEdit,
)
from qgis.gui import QgsColorButton, QgsCollapsibleGroupBox

Expand Down Expand Up @@ -82,6 +83,7 @@ def get_values(dialog: QDialog) -> dict:
QDateEdit: lambda w: w.date().toString("yyyy-MM-dd"),
QCheckBox: lambda w: w.isChecked(),
QgsColorButton: lambda w: w.color().name(),
QTextEdit: lambda w: w.toPlainText().strip(),
}
return {
w.objectName(): parsers[type(w)](w)
Expand Down

0 comments on commit dea2349

Please sign in to comment.