From a7007e87daf323942edd47eab57c7fc539f13503 Mon Sep 17 00:00:00 2001 From: Florence Haudin Date: Fri, 11 Jul 2025 13:36:00 +0200 Subject: [PATCH] Restore type on vector layers. --- .../base/src/formbuilder/creationform.tsx | 193 ++++++++++++++---- packages/base/src/tools.ts | 3 + .../schema/project/layers/vectorLayer.json | 8 +- .../jupytergis_lab/notebook/gis_document.py | 3 + .../jupytergis_qgis/qgis_loader.py | 6 +- 5 files changed, 164 insertions(+), 49 deletions(-) diff --git a/packages/base/src/formbuilder/creationform.tsx b/packages/base/src/formbuilder/creationform.tsx index 16f68db11..d7a287779 100644 --- a/packages/base/src/formbuilder/creationform.tsx +++ b/packages/base/src/formbuilder/creationform.tsx @@ -14,6 +14,7 @@ import * as React from 'react'; import { deepCopy } from '@/src/tools'; import { getLayerTypeForm, getSourceTypeForm } from './formselectors'; +import { loadFile } from '@/src/tools'; export interface ICreationFormProps { /** @@ -80,9 +81,15 @@ export class CreationForm extends React.Component { super(props); this.filePath = props.model.filePath; + console.log('filePath:', this.filePath); this.jGISModel = props.model; } + async loadData(path: string) { + const data = await loadFile({ filepath: path, type: this.props.sourceType, model: this.jGISModel }); + return data + } + render() { const sourceId = UUID.uuid4(); let layerSchema: IDict | undefined = undefined; @@ -186,56 +193,152 @@ export class CreationForm extends React.Component { visible: true, name: actualName, }; - - this.jGISModel.addLayer(UUID.uuid4(), layerModel); + console.log('layerModel:', layerModel); + + + if (this.props.layerType === 'VectorLayer' && this.props.sourceType === 'GeoJSONSource') { + const data = await this.loadData(this.props?.sourceData?.path) + const features = data.features; + + let points: any = []; + let lineStrings: any = []; + let polygons: any = []; + + features.forEach((feature: any) => { + if (feature.geometry.type === 'Point') { + points.push(feature); + } else if (feature.geometry.type === 'LineString') { + lineStrings.push(feature); + } else if (feature.geometry.type === 'Polygon') { + polygons.push(feature); + } + }) + const pointsData = { + type: 'FeatureCollection', + features: points, + }; + + const lineStringsData = { + type: 'FeatureCollection', + features: lineStrings, + }; + + const polygonData = { + type: 'FeatureCollection', + features: polygons, + }; + + + const pointSource: IJGISSource = { + name: "Point Source", + type: "GeoJSONSource", + parameters: { + data: pointsData, + }, + }; + + const lineStringSource: IJGISSource = { + name: "LineString Source", + type: "GeoJSONSource", + parameters: { + data: lineStringsData, + }, + }; + + const polygonSource: IJGISSource = { + name: "", + type: "GeoJSONSource", + parameters: { + data: polygonData, + }, + }; + + const pointLayer: IJGISLayer = { + type: 'VectorLayer', + visible: true, + name: 'Point Vector Layer', + parameters: { + type: 'point', + source: pointSource, + }, + }; + + const lineStringLayer: IJGISLayer = { + type: 'VectorLayer', + visible: true, + name: 'LineString Vector Layer', + parameters: { + type: 'lineString', + source: lineStringSource, + }, + }; + + const polygonLayer: IJGISLayer = { + type: 'VectorLayer', + visible: true, + name: 'Polygon Vector Layer', + parameters: { + type: 'polygon', + source: polygonSource, + }, + }; + //this.jGISModel.addLayer(UUID.uuid4(), layerModel); + this.jGISModel.addLayer(UUID.uuid4(), pointLayer); + this.jGISModel.addLayer(UUID.uuid4(), lineStringLayer); + this.jGISModel.addLayer(UUID.uuid4(), polygonLayer); + } } }); return (
- {this.props.createSource && ( -
-

Source Properties

- { - sourceCreationPromise?.resolve(properties); - }} - ok={this.props.ok} - cancel={this.props.cancel} - formChangedSignal={this.sourceFormChangedSignal} - formErrorSignal={this.props.formErrorSignal} - dialogOptions={this.props.dialogOptions} - sourceType={this.props.sourceType} - /> -
- )} - {this.props.createLayer && ( -
-

Layer Properties

- { - layerCreationPromise?.resolve(properties); - }} - ok={this.props.ok} - cancel={this.props.cancel} - sourceFormChangedSignal={this.sourceFormChangedSignal} - formErrorSignal={this.props.formErrorSignal} - dialogOptions={this.props.dialogOptions} - /> -
- )} -
+ { + this.props.createSource && ( +
+

Source Properties

+ { + sourceCreationPromise?.resolve(properties); + }} + ok={this.props.ok} + cancel={this.props.cancel} + formChangedSignal={this.sourceFormChangedSignal} + formErrorSignal={this.props.formErrorSignal} + dialogOptions={this.props.dialogOptions} + sourceType={this.props.sourceType} + /> +
+ ) + } + { + this.props.createLayer && ( +
+

Layer Properties

+ { + layerCreationPromise?.resolve(properties); + }} + ok={this.props.ok} + cancel={this.props.cancel} + sourceFormChangedSignal={this.sourceFormChangedSignal} + formErrorSignal={this.props.formErrorSignal} + dialogOptions={this.props.dialogOptions} + /> +
+ ) + } + ); } diff --git a/packages/base/src/tools.ts b/packages/base/src/tools.ts index 0660b3d00..49428928b 100644 --- a/packages/base/src/tools.ts +++ b/packages/base/src/tools.ts @@ -504,6 +504,9 @@ export const loadFile = async (fileInfo: { model: IJupyterGISModel; }) => { const { filepath, type, model } = fileInfo; + if (!filepath) { + return; + } if (filepath.startsWith('http://') || filepath.startsWith('https://')) { switch (type) { diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index 992777ff1..424c4ad3c 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -2,13 +2,19 @@ "type": "object", "description": "VectorLayer", "title": "IVectorLayer", - "required": ["source"], + "required": ["source", "type"], "additionalProperties": false, "properties": { "source": { "type": "string", "description": "The id of the source" }, + "type": { + "type": "string", + "enum": ["points", "polygons", "lines"], + "default": "points", + "description": "The type of vector layer" + }, "color": { "type": "object", "description": "The color of the the object" diff --git a/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py b/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py index 03319d0dd..9760d74f1 100644 --- a/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py +++ b/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py @@ -245,6 +245,7 @@ def add_geojson_layer( path: str | Path | None = None, data: Dict | None = None, name: str = "GeoJSON Layer", + type: "points" | "polygons" | "lines" = "points", opacity: float = 1, logical_op: str | None = None, feature: str | None = None, @@ -258,6 +259,7 @@ def add_geojson_layer( :param name: The name that will be used for the object in the document. :param path: The path to the JSON file or URL to embed into the jGIS file. :param data: The raw GeoJSON data to embed into the jGIS file. + :param type: The type of the vector layer to create. :param opacity: The opacity, between 0 and 1. :param color_expr: The style expression used to style the layer, defaults to None """ @@ -301,6 +303,7 @@ def add_geojson_layer( "visible": True, "parameters": { "source": source_id, + "type": type, "color": color_expr, "opacity": opacity, }, diff --git a/python/jupytergis_qgis/jupytergis_qgis/qgis_loader.py b/python/jupytergis_qgis/jupytergis_qgis/qgis_loader.py index 7d301bfe8..820b57cf8 100644 --- a/python/jupytergis_qgis/jupytergis_qgis/qgis_loader.py +++ b/python/jupytergis_qgis/jupytergis_qgis/qgis_loader.py @@ -783,7 +783,7 @@ def build_uri(parameters: dict[str, str], source_type: str) -> str | None: geometry_type = layer.get("parameters", {}).get("type") layer_params = layer.get("parameters", {}) - if geometry_type == "circle": + if geometry_type == "points": symbol = QgsMarkerSymbol() color_params = layer_params.get("color", {}) opacity = layer_params.get("opacity", 1.0) @@ -811,7 +811,7 @@ def build_uri(parameters: dict[str, str], source_type: str) -> str | None: symbology_state, geometry_type, color_params, symbol ) - elif geometry_type == "line": + elif geometry_type == "lines": symbol = QgsLineSymbol() symbol.setOutputUnit(Qgis.RenderUnit.Pixels) color_params = layer_params.get("color", {}) @@ -840,7 +840,7 @@ def build_uri(parameters: dict[str, str], source_type: str) -> str | None: symbology_state, geometry_type, color_params, symbol ) - elif geometry_type == "fill": + elif geometry_type == "polygons": symbol = QgsFillSymbol() symbol.setOutputUnit(Qgis.RenderUnit.Pixels) color_params = layer_params.get("color", {})