From b7999317c20bc1b58620bd5973c11b9667007105 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Wed, 30 Apr 2025 20:54:22 +0530 Subject: [PATCH 1/8] Remove `type` property from vectorlayer --- .../schema/src/schema/project/layers/vectorlayer.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/schema/src/schema/project/layers/vectorlayer.json b/packages/schema/src/schema/project/layers/vectorlayer.json index 1d82e7d62..ad25aae59 100644 --- a/packages/schema/src/schema/project/layers/vectorlayer.json +++ b/packages/schema/src/schema/project/layers/vectorlayer.json @@ -2,19 +2,13 @@ "type": "object", "description": "VectorLayer", "title": "IVectorLayer", - "required": ["source", "type"], + "required": ["source"], "additionalProperties": false, "properties": { "source": { "type": "string", "description": "The id of the source" }, - "type": { - "type": "string", - "enum": ["circle", "fill", "line"], - "default": "line", - "description": "The type of vector layer" - }, "color": { "type": "object", "description": "The color of the the object" From a09ea16d22b1b8d38287b0d6f37b2e63cc3dd111 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Wed, 30 Apr 2025 22:37:07 +0530 Subject: [PATCH 2/8] remove conditions using type --- .../symbology/vector_layer/types/Categorized.tsx | 13 +++---------- .../symbology/vector_layer/types/Graduated.tsx | 8 -------- .../symbology/vector_layer/types/SimpleSymbol.tsx | 5 +---- 3 files changed, 4 insertions(+), 22 deletions(-) diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/Categorized.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/Categorized.tsx index f981358c0..141541782 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/Categorized.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/Categorized.tsx @@ -116,18 +116,11 @@ const Categorized = ({ colorExpr.push([0, 0, 0, 0.0]); const newStyle = { ...layer.parameters.color }; + newStyle['fill-color'] = colorExpr; - if (layer.parameters.type === 'fill') { - newStyle['fill-color'] = colorExpr; - } - - if (layer.parameters.type === 'line') { - newStyle['stroke-color'] = colorExpr; - } + newStyle['stroke-color'] = colorExpr; - if (layer.parameters.type === 'circle') { - newStyle['circle-fill-color'] = colorExpr; - } + newStyle['circle-fill-color'] = colorExpr; const symbologyState = { renderType: 'Categorized', diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx index b7f123406..19292a0a2 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx @@ -126,23 +126,15 @@ const Graduated = ({ const newStyle = { ...layer.parameters.color }; if (selectedMethodRef.current === 'color') { - if (layer.parameters.type === 'fill') { newStyle['fill-color'] = colorExpr; - } - if (layer.parameters.type === 'line') { newStyle['stroke-color'] = colorExpr; - } - if (layer.parameters.type === 'circle') { newStyle['circle-fill-color'] = colorExpr; - } } if (selectedMethodRef.current === 'radius') { - if (layer.parameters.type === 'circle') { newStyle['circle-radius'] = colorExpr; - } } const symbologyState = { diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx index 923eaa1d8..c5ff2ace6 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx @@ -86,10 +86,7 @@ const SimpleSymbol = ({ const styleExpr: FlatStyle = {}; const prefix = layer.parameters.type === 'circle' ? 'circle-' : ''; - - if (layer.parameters.type === 'circle') { - styleExpr['circle-radius'] = styleRef.current?.radius; - } + styleExpr['circle-radius'] = styleRef.current?.radius; styleExpr[`${prefix}fill-color`] = styleRef.current?.fillColor; styleExpr[`${prefix}stroke-color`] = styleRef.current?.strokeColor; From 02fbce7861ec917a56f329ef0919bcf72597d2a5 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Sun, 4 May 2025 20:52:15 +0530 Subject: [PATCH 3/8] lint and fix test --- .../dialogs/symbology/vector_layer/types/Graduated.tsx | 8 ++++---- ui-tests/tests/geojson-layers.spec.ts | 3 --- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx index 19292a0a2..6a7f72e88 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/Graduated.tsx @@ -126,15 +126,15 @@ const Graduated = ({ const newStyle = { ...layer.parameters.color }; if (selectedMethodRef.current === 'color') { - newStyle['fill-color'] = colorExpr; + newStyle['fill-color'] = colorExpr; - newStyle['stroke-color'] = colorExpr; + newStyle['stroke-color'] = colorExpr; - newStyle['circle-fill-color'] = colorExpr; + newStyle['circle-fill-color'] = colorExpr; } if (selectedMethodRef.current === 'radius') { - newStyle['circle-radius'] = colorExpr; + newStyle['circle-radius'] = colorExpr; } const symbologyState = { diff --git a/ui-tests/tests/geojson-layers.spec.ts b/ui-tests/tests/geojson-layers.spec.ts index 34992d6ed..010fef6ef 100644 --- a/ui-tests/tests/geojson-layers.spec.ts +++ b/ui-tests/tests/geojson-layers.spec.ts @@ -64,9 +64,6 @@ test.describe('#geoJSONLayer', () => { await fileInput.fill('france_regions.json'); await fileInput.blur(); - const typeInput = dialog.locator('select#root_type'); - typeInput.selectOption('line'); - await dialog.getByText('Ok', { exact: true }).first().click(); await expect(dialog).not.toBeAttached(); From f9bc9b0cdd5fd26848e34c69be3626fda62a8ebe Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Tue, 13 May 2025 03:26:22 +0530 Subject: [PATCH 4/8] set style for circle and non circle --- .../src/dialogs/symbology/symbologyUtils.ts | 60 +++++++++---------- .../vector_layer/types/SimpleSymbol.tsx | 31 +++++----- packages/base/src/tools.ts | 43 ++++--------- 3 files changed, 58 insertions(+), 76 deletions(-) diff --git a/packages/base/src/dialogs/symbology/symbologyUtils.ts b/packages/base/src/dialogs/symbology/symbologyUtils.ts index 6861262e8..9914ae6c6 100644 --- a/packages/base/src/dialogs/symbology/symbologyUtils.ts +++ b/packages/base/src/dialogs/symbology/symbologyUtils.ts @@ -16,39 +16,37 @@ export namespace VectorUtils { return []; } - const prefix = layer.parameters.type === 'circle' ? 'circle-' : ''; - - if (!color[`${prefix}fill-color`]) { - return []; - } - + const keys = ['fill-color', 'circle-fill-color']; const valueColorPairs: IStopRow[] = []; - // So if it's not a string then it's an array and we parse - // Color[0] is the operator used for the color expression - switch (color[`${prefix}fill-color`][0]) { - case 'interpolate': - // First element is interpolate for linear selection - // Second element is type of interpolation (ie linear) - // Third is input value that stop values are compared with - // Fourth and on is value:color pairs - for (let i = 3; i < color[`${prefix}fill-color`].length; i += 2) { - const obj: IStopRow = { - stop: color[`${prefix}fill-color`][i], - output: color[`${prefix}fill-color`][i + 1] - }; - valueColorPairs.push(obj); - } - break; - case 'case': - for (let i = 1; i < color[`${prefix}fill-color`].length - 1; i += 2) { - const obj: IStopRow = { - stop: color[`${prefix}fill-color`][i][2], - output: color[`${prefix}fill-color`][i + 1] - }; - valueColorPairs.push(obj); - } - break; + for (const key of keys) { + if (!color[key]) { + continue; + } + + switch (color[key][0]) { + case 'interpolate': + // First element is interpolate for linear selection + // Second element is type of interpolation (ie linear) + // Third is input value that stop values are compared with + // Fourth and on is value:color pairs + for (let i = 3; i < color[key].length; i += 2) { + valueColorPairs.push({ + stop: color[key][i], + output: color[key][i + 1] + }); + } + break; + + case 'case': + for (let i = 1; i < color[key].length - 1; i += 2) { + valueColorPairs.push({ + stop: color[key][i][2], + output: color[key][i + 1] + }); + } + break; + } } return valueColorPairs; diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx index c5ff2ace6..61b5da21d 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx @@ -38,23 +38,19 @@ const SimpleSymbol = ({ return; } - setUseCircleStuff(layer.parameters.type === 'circle'); + // Removed use of type + setUseCircleStuff(true); // or remove entirely if unnecessary - // Mimicking QGIS here, - // Read values from file if we chose them using the single symbol thing - // but if we're switching to simple symbol, use defaults const initStyle = async () => { if (!layer.parameters) { return; } + const renderType = layer.parameters?.symbologyState.renderType; if (renderType === 'Single Symbol') { - // Read from current color or use defaults - const parsedStyle = parseColor( - layer.parameters.type, - layer.parameters.color - ); + // Parse with fallback logic inside + const parsedStyle = parseColor(layer.parameters.color); if (parsedStyle) { setStyle(parsedStyle); @@ -85,14 +81,19 @@ const SimpleSymbol = ({ const styleExpr: FlatStyle = {}; - const prefix = layer.parameters.type === 'circle' ? 'circle-' : ''; styleExpr['circle-radius'] = styleRef.current?.radius; - styleExpr[`${prefix}fill-color`] = styleRef.current?.fillColor; - styleExpr[`${prefix}stroke-color`] = styleRef.current?.strokeColor; - styleExpr[`${prefix}stroke-width`] = styleRef.current?.strokeWidth; - styleExpr[`${prefix}stroke-line-join`] = styleRef.current?.joinStyle; - styleExpr[`${prefix}stroke-line-cap`] = styleRef.current?.capStyle; + styleExpr['circle-fill-color'] = styleRef.current?.fillColor; + styleExpr['circle-stroke-color'] = styleRef.current?.strokeColor; + styleExpr['circle-stroke-width'] = styleRef.current?.strokeWidth; + styleExpr['circle-stroke-line-join'] = styleRef.current?.joinStyle; + styleExpr['circle-stroke-line-cap'] = styleRef.current?.capStyle; + + styleExpr['fill-color'] = styleRef.current?.fillColor; + styleExpr['stroke-color'] = styleRef.current?.strokeColor; + styleExpr['stroke-width'] = styleRef.current?.strokeWidth; + styleExpr['stroke-line-join'] = styleRef.current?.joinStyle; + styleExpr['stroke-line-cap'] = styleRef.current?.capStyle; const symbologyState = { renderType: 'Single Symbol' diff --git a/packages/base/src/tools.ts b/packages/base/src/tools.ts index 7114612a9..b3dd59286 100644 --- a/packages/base/src/tools.ts +++ b/packages/base/src/tools.ts @@ -300,41 +300,24 @@ export interface IParsedStyle { radius?: number; } -export function parseColor(type: string, style: any) { - if (!type || !style) { +export function parseColor(style: any): IParsedStyle | undefined { + if (!style) { return; } - const type2 = type === 'circle' ? 'circle' : 'default'; - - const shapeStyles: any = { - circle: { - radius: style['circle-radius'] ?? 5, - fillColor: style['circle-fill-color'] ?? '#3399CC', - strokeColor: style['circle-stroke-color'] ?? '#3399CC', - strokeWidth: style['circle-stroke-width'] ?? 1.25, - joinStyle: style['circle-stroke-line-join'] ?? 'round', - capStyle: style['circle-stroke-line-cap'] ?? 'round' - }, - default: { - fillColor: style['fill-color'] ?? '[255, 255, 255, 0.4]', - strokeColor: style['stroke-color'] ?? '#3399CC', - strokeWidth: style['stroke-width'] ?? 1.25, - capStyle: style['stroke-line-cap'] ?? 'round', - joinStyle: style['stroke-line-join'] ?? 'round' - } + const parsedStyle: IParsedStyle = { + radius: style['circle-radius'] ?? 5, + fillColor: style['circle-fill-color'] ?? style['fill-color'] ?? '#3399CC', + strokeColor: + style['circle-stroke-color'] ?? style['stroke-color'] ?? '#3399CC', + strokeWidth: style['circle-stroke-width'] ?? style['stroke-width'] ?? 1.25, + joinStyle: + style['circle-stroke-line-join'] ?? style['stroke-line-join'] ?? 'round', + capStyle: + style['circle-stroke-line-cap'] ?? style['stroke-line-cap'] ?? 'round' }; - const parsedStyle: IParsedStyle = shapeStyles[type2]; - - Object.assign(parsedStyle, { - radius: parsedStyle.radius, - fillColor: parsedStyle.fillColor, - strokeColor: parsedStyle.strokeColor, - strokeWidth: parsedStyle.strokeWidth, - joinStyle: parsedStyle.joinStyle, - capStyle: parsedStyle.capStyle - }); + console.log('Parsed style:', parsedStyle); return parsedStyle; } From d00d0e697ef08e21db0fe57af09d1d5f0a6f4e46 Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Tue, 13 May 2025 16:01:06 +0530 Subject: [PATCH 5/8] Also remove type from vector in python api --- python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py b/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py index 6589f97cd..a29a48497 100644 --- a/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py +++ b/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py @@ -245,7 +245,6 @@ def add_geojson_layer( path: str | Path | None = None, data: Dict | None = None, name: str = "GeoJSON Layer", - type: "circle" | "fill" | "line" = "line", opacity: float = 1, logical_op: str | None = None, feature: str | None = None, @@ -259,7 +258,6 @@ 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 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 """ @@ -297,7 +295,6 @@ def add_geojson_layer( "visible": True, "parameters": { "source": source_id, - "type": type, "color": color_expr, "opacity": opacity, }, From 619fdc5ebf1db31f030b34bb39bcbc11c46ee1dd Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Tue, 13 May 2025 17:41:54 +0530 Subject: [PATCH 6/8] Also remove type from vectorTileLayer --- .../schema/src/schema/project/layers/vectorTileLayer.json | 8 +------- .../jupytergis_lab/notebook/gis_document.py | 2 -- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/schema/src/schema/project/layers/vectorTileLayer.json b/packages/schema/src/schema/project/layers/vectorTileLayer.json index 96bab5593..1fd9cc6fb 100644 --- a/packages/schema/src/schema/project/layers/vectorTileLayer.json +++ b/packages/schema/src/schema/project/layers/vectorTileLayer.json @@ -2,19 +2,13 @@ "type": "object", "description": "VectorTileLayer", "title": "IVectorTileLayer", - "required": ["source", "type"], + "required": ["source"], "additionalProperties": false, "properties": { "source": { "type": "string", "description": "The id of the source" }, - "type": { - "type": "string", - "enum": ["circle", "fill", "line"], - "default": "line", - "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 a29a48497..4cee7dde0 100644 --- a/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py +++ b/python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py @@ -185,7 +185,6 @@ def add_vectortile_layer( attribution: str = "", min_zoom: int = 0, max_zoom: int = 24, - type: Literal["circle", "fill", "line"] = "line", color_expr=None, opacity: float = 1, logical_op: str | None = None, @@ -225,7 +224,6 @@ def add_vectortile_layer( "visible": True, "parameters": { "source": source_id, - "type": type, "opacity": opacity, "color": color_expr, "opacity": opacity, From 9da07a8e271a38e20bb638af9a80fe8982d9ae9e Mon Sep 17 00:00:00 2001 From: Arjun Verma Date: Tue, 13 May 2025 19:02:53 +0530 Subject: [PATCH 7/8] Update packages/base/src/tools.ts Co-authored-by: Greg Mooney --- packages/base/src/tools.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/base/src/tools.ts b/packages/base/src/tools.ts index b3dd59286..586c0b17b 100644 --- a/packages/base/src/tools.ts +++ b/packages/base/src/tools.ts @@ -317,7 +317,6 @@ export function parseColor(style: any): IParsedStyle | undefined { style['circle-stroke-line-cap'] ?? style['stroke-line-cap'] ?? 'round' }; - console.log('Parsed style:', parsedStyle); return parsedStyle; } From 22126a5457eb978e01ac661ef1c012e874fe45df Mon Sep 17 00:00:00 2001 From: arjxn-py Date: Tue, 13 May 2025 20:04:06 +0530 Subject: [PATCH 8/8] remove `useCircleStuff` and `setUseCircleStuff` --- .../vector_layer/types/SimpleSymbol.tsx | 118 ++++++++---------- packages/base/src/tools.ts | 1 - 2 files changed, 50 insertions(+), 69 deletions(-) diff --git a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx index 61b5da21d..76c1a0130 100644 --- a/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx +++ b/packages/base/src/dialogs/symbology/vector_layer/types/SimpleSymbol.tsx @@ -12,7 +12,6 @@ const SimpleSymbol = ({ }: ISymbologyDialogProps) => { const styleRef = useRef(); - const [useCircleStuff, setUseCircleStuff] = useState(false); const [style, setStyle] = useState({ fillColor: '#3399CC', joinStyle: 'round', @@ -38,9 +37,6 @@ const SimpleSymbol = ({ return; } - // Removed use of type - setUseCircleStuff(true); // or remove entirely if unnecessary - const initStyle = async () => { if (!layer.parameters) { return; @@ -79,21 +75,19 @@ const SimpleSymbol = ({ return; } - const styleExpr: FlatStyle = {}; - - styleExpr['circle-radius'] = styleRef.current?.radius; - - styleExpr['circle-fill-color'] = styleRef.current?.fillColor; - styleExpr['circle-stroke-color'] = styleRef.current?.strokeColor; - styleExpr['circle-stroke-width'] = styleRef.current?.strokeWidth; - styleExpr['circle-stroke-line-join'] = styleRef.current?.joinStyle; - styleExpr['circle-stroke-line-cap'] = styleRef.current?.capStyle; - - styleExpr['fill-color'] = styleRef.current?.fillColor; - styleExpr['stroke-color'] = styleRef.current?.strokeColor; - styleExpr['stroke-width'] = styleRef.current?.strokeWidth; - styleExpr['stroke-line-join'] = styleRef.current?.joinStyle; - styleExpr['stroke-line-cap'] = styleRef.current?.capStyle; + const styleExpr: FlatStyle = { + 'circle-radius': styleRef.current?.radius, + 'circle-fill-color': styleRef.current?.fillColor, + 'circle-stroke-color': styleRef.current?.strokeColor, + 'circle-stroke-width': styleRef.current?.strokeWidth, + 'circle-stroke-line-join': styleRef.current?.joinStyle, + 'circle-stroke-line-cap': styleRef.current?.capStyle, + 'fill-color': styleRef.current?.fillColor, + 'stroke-color': styleRef.current?.strokeColor, + 'stroke-width': styleRef.current?.strokeWidth, + 'stroke-line-join': styleRef.current?.joinStyle, + 'stroke-line-cap': styleRef.current?.capStyle + }; const symbologyState = { renderType: 'Single Symbol' @@ -109,22 +103,20 @@ const SimpleSymbol = ({ return (
- {useCircleStuff ? ( -
- - - setStyle(prevState => ({ - ...prevState, - radius: +event.target.value - })) - } - /> -
- ) : null} +
+ + + setStyle(prevState => ({ + ...prevState, + radius: +event.target.value + })) + } + /> +
{joinStyleOptions.map((method, index) => ( - ))}
- {useCircleStuff ? ( -
- -
- -
+
+ +
+
- ) : null} +
); }; diff --git a/packages/base/src/tools.ts b/packages/base/src/tools.ts index 586c0b17b..59aa534cd 100644 --- a/packages/base/src/tools.ts +++ b/packages/base/src/tools.ts @@ -317,7 +317,6 @@ export function parseColor(style: any): IParsedStyle | undefined { style['circle-stroke-line-cap'] ?? style['stroke-line-cap'] ?? 'round' }; - return parsedStyle; }