diff --git a/README.md b/README.md index 5fc9a1d..2b7a221 100644 --- a/README.md +++ b/README.md @@ -187,11 +187,15 @@ If you want to save the output to a file, you can do by: #### Supported output formats +`--output_format` + - `json` (default) - `xml` #### Unify layer names +`--unify_layer_names_by_group` + - `False` (default) - `True` @@ -218,3 +222,7 @@ So enabling this option, will produce the following names for the layers: - `environment.ground_coverage.forest` - `environment.ground_coverage.field` - `environment.ground_coverage.lake` + +## Job interface + +Todo... diff --git a/src/qgis_server_light/exporter/cli.py b/src/qgis_server_light/exporter/cli.py index d5bbfda..7239bed 100644 --- a/src/qgis_server_light/exporter/cli.py +++ b/src/qgis_server_light/exporter/cli.py @@ -3,6 +3,7 @@ from qgis_server_light.exporter.extract import extract from xsdata.formats.dataclass.serializers import JsonSerializer, XmlSerializer from qgis.core import QgsApplication +from xsdata.formats.dataclass.serializers.config import SerializerConfig os.environ["QT_QPA_PLATFORM"] = "offscreen" QgsApplication.setPrefixPath('/usr', True) @@ -25,7 +26,10 @@ def cli(): "export", help=f"Export a QGIS project ({f'|'.join(allowed_extensions)}) (1st argument) file to json format", ) -def export(project: str, unify_layer_names_by_group: bool = False, output_format: str = "json") -> None: +def export(project: str, unify_layer_names_by_group: bool = False, output_format: str | None = None) -> None: + serializer_config = SerializerConfig(indent=" ") + if output_format is None: + output_format = "json" if not project.lower().endswith(allowed_extensions): raise NotImplementedError( f'Allowed qgis project file extensions are: {"|".join(allowed_extensions)} not => {project}' @@ -37,9 +41,9 @@ def export(project: str, unify_layer_names_by_group: bool = False, output_format if os.path.isfile(project): config = extract(path_to_project=project, unify_layer_names_by_group=bool(unify_layer_names_by_group)) if output_format == "json": - click.echo(JsonSerializer().render(config)) + click.echo(JsonSerializer(config=serializer_config).render(config)) elif output_format == "xml": - click.echo(XmlSerializer().render(config)) + click.echo(XmlSerializer(config=serializer_config).render(config)) else: raise AttributeError diff --git a/src/qgis_server_light/exporter/extract.py b/src/qgis_server_light/exporter/extract.py index e1130f8..3c8fdca 100644 --- a/src/qgis_server_light/exporter/extract.py +++ b/src/qgis_server_light/exporter/extract.py @@ -70,15 +70,16 @@ def extract_save_layer( auth_id=child.dataProvider().crs().authid(), ogc_uri=child.dataProvider().crs().toOgcUri() ) - extent_wgs_84 = extent_in_wgs84(project, child) - bbox_wgs84 = BBox.from_list([ - extent_wgs_84[0], - extent_wgs_84[1], - 0.0, - extent_wgs_84[2], - extent_wgs_84[3], - 0.0 - ]) + + extent_wgs_84 = child.wgs84Extent(forceRecalculate=True) + bbox_wgs84 = BBox( + x_min=extent_wgs_84.xMinimum(), + x_max=extent_wgs_84.xMaximum(), + y_min=extent_wgs_84.yMaximum(), + y_max=extent_wgs_84.yMaximum() + ) + if layer_type == 'vector': + child.updateExtents() extent = child.extent() bbox = BBox.from_list([ extent.xMinimum(), diff --git a/src/qgis_server_light/interface/dispatcher.py b/src/qgis_server_light/interface/dispatcher.py index 9571a54..b6eee9b 100644 --- a/src/qgis_server_light/interface/dispatcher.py +++ b/src/qgis_server_light/interface/dispatcher.py @@ -1,6 +1,5 @@ import asyncio import datetime -import json import logging import pickle from uuid import uuid4 diff --git a/src/qgis_server_light/worker/runner.py b/src/qgis_server_light/worker/runner.py index 231621e..3b820fb 100644 --- a/src/qgis_server_light/worker/runner.py +++ b/src/qgis_server_light/worker/runner.py @@ -64,8 +64,8 @@ def _get_map_settings(self, layers: List[QgsMapLayer]) -> QgsMapSettings: settings = QgsMapSettings() settings.setOutputSize( QSize( - int(self.job.service_params.HEIGHT), - int(self.job.service_params.WIDTH) + int(self.job.service_params.WIDTH), + int(self.job.service_params.HEIGHT) ) ) settings.setOutputDpi(self.job.service_params.dpi) @@ -102,7 +102,7 @@ def _init_layers(self, layer: Vector | Raster): def _prepare_vector_layer(self, layer: Vector) -> QgsVectorLayer: """Initializes a vector layer""" if layer.source.ogr is not None: - if layer.source.remote: + if layer.source.ogr.remote: layer_source_path = layer.path else: layer_source_path = os.path.join( @@ -137,19 +137,20 @@ def _prepare_vector_layer(self, layer: Vector) -> QgsVectorLayer: if self.layer_cache is not None: self.layer_cache[layer.name] = qgs_layer if layer.style: - qgs_layer.importNamedStyle( - QDomDocument( - urlsafe_b64decode( - layer.style - ).decode() + style_doc = QDomDocument() + style_doc.setContent( + urlsafe_b64decode( + layer.style ) ) + style_loaded = qgs_layer.importNamedStyle(style_doc) + logging.info(f"Style loaded: {style_loaded}") return qgs_layer def _prepare_raster_layer(self, layer: Raster) -> QgsRasterLayer: """Initializes a raster layer""" if layer.source.gdal is not None: - if layer.source.remote: + if layer.source.gdal.remote: layer_source_path = layer.path else: layer_source_path = os.path.join( @@ -170,16 +171,16 @@ def _prepare_raster_layer(self, layer: Raster) -> QgsRasterLayer: else: logging.info(f" ✓ Layer: {layer.name}") if self.layer_cache is not None: - self.layer_cache[layer.name] = layer + self.layer_cache[layer.name] = qgs_layer if layer.style: - if layer.style: - qgs_layer.importNamedStyle( - QDomDocument( - urlsafe_b64decode( - layer.style - ) - ) + style_doc = QDomDocument() + style_doc.setContent( + urlsafe_b64decode( + layer.style ) + ) + style_loaded = qgs_layer.importNamedStyle(style_doc) + logging.info(f"Style loaded: {style_loaded}") return qgs_layer def run(self):