From c7a14f48db5571148e160c4dc8d9ca1e2b4d7d89 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 11 Jun 2025 09:55:39 -0600 Subject: [PATCH 01/11] WIP redo symbology schema --- .../schema/project/layers/vectorLayer.json | 99 +++++++++++++------ 1 file changed, 67 insertions(+), 32 deletions(-) diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index ad25aae59..9406cafa5 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -23,41 +23,76 @@ }, "symbologyState": { "type": "object", - "description": "The state of the symbology panel options", - "required": ["renderType"], + "description": "The state of the layer's symbology options", + "required": [], + "additionalProperties": false, "properties": { - "renderType": { - "type": "string", - "enum": ["Single Symbol", "Graduated", "Categorized"] + "color": { + "type": "object", + "description": "The state of the layer's color symbology options", + "required": ["renderType"], + "properties": { + "renderType": { + "type": "string", + "enum": ["Single Symbol", "Graduated", "Categorized", "Canonical", "Heatmap"] + }, + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for varying the color", + }, + "colorRamp": { + "type": "string", + "default": "cool" + }, + "nStops": { + "type": "string", + "default": "9" + }, + "stopsDistributionMode": { + "type": "string", + "default": "equal interval", + "enum": [ + "quantile", + "equal interval", + "jenks", + "pretty", + "logarithmic" + ] + } + } }, - "value": { - "type": "string" - }, - "method": { - "type": "string", - "enum": ["color", "radius"] - }, - "colorRamp": { - "type": "string", - "default": "cool" - }, - "nClasses": { - "type": "string", - "default": "9" - }, - "mode": { - "type": "string", - "default": "equal interval", - "enum": [ - "quantile", - "equal interval", - "jenks", - "pretty", - "logarithmic" - ] + "size": { + "type": "object", + "description": "The state of the layer's size symbology options (radius, line thickness etc.)", + "required": ["renderType"], + "properties": { + "renderType": { + "type": "string", + "enum": ["Single Symbol", "Graduated", "Canonical", "Categorized"] + }, + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for varying the size", + }, + "nStops": { + "type": "string", + "default": "9" + }, + "stopsDistributionMode": { + "type": "string", + "default": "equal interval", + "enum": [ + "quantile", + "equal interval", + "jenks", + "pretty", + "logarithmic" + ] + } + }, + "additionalProperties": false } - }, - "additionalProperties": false + } } } } From 5d20374b0c4f3d4ff98a2100b93800f98f2757b6 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 25 Jun 2025 08:15:34 -0600 Subject: [PATCH 02/11] Rename "symbologyState" schema field -> "symbology" We don't use the "state" suffix for anything else :) Co-authored-by: martinRenou Co-authored-by: Kristin Davis --- packages/schema/src/schema/project/layers/vectorLayer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index 9406cafa5..51426ac66 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -21,7 +21,7 @@ "minimum": 0, "maximum": 1 }, - "symbologyState": { + "symbology": { "type": "object", "description": "The state of the layer's symbology options", "required": [], From a203b1a740c84a1001bba9cc4e3acca264b0a2fe Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 25 Jun 2025 09:04:23 -0600 Subject: [PATCH 03/11] Flesh out the color and size sub-objects in symbology schema Co-authored-by: Kristin Davis Co-authored-by: martinRenou --- .../schema/project/layers/vectorLayer.json | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index 51426ac66..37d72d7ca 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -38,6 +38,7 @@ }, "selectedAttribute": { "type": "string", + "title": "Attribute", "description": "The selected attribute for varying the color", }, "colorRamp": { @@ -45,11 +46,13 @@ "default": "cool" }, "nStops": { - "type": "string", - "default": "9" + "type": "number", + "description": "The number of segments to use when mapping colors to data values", + "default": 9 }, "stopsDistributionMode": { "type": "string", + "description": "The method of distributing segments when mapping colors to data values", "default": "equal interval", "enum": [ "quantile", @@ -58,6 +61,11 @@ "pretty", "logarithmic" ] + }, + "strokeColor": { + "type": "string", + "description": "The color of the stroke for the symbol", + "default": "#ffffff" } } }, @@ -75,11 +83,13 @@ "description": "The selected attribute for varying the size", }, "nStops": { - "type": "string", - "default": "9" + "type": "number", + "description": "The number of segments to use when mapping colors to data values", + "default": 9 }, "stopsDistributionMode": { "type": "string", + "description": "The method of distributing segments when mapping colors to data values", "default": "equal interval", "enum": [ "quantile", @@ -88,6 +98,16 @@ "pretty", "logarithmic" ] + }, + "strokeThickness": { + "type": "number", + "description": "The thickness of the stroke in pixels", + "default": 1.25 + }, + "symbolRadius": { + "type": "number", + "description": "The radius of the symbols in pixels", + "default": 1 } }, "additionalProperties": false From 682814d6e4ae7beeaae108f8c3aadb7b47975515 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 25 Jun 2025 15:10:22 -0600 Subject: [PATCH 04/11] Extract symbology styles to own files --- .../schema/project/layers/vectorLayer.json | 97 +------------------ .../schema/symbology/geotiffMultiband.json | 24 +++++ .../schema/symbology/geotiffSingleband.json | 12 +++ .../src/schema/symbology/vectorColor.json | 54 +++++++++++ .../src/schema/symbology/vectorSize.json | 53 ++++++++++ packages/schema/src/types.ts | 8 ++ 6 files changed, 153 insertions(+), 95 deletions(-) create mode 100644 packages/schema/src/schema/symbology/geotiffMultiband.json create mode 100644 packages/schema/src/schema/symbology/geotiffSingleband.json create mode 100644 packages/schema/src/schema/symbology/vectorColor.json create mode 100644 packages/schema/src/schema/symbology/vectorSize.json diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index 37d72d7ca..850dab380 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -9,13 +9,9 @@ "type": "string", "description": "The id of the source" }, - "color": { - "type": "object", - "description": "The color of the the object" - }, "opacity": { "type": "number", - "description": "The opacity of the the object", + "description": "The opacity of the layer", "default": 1, "multipleOf": 0.1, "minimum": 0, @@ -23,96 +19,7 @@ }, "symbology": { "type": "object", - "description": "The state of the layer's symbology options", - "required": [], - "additionalProperties": false, - "properties": { - "color": { - "type": "object", - "description": "The state of the layer's color symbology options", - "required": ["renderType"], - "properties": { - "renderType": { - "type": "string", - "enum": ["Single Symbol", "Graduated", "Categorized", "Canonical", "Heatmap"] - }, - "selectedAttribute": { - "type": "string", - "title": "Attribute", - "description": "The selected attribute for varying the color", - }, - "colorRamp": { - "type": "string", - "default": "cool" - }, - "nStops": { - "type": "number", - "description": "The number of segments to use when mapping colors to data values", - "default": 9 - }, - "stopsDistributionMode": { - "type": "string", - "description": "The method of distributing segments when mapping colors to data values", - "default": "equal interval", - "enum": [ - "quantile", - "equal interval", - "jenks", - "pretty", - "logarithmic" - ] - }, - "strokeColor": { - "type": "string", - "description": "The color of the stroke for the symbol", - "default": "#ffffff" - } - } - }, - "size": { - "type": "object", - "description": "The state of the layer's size symbology options (radius, line thickness etc.)", - "required": ["renderType"], - "properties": { - "renderType": { - "type": "string", - "enum": ["Single Symbol", "Graduated", "Canonical", "Categorized"] - }, - "selectedAttribute": { - "type": "string", - "description": "The selected attribute for varying the size", - }, - "nStops": { - "type": "number", - "description": "The number of segments to use when mapping colors to data values", - "default": 9 - }, - "stopsDistributionMode": { - "type": "string", - "description": "The method of distributing segments when mapping colors to data values", - "default": "equal interval", - "enum": [ - "quantile", - "equal interval", - "jenks", - "pretty", - "logarithmic" - ] - }, - "strokeThickness": { - "type": "number", - "description": "The thickness of the stroke in pixels", - "default": 1.25 - }, - "symbolRadius": { - "type": "number", - "description": "The radius of the symbols in pixels", - "default": 1 - } - }, - "additionalProperties": false - } - } + "description": "The user inputs for symbology options" } } } diff --git a/packages/schema/src/schema/symbology/geotiffMultiband.json b/packages/schema/src/schema/symbology/geotiffMultiband.json new file mode 100644 index 000000000..90627f24a --- /dev/null +++ b/packages/schema/src/schema/symbology/geotiffMultiband.json @@ -0,0 +1,24 @@ +{ + "type": "object", + "description": "The state of the GeoTiff layer's multiband coloring symbology options", + "required": [], + "additionalProperties": false, + "properties": { + "red": { + "type": "string", + "description": "The name of the band used for the red channel." + }, + "green": { + "type": "string", + "description": "The name of the band used for the green channel." + }, + "blue": { + "type": "string", + "description": "The name of the band used for the blue channel." + }, + "alpha": { + "type": "string", + "description": "The name of the band used for the alpha channel." + } + } +} diff --git a/packages/schema/src/schema/symbology/geotiffSingleband.json b/packages/schema/src/schema/symbology/geotiffSingleband.json new file mode 100644 index 000000000..8895f94f5 --- /dev/null +++ b/packages/schema/src/schema/symbology/geotiffSingleband.json @@ -0,0 +1,12 @@ +{ + "type": "object", + "description": "The state of the GeoTiff layer's single band coloring symbology options", + "required": [], + "additionalProperties": false, + "properties": { + "band": { + "type": "string", + "description": "The name of the band used for coloring." + } + } +} diff --git a/packages/schema/src/schema/symbology/vectorColor.json b/packages/schema/src/schema/symbology/vectorColor.json new file mode 100644 index 000000000..10a637788 --- /dev/null +++ b/packages/schema/src/schema/symbology/vectorColor.json @@ -0,0 +1,54 @@ +{ + "type": "object", + "description": "The state of the layer's color symbology options (fill color, stroke color etc.)", + "required": ["renderType"], + "additionalProperties": false, + "properties": { + "renderType": { + "type": "string", + "enum": ["Single Symbol", "Graduated", "Categorized", "Canonical", "Heatmap"] + }, + "selectedAttribute": { + "type": "string", + "title": "Attribute", + "description": "The selected attribute for varying the color" + }, + "colorRamp": { + "type": "string", + "default": "cool" + }, + "nStops": { + "type": "number", + "description": "The number of segments to use when mapping colors to data values", + "default": 9 + }, + "stopsDistributionMode": { + "type": "string", + "description": "The method of distributing segments when mapping colors to data values", + "default": "equal interval", + "enum": [ + "quantile", + "equal interval", + "jenks", + "pretty", + "logarithmic" + ] + }, + "stopsValues": { + "type": "object", + "description": "The mapping of input data values to size values", + "patternProperties": { + "^[0-9]+$": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "description": "The hex color value at the stop index, where the key is the index of the stop" + } + } + }, + "strokeColor": { + "type": "string", + "description": "The color of the stroke for the symbol", + "default": "#ffffff" + } + } +} diff --git a/packages/schema/src/schema/symbology/vectorSize.json b/packages/schema/src/schema/symbology/vectorSize.json new file mode 100644 index 000000000..2ec21ed7b --- /dev/null +++ b/packages/schema/src/schema/symbology/vectorSize.json @@ -0,0 +1,53 @@ +{ + "type": "object", + "description": "The state of the layer's size symbology options (radius, line thickness etc.)", + "required": ["renderType"], + "additionalProperties": false, + "properties": { + "renderType": { + "type": "string", + "enum": ["Single Symbol", "Graduated", "Canonical", "Categorized"] + }, + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for varying the size" + }, + "nStops": { + "type": "number", + "description": "The number of segments to use when mapping colors to data values", + "default": 9 + }, + "stopsDistributionMode": { + "type": "string", + "description": "The method of distributing segments when mapping colors to data values", + "default": "equal interval", + "enum": [ + "quantile", + "equal interval", + "jenks", + "pretty", + "logarithmic" + ] + }, + "stopsValues": { + "type": "object", + "description": "The mapping of input data values to size values", + "patternProperties": { + "^[0-9]+$": { + "type": "number", + "description": "The size value in pixels at the stop index, where the key is the index of the stop" + } + } + }, + "strokeThickness": { + "type": "number", + "description": "The thickness of the stroke in pixels", + "default": 1.25 + }, + "symbolRadius": { + "type": "number", + "description": "The radius of the symbols in pixels", + "default": 1 + } + } +} diff --git a/packages/schema/src/types.ts b/packages/schema/src/types.ts index c6e2cd86d..fccc632c8 100644 --- a/packages/schema/src/types.ts +++ b/packages/schema/src/types.ts @@ -21,6 +21,13 @@ export * from './_interface/project/layers/stacLayer'; export * from './_interface/project/layers/vectorTileLayer'; export * from './_interface/project/layers/webGlLayer'; +// Symbology +export * from './_interface/symbology/vectorColor'; +export * from './_interface/symbology/vectorSize'; +export * from './_interface/symbology/geotiffSingleband'; +export * from './_interface/symbology/geotiffMultiband'; + + // Processing export * from './processing/_generated/exportProcessingSchema'; @@ -28,6 +35,7 @@ export * from './processing/_generated/exportProcessingSchema'; export * from './_interface/export/exportGeoJson'; export * from './_interface/export/exportGeoTiff'; + // Other export * from './doc'; export * from './index'; From f3731260b672a430a4eb0f3a3bc232626f7f0415 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 25 Jun 2025 15:10:48 -0600 Subject: [PATCH 05/11] Correct descriptions of opacity field --- packages/schema/src/schema/project/layers/heatmapLayer.json | 2 +- packages/schema/src/schema/project/layers/imageLayer.json | 2 +- packages/schema/src/schema/project/layers/rasterLayer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/schema/src/schema/project/layers/heatmapLayer.json b/packages/schema/src/schema/project/layers/heatmapLayer.json index 9b654d788..7942c2c52 100644 --- a/packages/schema/src/schema/project/layers/heatmapLayer.json +++ b/packages/schema/src/schema/project/layers/heatmapLayer.json @@ -11,7 +11,7 @@ }, "opacity": { "type": "number", - "description": "The opacity of the source", + "description": "The opacity of the layer", "default": 1, "multipleOf": 0.1, "minimum": 0, diff --git a/packages/schema/src/schema/project/layers/imageLayer.json b/packages/schema/src/schema/project/layers/imageLayer.json index 39ac323f5..51e71219e 100644 --- a/packages/schema/src/schema/project/layers/imageLayer.json +++ b/packages/schema/src/schema/project/layers/imageLayer.json @@ -11,7 +11,7 @@ }, "opacity": { "type": "number", - "description": "The opacity of the source", + "description": "The opacity of the layer", "default": 1, "multipleOf": 0.1, "minimum": 0, diff --git a/packages/schema/src/schema/project/layers/rasterLayer.json b/packages/schema/src/schema/project/layers/rasterLayer.json index c42509cba..bee350a8f 100644 --- a/packages/schema/src/schema/project/layers/rasterLayer.json +++ b/packages/schema/src/schema/project/layers/rasterLayer.json @@ -11,7 +11,7 @@ }, "opacity": { "type": "number", - "description": "The opacity of the source", + "description": "The opacity of the layer", "default": 1, "multipleOf": 0.1, "minimum": 0, From 11c77d8cc539575b47e35b15319e53b4de54d8c3 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 25 Jun 2025 17:13:03 -0600 Subject: [PATCH 06/11] Move symbology schemas into project/layers directory --- .../layers/symbology/geoTiffMultiBand.json} | 0 .../layers/symbology/geoTiffSingleBand.json} | 0 .../{ => project/layers}/symbology/vectorColor.json | 0 .../schema/{ => project/layers}/symbology/vectorSize.json | 0 packages/schema/src/types.ts | 8 ++++---- 5 files changed, 4 insertions(+), 4 deletions(-) rename packages/schema/src/schema/{symbology/geotiffMultiband.json => project/layers/symbology/geoTiffMultiBand.json} (100%) rename packages/schema/src/schema/{symbology/geotiffSingleband.json => project/layers/symbology/geoTiffSingleBand.json} (100%) rename packages/schema/src/schema/{ => project/layers}/symbology/vectorColor.json (100%) rename packages/schema/src/schema/{ => project/layers}/symbology/vectorSize.json (100%) diff --git a/packages/schema/src/schema/symbology/geotiffMultiband.json b/packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json similarity index 100% rename from packages/schema/src/schema/symbology/geotiffMultiband.json rename to packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json diff --git a/packages/schema/src/schema/symbology/geotiffSingleband.json b/packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json similarity index 100% rename from packages/schema/src/schema/symbology/geotiffSingleband.json rename to packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json diff --git a/packages/schema/src/schema/symbology/vectorColor.json b/packages/schema/src/schema/project/layers/symbology/vectorColor.json similarity index 100% rename from packages/schema/src/schema/symbology/vectorColor.json rename to packages/schema/src/schema/project/layers/symbology/vectorColor.json diff --git a/packages/schema/src/schema/symbology/vectorSize.json b/packages/schema/src/schema/project/layers/symbology/vectorSize.json similarity index 100% rename from packages/schema/src/schema/symbology/vectorSize.json rename to packages/schema/src/schema/project/layers/symbology/vectorSize.json diff --git a/packages/schema/src/types.ts b/packages/schema/src/types.ts index fccc632c8..d9246b316 100644 --- a/packages/schema/src/types.ts +++ b/packages/schema/src/types.ts @@ -22,10 +22,10 @@ export * from './_interface/project/layers/vectorTileLayer'; export * from './_interface/project/layers/webGlLayer'; // Symbology -export * from './_interface/symbology/vectorColor'; -export * from './_interface/symbology/vectorSize'; -export * from './_interface/symbology/geotiffSingleband'; -export * from './_interface/symbology/geotiffMultiband'; +export * from './_interface/project/layers/symbology/vectorColor'; +export * from './_interface/project/layers/symbology/vectorSize'; +export * from './_interface/project/layers/symbology/geoTiffSingleBand'; +export * from './_interface/project/layers/symbology/geoTiffMultiBand'; // Processing From 1a55a39b362faee0e65e99e67235ebf932b19449 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 2 Jul 2025 20:57:10 -0600 Subject: [PATCH 07/11] Add pre-processing script to enable all our code generation tools to work with $refs The root problem is that our TS-type-generation tool, jsonschema-to-typescript, expects $ref paths to be relative to the schema root directory, while our Python-type-generation tool, datamodel-codegen, expects $ref paths to be relative to the file containing the $ref. To work around this, I'm adding a pre-processing step to the Python type generation code which converts the paths to look like datamodel-codegen expects. --- .../schema/project/layers/symbology/vectorColor.json | 1 - .../schema/src/schema/project/layers/vectorLayer.json | 11 ++++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/schema/project/layers/symbology/vectorColor.json b/packages/schema/src/schema/project/layers/symbology/vectorColor.json index 10a637788..9b8900d5e 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorColor.json @@ -10,7 +10,6 @@ }, "selectedAttribute": { "type": "string", - "title": "Attribute", "description": "The selected attribute for varying the color" }, "colorRamp": { diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index 850dab380..f45c8274e 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -19,7 +19,16 @@ }, "symbology": { "type": "object", - "description": "The user inputs for symbology options" + "description": "The user inputs for symbology options", + "additionalProperties": false, + "properties": { + "color": { + "$ref": "project/layers/symbology/vectorColor.json" + }, + "size": { + "$ref": "project/layers/symbology/vectorSize.json" + } + } } } } From a85db589f0b16ede11d3155891bc50dcc35cb915 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 2 Jul 2025 21:06:26 -0600 Subject: [PATCH 08/11] Give symbology schemas titles --- .../src/schema/project/layers/symbology/vectorColor.json | 3 ++- .../schema/src/schema/project/layers/symbology/vectorSize.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/schema/project/layers/symbology/vectorColor.json b/packages/schema/src/schema/project/layers/symbology/vectorColor.json index 9b8900d5e..8a3572836 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorColor.json @@ -1,6 +1,7 @@ { - "type": "object", + "title": "IVectorColor", "description": "The state of the layer's color symbology options (fill color, stroke color etc.)", + "type": "object", "required": ["renderType"], "additionalProperties": false, "properties": { diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSize.json b/packages/schema/src/schema/project/layers/symbology/vectorSize.json index 2ec21ed7b..c7b521bd8 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorSize.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorSize.json @@ -1,6 +1,7 @@ { - "type": "object", + "title": "IVectorSize", "description": "The state of the layer's size symbology options (radius, line thickness etc.)", + "type": "object", "required": ["renderType"], "additionalProperties": false, "properties": { From fdcb860a0ac36926fb8763b6549aa911d8426b92 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Tue, 22 Jul 2025 16:38:07 -0600 Subject: [PATCH 09/11] Namespace types in barrel file for generated types --- packages/schema/src/types.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/schema/src/types.ts b/packages/schema/src/types.ts index d9246b316..5c8b41abb 100644 --- a/packages/schema/src/types.ts +++ b/packages/schema/src/types.ts @@ -1,3 +1,8 @@ +/* + * A "barrel" file (https://basarat.gitbook.io/typescript/main-1/barrel) making all + * types generated from JSONSchemas in the `schemas` directory available for + * import. + */ export * from './_interface/project/jgis'; // Sources @@ -22,10 +27,13 @@ export * from './_interface/project/layers/vectorTileLayer'; export * from './_interface/project/layers/webGlLayer'; // Symbology -export * from './_interface/project/layers/symbology/vectorColor'; -export * from './_interface/project/layers/symbology/vectorSize'; -export * from './_interface/project/layers/symbology/geoTiffSingleBand'; -export * from './_interface/project/layers/symbology/geoTiffMultiBand'; +// Use namespaced exports to avoid duplicate interface exports when $ref schemas +// are inlined by json-schema-to-typescript. This can be removed once +// https://github.com/bcherny/json-schema-to-typescript/pull/662 is merged. +export * as SymbologyVectorColor from './_interface/project/layers/symbology/vectorColor'; +export * as SymbologyVectorSize from './_interface/project/layers/symbology/vectorSize'; +export * as SymbologyGeoTiffSingleBand from './_interface/project/layers/symbology/geoTiffSingleBand'; +export * as SymbologyGeoTiffMultiBand from './_interface/project/layers/symbology/geoTiffMultiBand'; // Processing From ff52c8d65ac386ff978b26bbdcd744d499b4949a Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Tue, 22 Jul 2025 17:22:32 -0600 Subject: [PATCH 10/11] Split out schemas for various render types For now, the layer schema only references the graduated schema. We'll figure out how to make them mutually exclusive later! --- .../symbology/vectorCanonicalColor.json | 13 ++++++++ .../symbology/vectorCategorizedColor.json | 33 +++++++++++++++++++ .../symbology/vectorCategorizedSize.json | 33 +++++++++++++++++++ ...orColor.json => vectorGraduatedColor.json} | 12 +++---- ...ctorSize.json => vectorGraduatedSize.json} | 19 +++-------- .../layers/symbology/vectorHeatmapColor.json | 23 +++++++++++++ .../layers/symbology/vectorSimpleColor.json | 20 +++++++++++ .../layers/symbology/vectorSimpleSize.json | 18 ++++++++++ .../schema/project/layers/vectorLayer.json | 4 +-- packages/schema/src/types.ts | 10 ++++-- 10 files changed, 159 insertions(+), 26 deletions(-) create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json rename packages/schema/src/schema/project/layers/symbology/{vectorColor.json => vectorGraduatedColor.json} (81%) rename packages/schema/src/schema/project/layers/symbology/{vectorSize.json => vectorGraduatedSize.json} (71%) create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json create mode 100644 packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json b/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json new file mode 100644 index 000000000..7ae81f2c1 --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json @@ -0,0 +1,13 @@ +{ + "title": "IVectorCanonicalColor", + "description": "The state of the layer's canonical color symbology options", + "type": "object", + "required": ["selectedAttribute"], + "additionalProperties": false, + "properties": { + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for canonical color mapping" + } + } +} diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json new file mode 100644 index 000000000..25c3b73fc --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json @@ -0,0 +1,33 @@ +{ + "title": "IVectorCategorizedColor", + "description": "The state of the layer's categorized color symbology options", + "type": "object", + "required": ["selectedAttribute"], + "additionalProperties": false, + "properties": { + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for categorizing the color" + }, + "colorRamp": { + "type": "string", + "default": "cool" + }, + "stopsValues": { + "type": "object", + "description": "The mapping of category values to color values", + "patternProperties": { + ".*": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "description": "The hex color value for the category, where the key is the category value" + } + } + }, + "strokeColor": { + "type": "string", + "description": "The color of the stroke for the symbol", + "default": "#ffffff" + } + } +} diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json new file mode 100644 index 000000000..d7be22800 --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json @@ -0,0 +1,33 @@ +{ + "title": "IVectorCategorizedSize", + "description": "The state of the layer's categorized size symbology options", + "type": "object", + "required": ["selectedAttribute"], + "additionalProperties": false, + "properties": { + "selectedAttribute": { + "type": "string", + "description": "The selected attribute for categorizing the size" + }, + "stopsValues": { + "type": "object", + "description": "The mapping of category values to size values", + "patternProperties": { + ".*": { + "type": "number", + "description": "The size value in pixels for the category, where the key is the category value" + } + } + }, + "strokeThickness": { + "type": "number", + "description": "The thickness of the stroke in pixels", + "default": 1.25 + }, + "symbolRadius": { + "type": "number", + "description": "The radius of the symbols in pixels", + "default": 1 + } + } +} diff --git a/packages/schema/src/schema/project/layers/symbology/vectorColor.json b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json similarity index 81% rename from packages/schema/src/schema/project/layers/symbology/vectorColor.json rename to packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json index 8a3572836..f1be0e371 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json @@ -1,14 +1,10 @@ { - "title": "IVectorColor", - "description": "The state of the layer's color symbology options (fill color, stroke color etc.)", + "title": "IVectorGraduatedColor", + "description": "The state of the layer's graduated color symbology options", "type": "object", - "required": ["renderType"], + "required": ["selectedAttribute", "colorRamp"], "additionalProperties": false, "properties": { - "renderType": { - "type": "string", - "enum": ["Single Symbol", "Graduated", "Categorized", "Canonical", "Heatmap"] - }, "selectedAttribute": { "type": "string", "description": "The selected attribute for varying the color" @@ -36,7 +32,7 @@ }, "stopsValues": { "type": "object", - "description": "The mapping of input data values to size values", + "description": "The mapping of input data values to color values", "patternProperties": { "^[0-9]+$": { "type": "string", diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSize.json b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json similarity index 71% rename from packages/schema/src/schema/project/layers/symbology/vectorSize.json rename to packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json index c7b521bd8..bd5dec6e2 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorSize.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json @@ -1,26 +1,22 @@ { - "title": "IVectorSize", - "description": "The state of the layer's size symbology options (radius, line thickness etc.)", + "title": "IVectorGraduatedSize", + "description": "The state of the layer's graduated size symbology options", "type": "object", - "required": ["renderType"], + "required": ["selectedAttribute"], "additionalProperties": false, "properties": { - "renderType": { - "type": "string", - "enum": ["Single Symbol", "Graduated", "Canonical", "Categorized"] - }, "selectedAttribute": { "type": "string", "description": "The selected attribute for varying the size" }, "nStops": { "type": "number", - "description": "The number of segments to use when mapping colors to data values", + "description": "The number of segments to use when mapping size to data values", "default": 9 }, "stopsDistributionMode": { "type": "string", - "description": "The method of distributing segments when mapping colors to data values", + "description": "The method of distributing segments when mapping size to data values", "default": "equal interval", "enum": [ "quantile", @@ -44,11 +40,6 @@ "type": "number", "description": "The thickness of the stroke in pixels", "default": 1.25 - }, - "symbolRadius": { - "type": "number", - "description": "The radius of the symbols in pixels", - "default": 1 } } } diff --git a/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json b/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json new file mode 100644 index 000000000..d7256a9b5 --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json @@ -0,0 +1,23 @@ +{ + "title": "IVectorHeatmapColor", + "description": "The state of the layer's heatmap color symbology options", + "type": "object", + "required": ["selectedAttribute", "colorRamp"], + "additionalProperties": false, + "properties": { + "colorRamp": { + "type": "string", + "default": "cool" + }, + "radius": { + "type": "number", + "description": "The radius of influence for each point in the heatmap", + "default": 20 + }, + "blur": { + "type": "number", + "description": "The blur radius for the heatmap effect", + "default": 15 + } + } +} diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json b/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json new file mode 100644 index 000000000..b06d6917b --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json @@ -0,0 +1,20 @@ +{ + "title": "IVectorSimpleColor", + "description": "The state of the layer's simple (single symbol) color symbology options", + "type": "object", + "additionalProperties": false, + "properties": { + "fillColor": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "description": "The fill color for the symbol", + "default": "#3388ff" + }, + "strokeColor": { + "type": "string", + "pattern": "^#[0-9a-fA-F]{6}$", + "description": "The color of the stroke for the symbol", + "default": "#ffffff" + } + } +} diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json b/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json new file mode 100644 index 000000000..3861404a3 --- /dev/null +++ b/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json @@ -0,0 +1,18 @@ +{ + "title": "IVectorSimpleSize", + "description": "The state of the layer's simple (single symbol) size symbology options", + "type": "object", + "additionalProperties": false, + "properties": { + "strokeThickness": { + "type": "number", + "description": "The thickness of the stroke in pixels", + "default": 1.25 + }, + "symbolRadius": { + "type": "number", + "description": "The radius of the symbols in pixels", + "default": 5 + } + } +} diff --git a/packages/schema/src/schema/project/layers/vectorLayer.json b/packages/schema/src/schema/project/layers/vectorLayer.json index f45c8274e..01f9fb4a1 100644 --- a/packages/schema/src/schema/project/layers/vectorLayer.json +++ b/packages/schema/src/schema/project/layers/vectorLayer.json @@ -23,10 +23,10 @@ "additionalProperties": false, "properties": { "color": { - "$ref": "project/layers/symbology/vectorColor.json" + "$ref": "project/layers/symbology/vectorGraduatedColor.json" }, "size": { - "$ref": "project/layers/symbology/vectorSize.json" + "$ref": "project/layers/symbology/vectorGraduatedSize.json" } } } diff --git a/packages/schema/src/types.ts b/packages/schema/src/types.ts index 5c8b41abb..16c356ead 100644 --- a/packages/schema/src/types.ts +++ b/packages/schema/src/types.ts @@ -30,8 +30,14 @@ export * from './_interface/project/layers/webGlLayer'; // Use namespaced exports to avoid duplicate interface exports when $ref schemas // are inlined by json-schema-to-typescript. This can be removed once // https://github.com/bcherny/json-schema-to-typescript/pull/662 is merged. -export * as SymbologyVectorColor from './_interface/project/layers/symbology/vectorColor'; -export * as SymbologyVectorSize from './_interface/project/layers/symbology/vectorSize'; +export * as SymbologyVectorSimpleColor from './_interface/project/layers/symbology/vectorSimpleColor'; +export * as SymbologyVectorSimpleSize from './_interface/project/layers/symbology/vectorSimpleSize'; +export * as SymbologyVectorGraduatedColor from './_interface/project/layers/symbology/vectorGraduatedColor'; +export * as SymbologyVectorGraduatedSize from './_interface/project/layers/symbology/vectorGraduatedSize'; +export * as SymbologyVectorCategorizedColor from './_interface/project/layers/symbology/vectorCategorizedColor'; +export * as SymbologyVectorCategorizedSize from './_interface/project/layers/symbology/vectorCategorizedSize'; +export * as SymbologyVectorCanonicalColor from './_interface/project/layers/symbology/vectorCanonicalColor'; +export * as SymbologyVectorHeatmapColor from './_interface/project/layers/symbology/vectorHeatmapColor'; export * as SymbologyGeoTiffSingleBand from './_interface/project/layers/symbology/geoTiffSingleBand'; export * as SymbologyGeoTiffMultiBand from './_interface/project/layers/symbology/geoTiffMultiBand'; From 85db4080ad166ac951fc25d711e01e25f3f7b3a5 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Wed, 23 Jul 2025 10:09:59 -0600 Subject: [PATCH 11/11] Re-add render type to vector symbology schemas --- .../src/schema/project/layers/symbology/geoTiffMultiBand.json | 3 +++ .../src/schema/project/layers/symbology/geoTiffSingleBand.json | 3 +++ .../schema/project/layers/symbology/vectorCanonicalColor.json | 3 +++ .../project/layers/symbology/vectorCategorizedColor.json | 3 +++ .../schema/project/layers/symbology/vectorCategorizedSize.json | 3 +++ .../schema/project/layers/symbology/vectorGraduatedColor.json | 3 +++ .../schema/project/layers/symbology/vectorGraduatedSize.json | 3 +++ .../schema/project/layers/symbology/vectorHeatmapColor.json | 3 +++ .../src/schema/project/layers/symbology/vectorSimpleColor.json | 3 +++ .../src/schema/project/layers/symbology/vectorSimpleSize.json | 3 +++ 10 files changed, 30 insertions(+) diff --git a/packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json b/packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json index 90627f24a..ba18257d8 100644 --- a/packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json +++ b/packages/schema/src/schema/project/layers/symbology/geoTiffMultiBand.json @@ -4,6 +4,9 @@ "required": [], "additionalProperties": false, "properties": { + "type": { + "const": "Multiband" + }, "red": { "type": "string", "description": "The name of the band used for the red channel." diff --git a/packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json b/packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json index 8895f94f5..7d704616a 100644 --- a/packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json +++ b/packages/schema/src/schema/project/layers/symbology/geoTiffSingleBand.json @@ -4,6 +4,9 @@ "required": [], "additionalProperties": false, "properties": { + "type": { + "const": "Singleband" + }, "band": { "type": "string", "description": "The name of the band used for coloring." diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json b/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json index 7ae81f2c1..0b44c8f4c 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorCanonicalColor.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute"], "additionalProperties": false, "properties": { + "type": { + "const": "Canonical" + }, "selectedAttribute": { "type": "string", "description": "The selected attribute for canonical color mapping" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json index 25c3b73fc..c03fbbc26 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedColor.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute"], "additionalProperties": false, "properties": { + "type": { + "const": "Categorized" + }, "selectedAttribute": { "type": "string", "description": "The selected attribute for categorizing the color" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json index d7be22800..83210d300 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorCategorizedSize.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute"], "additionalProperties": false, "properties": { + "type": { + "const": "Categorized" + }, "selectedAttribute": { "type": "string", "description": "The selected attribute for categorizing the size" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json index f1be0e371..e23747fa6 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedColor.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute", "colorRamp"], "additionalProperties": false, "properties": { + "type": { + "const": "Graduated" + }, "selectedAttribute": { "type": "string", "description": "The selected attribute for varying the color" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json index bd5dec6e2..ac437a774 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorGraduatedSize.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute"], "additionalProperties": false, "properties": { + "type": { + "const": "Graduated" + }, "selectedAttribute": { "type": "string", "description": "The selected attribute for varying the size" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json b/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json index d7256a9b5..ba9f2f6e1 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorHeatmapColor.json @@ -5,6 +5,9 @@ "required": ["selectedAttribute", "colorRamp"], "additionalProperties": false, "properties": { + "type": { + "const": "Heatmap" + }, "colorRamp": { "type": "string", "default": "cool" diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json b/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json index b06d6917b..98203b836 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorSimpleColor.json @@ -4,6 +4,9 @@ "type": "object", "additionalProperties": false, "properties": { + "type": { + "const": "Simple symbol" + }, "fillColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$", diff --git a/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json b/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json index 3861404a3..dea69ae00 100644 --- a/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json +++ b/packages/schema/src/schema/project/layers/symbology/vectorSimpleSize.json @@ -4,6 +4,9 @@ "type": "object", "additionalProperties": false, "properties": { + "type": { + "const": "Simple symbol" + }, "strokeThickness": { "type": "number", "description": "The thickness of the stroke in pixels",