@jupytergis/schema 0.14.1 → 0.16.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/lib/_interface/forms.json +7834 -417
  2. package/lib/_interface/processing/clipRasterByExtent.d.ts +39 -0
  3. package/lib/_interface/processing/clipRasterByVector.d.ts +32 -0
  4. package/lib/_interface/processing/clipVectorByMaskLayer.d.ts +28 -0
  5. package/lib/_interface/processing/rasterize.d.ts +42 -0
  6. package/lib/_interface/project/jgis.d.ts +21 -4
  7. package/lib/_interface/project/layers/geoTiffLayer.d.ts +351 -0
  8. package/lib/_interface/project/layers/heatmapLayer.d.ts +8 -1
  9. package/lib/_interface/project/layers/openeoTileLayer.d.ts +20 -0
  10. package/lib/_interface/project/layers/storySegmentLayer.d.ts +6 -0
  11. package/lib/_interface/project/layers/vectorLayer.d.ts +615 -5
  12. package/lib/_interface/project/layers/vectorTileLayer.d.ts +582 -2
  13. package/lib/_interface/project/sources/geoJsonSource.d.ts +8 -0
  14. package/lib/_interface/project/sources/geoPackageRasterSource.d.ts +36 -0
  15. package/lib/_interface/project/sources/geoPackageVectorSource.d.ts +28 -0
  16. package/lib/_interface/project/sources/geoParquetSource.d.ts +8 -0
  17. package/lib/_interface/project/sources/geoTiffSource.d.ts +8 -0
  18. package/lib/_interface/project/sources/imageSource.d.ts +8 -0
  19. package/lib/_interface/project/sources/openeoTileSource.d.ts +26 -0
  20. package/lib/_interface/project/sources/rasterDemSource.d.ts +8 -0
  21. package/lib/_interface/project/sources/rasterSource.d.ts +8 -0
  22. package/lib/_interface/project/sources/shapefileSource.d.ts +8 -0
  23. package/lib/_interface/project/sources/vectorTileSource.d.ts +8 -0
  24. package/lib/_interface/project/sources/videoSource.d.ts +8 -0
  25. package/lib/_interface/project/sources/wmsTileSource.d.ts +40 -0
  26. package/lib/_interface/project/symbology.d.ts +305 -0
  27. package/lib/_interface/version.d.ts +1 -1
  28. package/lib/_interface/version.js +1 -1
  29. package/lib/doc.d.ts +9 -2
  30. package/lib/doc.js +49 -5
  31. package/lib/grammar/grammarConversions.d.ts +50 -0
  32. package/lib/grammar/grammarConversions.js +137 -0
  33. package/lib/index.d.ts +4 -0
  34. package/lib/index.js +2 -0
  35. package/lib/interfaces.d.ts +87 -19
  36. package/lib/interfaces.js +10 -1
  37. package/lib/migrations/index.d.ts +16 -0
  38. package/lib/migrations/index.js +52 -0
  39. package/lib/migrations/v0_5_to_v0_6.d.ts +11 -0
  40. package/lib/migrations/v0_5_to_v0_6.js +154 -0
  41. package/lib/model.d.ts +49 -13
  42. package/lib/model.js +214 -23
  43. package/lib/processing/ProcessingMerge.d.ts +4 -0
  44. package/lib/processing/ProcessingMerge.js +4 -0
  45. package/lib/processing/_generated/exportProcessingSchema.d.ts +7 -3
  46. package/lib/processing/_generated/exportProcessingSchema.js +7 -3
  47. package/lib/processing/_generated/processingType.d.ts +1 -1
  48. package/lib/processing/_generated/processingType.js +7 -3
  49. package/lib/processing/_generated/processing_merge.json +74 -19
  50. package/lib/schema/processing/clipRasterByExtent.json +39 -0
  51. package/lib/schema/processing/clipRasterByVector.json +33 -0
  52. package/lib/schema/processing/clipVectorByMaskLayer.json +27 -0
  53. package/lib/schema/processing/rasterize.json +45 -0
  54. package/lib/schema/project/jgis.json +35 -5
  55. package/lib/schema/project/layers/{webGlLayer.json → geoTiffLayer.json} +9 -3
  56. package/lib/schema/project/layers/heatmapLayer.json +7 -1
  57. package/lib/schema/project/layers/openeoTileLayer.json +21 -0
  58. package/lib/schema/project/layers/storySegmentLayer.json +14 -3
  59. package/lib/schema/project/layers/vectorLayer.json +93 -14
  60. package/lib/schema/project/layers/vectorTileLayer.json +34 -10
  61. package/lib/schema/project/sources/geoJsonSource.json +13 -0
  62. package/lib/schema/project/sources/geoPackageRasterSource.json +45 -0
  63. package/lib/schema/project/sources/geoPackageVectorSource.json +29 -0
  64. package/lib/schema/project/sources/geoParquetSource.json +13 -0
  65. package/lib/schema/project/sources/geoTiffSource.json +13 -0
  66. package/lib/schema/project/sources/imageSource.json +13 -0
  67. package/lib/schema/project/sources/openeoTileSource.json +23 -0
  68. package/lib/schema/project/sources/rasterDemSource.json +13 -0
  69. package/lib/schema/project/sources/rasterSource.json +13 -0
  70. package/lib/schema/project/sources/shapefileSource.json +13 -0
  71. package/lib/schema/project/sources/vectorTileSource.json +13 -0
  72. package/lib/schema/project/sources/videoSource.json +13 -0
  73. package/lib/schema/project/sources/wmsTileSource.json +48 -0
  74. package/lib/schema/project/symbology.json +418 -0
  75. package/lib/types.d.ts +16 -1
  76. package/lib/types.js +8 -1
  77. package/package.json +3 -1
  78. package/lib/_interface/project/layers/webGlLayer.d.ts +0 -39
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Migration from schema version 0.5.0 to 0.6.0.
3
+ *
4
+ * Converts legacy representations to Grammar symbologyState in one pass:
5
+ * - parameters.color (flat OL FlatStyle keys) → Grammar directly
6
+ * - parameters.symbologyState with old render types → Grammar
7
+ * - HeatmapLayer color array → symbologyState.gradient
8
+ * - WebGlLayer type → GeoTiffLayer
9
+ * - layer.filters → grammar layer-level when + whenOp (filters removed)
10
+ */
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ import { categorizedToGrammar, graduatedToGrammar, singleSymbolToGrammar, } from '../grammar/grammarConversions';
23
+ export function migrate(doc) {
24
+ var _a, _b;
25
+ const layers = Object.assign({}, doc.layers);
26
+ for (const [id, layer] of Object.entries(layers)) {
27
+ const newType = layer.type === 'WebGlLayer' ? 'GeoTiffLayer' : layer.type;
28
+ const params = layer === null || layer === void 0 ? void 0 : layer.parameters;
29
+ if (!params) {
30
+ if (newType !== layer.type) {
31
+ layers[id] = Object.assign(Object.assign({}, layer), { type: newType });
32
+ }
33
+ continue;
34
+ }
35
+ const newParams = Object.assign({}, params);
36
+ if (layer.type === 'VectorLayer' || layer.type === 'VectorTileLayer') {
37
+ const color = newParams.color;
38
+ if (color && typeof color === 'object' && !Array.isArray(color)) {
39
+ // Flat OL color dict → Grammar (skip intermediate symbologyState format)
40
+ newParams.symbologyState = singleSymbolToGrammar(_colorToState(color));
41
+ delete newParams.color;
42
+ }
43
+ else {
44
+ // Handle files that already carry old-style symbologyState (defensive)
45
+ const state = newParams.symbologyState;
46
+ if ((state === null || state === void 0 ? void 0 : state.renderType) && state.renderType !== 'Grammar') {
47
+ switch (state.renderType) {
48
+ case 'Single Symbol':
49
+ newParams.symbologyState = singleSymbolToGrammar(state);
50
+ break;
51
+ case 'Graduated':
52
+ newParams.symbologyState = graduatedToGrammar(state);
53
+ break;
54
+ case 'Categorized':
55
+ newParams.symbologyState = categorizedToGrammar(state);
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ else if (layer.type === 'HeatmapLayer') {
62
+ if (Array.isArray(newParams.color)) {
63
+ const state = (_a = newParams.symbologyState) !== null && _a !== void 0 ? _a : { renderType: 'Heatmap' };
64
+ if (!state.gradient) {
65
+ newParams.symbologyState = Object.assign(Object.assign({}, state), { gradient: newParams.color });
66
+ }
67
+ delete newParams.color;
68
+ }
69
+ }
70
+ // Convert legacy layer.filters → grammar layer-level when + whenOp.
71
+ const filters = layer.filters;
72
+ if ((_b = filters === null || filters === void 0 ? void 0 : filters.appliedFilters) === null || _b === void 0 ? void 0 : _b.length) {
73
+ const logicalOp = filters.logicalOp === 'any' ? 'any' : 'all';
74
+ const predicates = [];
75
+ for (const item of filters.appliedFilters) {
76
+ if (item.operator === 'between') {
77
+ if (item.betweenMin !== undefined && item.betweenMax !== undefined) {
78
+ predicates.push({
79
+ type: 'between',
80
+ field: item.feature,
81
+ min: item.betweenMin,
82
+ max: item.betweenMax,
83
+ });
84
+ }
85
+ }
86
+ else if (item.operator === '==') {
87
+ predicates.push({
88
+ type: 'fieldEquals',
89
+ field: item.feature,
90
+ value: item.value,
91
+ });
92
+ }
93
+ else {
94
+ predicates.push({
95
+ type: 'fieldCompare',
96
+ field: item.feature,
97
+ op: item.operator,
98
+ value: item.value,
99
+ });
100
+ }
101
+ }
102
+ if (predicates.length) {
103
+ const symbologyState = newParams.symbologyState;
104
+ if (Array.isArray(symbologyState === null || symbologyState === void 0 ? void 0 : symbologyState.layers) &&
105
+ symbologyState.layers.length > 0) {
106
+ newParams.symbologyState = Object.assign(Object.assign({}, symbologyState), { layers: symbologyState.layers.map((gl) => {
107
+ var _a, _b;
108
+ return (Object.assign(Object.assign({}, gl), { when: [...((_a = gl.when) !== null && _a !== void 0 ? _a : []), ...predicates], whenOp: (_b = gl.whenOp) !== null && _b !== void 0 ? _b : logicalOp }));
109
+ }) });
110
+ }
111
+ }
112
+ }
113
+ const _c = Object.assign(Object.assign({}, layer), { type: newType }), { filters: _ } = _c, layerWithoutFilters = __rest(_c, ["filters"]);
114
+ layers[id] = Object.assign(Object.assign({}, layerWithoutFilters), { parameters: newParams });
115
+ }
116
+ return Object.assign(Object.assign({}, doc), { layers });
117
+ }
118
+ /** Build a SymbologyState from a flat OL color dict. */
119
+ function _colorToState(color) {
120
+ var _a;
121
+ const state = { renderType: 'Single Symbol' };
122
+ const fill = _firstSolidColor(color['fill-color'], color['circle-fill-color']);
123
+ if (fill) {
124
+ state.fillColor = fill;
125
+ }
126
+ const stroke = _firstSolidColor(color['stroke-color'], color['circle-stroke-color']);
127
+ if (stroke) {
128
+ state.strokeColor = stroke;
129
+ }
130
+ const sw = (_a = color['stroke-width']) !== null && _a !== void 0 ? _a : color['circle-stroke-width'];
131
+ if (typeof sw === 'number') {
132
+ state.strokeWidth = sw;
133
+ }
134
+ const r = color['circle-radius'];
135
+ if (typeof r === 'number') {
136
+ state.radius = r;
137
+ }
138
+ return state;
139
+ }
140
+ function _firstSolidColor(...candidates) {
141
+ for (const c of candidates) {
142
+ if (Array.isArray(c) && c.length >= 3 && typeof c[0] === 'number') {
143
+ const [r = 0, g = 0, b = 0, a = 1] = c;
144
+ return [r, g, b, a];
145
+ }
146
+ if (typeof c === 'string') {
147
+ const m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(c);
148
+ if (m) {
149
+ return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1];
150
+ }
151
+ }
152
+ }
153
+ return undefined;
154
+ }
package/lib/model.d.ts CHANGED
@@ -7,8 +7,8 @@ import { PartialJSONObject } from '@lumino/coreutils';
7
7
  import { ISignal, Signal } from '@lumino/signaling';
8
8
  import { FeatureLike } from 'ol/Feature';
9
9
  import { IJGISContent, IJGISLayer, IJGISLayerGroup, IJGISLayerTree, IJGISLayers, IJGISOptions, IJGISSource, IJGISSources, IJGISStoryMap } from './_interface/project/jgis';
10
- import { IAnnotationModel, IDict, IJGISLayerDocChange, IJGISLayerTreeDocChange, IJGISSourceDocChange, IJupyterGISClientState, IJupyterGISDoc, IJupyterGISModel, ISelection, IUserData, IViewPortState, JgisCoordinates, Pointer, IJupyterGISSettings, SelectionType } from './interfaces';
11
- import { Modes } from './types';
10
+ import { IAwarenessFieldChange, IAnnotationModel, IIdentifiedFeatures, IJGISLayerDocChange, IJGISLayerTreeDocChange, IJGISSourceDocChange, IJGISUIState, IJupyterGISClientState, IJupyterGISDoc, IJupyterGISModel, ISelection, IStorySegmentRef, IUserData, IViewPortState, JgisCoordinates, Pointer, IJupyterGISSettings, SelectionType } from './interfaces';
11
+ import { IViewState, Modes } from './types';
12
12
  export declare class JupyterGISModel implements IJupyterGISModel {
13
13
  constructor(options: JupyterGISModel.IOptions);
14
14
  /**
@@ -48,7 +48,12 @@ export declare class JupyterGISModel implements IJupyterGISModel {
48
48
  get readOnly(): boolean;
49
49
  set readOnly(value: boolean);
50
50
  get localState(): IJupyterGISClientState | null;
51
- get clientStateChanged(): ISignal<this, Map<number, IJupyterGISClientState>>;
51
+ get selectedChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['selected']>>;
52
+ get pointerChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['pointer']>>;
53
+ get viewportStateChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['viewportState']>>;
54
+ get identifiedFeaturesChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['identifiedFeatures']>>;
55
+ get remoteUserChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['remoteUser']>>;
56
+ get temporalControllerActiveChanged(): ISignal<this, IAwarenessFieldChange<IJupyterGISClientState['isTemporalControllerActive']>>;
52
57
  get sharedOptionsChanged(): ISignal<IJupyterGISDoc, MapChange>;
53
58
  get sharedLayersChanged(): ISignal<IJupyterGISDoc, IJGISLayerDocChange>;
54
59
  get sharedLayerTreeChanged(): ISignal<IJupyterGISDoc, IJGISLayerTreeDocChange>;
@@ -72,7 +77,9 @@ export declare class JupyterGISModel implements IJupyterGISModel {
72
77
  readonly flyToGeometrySignal: Signal<this, any>;
73
78
  readonly highlightFeatureSignal: Signal<this, any>;
74
79
  readonly updateBboxSignal: Signal<this, any>;
80
+ readonly editingVectorLayerChanged: Signal<this, boolean>;
75
81
  getContent(): IJGISContent;
82
+ getViewState(): IViewState;
76
83
  /**
77
84
  * Getter for the contents manager.
78
85
  */
@@ -94,6 +101,7 @@ export declare class JupyterGISModel implements IJupyterGISModel {
94
101
  getSources(): IJGISSources;
95
102
  getLayerTree(): IJGISLayerTree;
96
103
  getLayer(id: string): IJGISLayer | undefined;
104
+ getExtent(id: string): number[] | undefined;
97
105
  getLayerOrSource(id: string): IJGISLayer | IJGISSource | undefined;
98
106
  getSource(id: string): IJGISSource | undefined;
99
107
  /**
@@ -124,6 +132,10 @@ export declare class JupyterGISModel implements IJupyterGISModel {
124
132
  * from root of layer tree.
125
133
  */
126
134
  addLayer(id: string, layer: IJGISLayer, groupName?: string, position?: number): void;
135
+ /**
136
+ * Update layer's extent and zoom in model's view state
137
+ */
138
+ updateLayerViewState(id: string, view: IViewState[string]): void;
127
139
  removeLayer(layer_id: string): void;
128
140
  removeSource(sourceId: string): void;
129
141
  setOptions(value: IJGISOptions): void;
@@ -133,13 +145,14 @@ export declare class JupyterGISModel implements IJupyterGISModel {
133
145
  syncSelected(value: {
134
146
  [key: string]: ISelection;
135
147
  }, emitter?: string): void;
148
+ syncLastAddedLayer(layerId: string): void;
136
149
  get selected(): {
137
150
  [key: string]: ISelection;
138
151
  } | undefined;
139
152
  set selected(value: {
140
153
  [key: string]: ISelection;
141
154
  } | undefined);
142
- syncIdentifiedFeatures(features: IDict<any>, emitter?: string): void;
155
+ syncIdentifiedFeatures(features: IIdentifiedFeatures, emitter?: string): void;
143
156
  setUserToFollow(userId?: number): void;
144
157
  setEditingItem(type: SelectionType, itemId: string): void;
145
158
  clearEditingItem(): void;
@@ -180,14 +193,17 @@ export declare class JupyterGISModel implements IJupyterGISModel {
180
193
  * Adds a story segment from the current map view
181
194
  * @returns Object with storySegmentId and storyMapId, or null if no extent/zoom found
182
195
  */
183
- addStorySegment(): {
184
- storySegmentId: string;
185
- storyId: string;
186
- } | null;
187
- get segmentAdded(): ISignal<this, {
188
- storySegmentId: string;
189
- storyId: string;
190
- }>;
196
+ addStorySegment(viewState?: IViewState[string]): IStorySegmentRef | null;
197
+ /**
198
+ * Generates a name for the next story segment based on the number of existing segments in the current story.
199
+ */
200
+ private _generateStorySegmentName;
201
+ /**
202
+ * Adds a story segment from a layer
203
+ * @returns Object with storySegmentId and storyMapId, or null if no extent/zoom found
204
+ */
205
+ createStorySegmentFromLayer(layerId: string): IStorySegmentRef | null;
206
+ get segmentAdded(): ISignal<this, IStorySegmentRef>;
191
207
  /**
192
208
  * Add an item in the layer tree.
193
209
  *
@@ -216,13 +232,21 @@ export declare class JupyterGISModel implements IJupyterGISModel {
216
232
  toggleMode(mode: Modes): void;
217
233
  get currentMode(): Modes;
218
234
  set currentMode(value: Modes);
235
+ setUIState(value: Partial<IJGISUIState>): void;
236
+ getUIState(): IJGISUIState;
237
+ get uiStateChanged(): ISignal<this, IJGISUIState>;
219
238
  toggleTemporalController(): void;
220
239
  private _getLayerTreeInfo;
221
240
  private _onClientStateChanged;
241
+ private _emitAwarenessFieldDeltas;
222
242
  addFeatureAsMs: (id: string, selectedFeature: string) => void;
223
243
  get addFeatureAsMsSignal(): Signal<this, string>;
224
244
  get updateLayerSignal(): Signal<this, string>;
225
245
  triggerLayerUpdate: (layerId: string, layer: IJGISLayer | IJGISSource) => void;
246
+ checkIfIsADrawVectorLayer(layer: IJGISLayer): boolean;
247
+ updateEditingVectorLayer(): void;
248
+ get editingVectorLayer(): boolean;
249
+ set editingVectorLayer(editingVectorLayer: boolean);
226
250
  get geolocation(): JgisCoordinates;
227
251
  set geolocation(geolocation: JgisCoordinates);
228
252
  get geolocationChanged(): Signal<this, JgisCoordinates>;
@@ -230,6 +254,8 @@ export declare class JupyterGISModel implements IJupyterGISModel {
230
254
  readonly defaultKernelLanguage: string;
231
255
  readonly annotationModel?: IAnnotationModel;
232
256
  readonly settingRegistry?: ISettingRegistry;
257
+ settingsReady: Promise<void>;
258
+ private _settingsReadyResolve;
233
259
  private _settings;
234
260
  private _settingsChanged;
235
261
  private _jgisSettings;
@@ -243,11 +269,18 @@ export declare class JupyterGISModel implements IJupyterGISModel {
243
269
  private _userChanged;
244
270
  private _usersMap?;
245
271
  private _pathChanged;
272
+ private _viewState;
246
273
  private _disposed;
247
274
  private _contentChanged;
248
275
  private _stateChanged;
249
276
  private _themeChanged;
250
- private _clientStateChanged;
277
+ private _selectedChanged;
278
+ private _pointerChanged;
279
+ private _viewportStateChanged;
280
+ private _identifiedFeaturesChanged;
281
+ private _remoteUserChanged;
282
+ private _temporalControllerActiveChanged;
283
+ private _previousClientStates;
251
284
  private _sharedMetadataChanged;
252
285
  private _zoomToPositionSignal;
253
286
  private _addFeatureAsMsSignal;
@@ -256,6 +289,7 @@ export declare class JupyterGISModel implements IJupyterGISModel {
256
289
  private _isTemporalControllerActive;
257
290
  private _editing;
258
291
  private _editingChanged;
292
+ private _editingVectorLayer;
259
293
  static worker: Worker;
260
294
  private _geolocation;
261
295
  private _geolocationChanged;
@@ -263,6 +297,8 @@ export declare class JupyterGISModel implements IJupyterGISModel {
263
297
  private _currentSegmentIndex;
264
298
  private _currentSegmentIndexChanged;
265
299
  stories: Map<string, IJGISStoryMap>;
300
+ private _localUIState;
301
+ private _uiStateChanged;
266
302
  }
267
303
  export declare namespace JupyterGISModel {
268
304
  /**