Skip to content

Commit fb41984

Browse files
committed
Vector tile source draft
1 parent ca09715 commit fb41984

File tree

8 files changed

+282
-19
lines changed

8 files changed

+282
-19
lines changed

examples/buildings.jGIS

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"layers": {
3+
"f99eb7b0-5e38-4078-b310-36a0746472aa": {
4+
"visible": true,
5+
"name": "OpenStreetMap.Mapnik Layer",
6+
"parameters": {
7+
"source": "ed8628b0-3e0a-45d5-9cd0-65e2a7dd61f5"
8+
},
9+
"type": "RasterLayer"
10+
},
11+
"148f2fb3-3077-4dcb-8d70-831570d5021f": {
12+
"type": "VectorLayer",
13+
"parameters": {
14+
"type": "line",
15+
"source": "7a7ee6fd-c1e2-4c5d-a4e2-a7974db138a4"
16+
},
17+
"name": "Vector Tile Source Layer",
18+
"visible": true
19+
}
20+
},
21+
"sources": {
22+
"ed8628b0-3e0a-45d5-9cd0-65e2a7dd61f5": {
23+
"parameters": {
24+
"urlParameters": {},
25+
"provider": "OpenStreetMap",
26+
"minZoom": 0.0,
27+
"url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
28+
"attribution": "(C) OpenStreetMap contributors",
29+
"maxZoom": 19.0
30+
},
31+
"type": "RasterSource",
32+
"name": "OpenStreetMap.Mapnik"
33+
},
34+
"7a7ee6fd-c1e2-4c5d-a4e2-a7974db138a4": {
35+
"type": "VectorTileSource",
36+
"name": "Vector Tile Source",
37+
"parameters": {
38+
"url": "https://planetarycomputer.microsoft.com/api/data/v1/vector/collections/ms-buildings/tilesets/global-footprints/tiles/{z}/{x}/{y}",
39+
"minZoom": 0.0,
40+
"maxZoom": 24.0
41+
}
42+
}
43+
},
44+
"options": {
45+
"latitude": 41.91867,
46+
"longitude": -88.10602,
47+
"zoom": 15.0
48+
},
49+
"layerTree": [
50+
"f99eb7b0-5e38-4078-b310-36a0746472aa",
51+
"148f2fb3-3077-4dcb-8d70-831570d5021f"
52+
]
53+
}

examples/test.jGIS

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"layers": {
33
"57ef55ef-facb-48a2-ae1d-c9c824be3e8a": {
4+
<<<<<<< HEAD
45
"parameters": {
56
"source": "7d082e75-69d5-447a-82d8-b05cca5945ba",
67
"type": "line",
@@ -17,6 +18,16 @@
1718
"name": "Open Topo Map",
1819
"parameters": {
1920
"source": "5fd42e3b-4681-4607-b15d-65c3a3e89b32"
21+
=======
22+
"visible": true,
23+
"name": "Regions France",
24+
"type": "VectorLayer",
25+
"parameters": {
26+
"color": "#26a269",
27+
"source": "7d082e75-69d5-447a-82d8-b05cca5945ba",
28+
"opacity": 1.0,
29+
"type": "line"
30+
>>>>>>> c391a08 (Vector tile source draft)
2031
}
2132
},
2233
"2467576f-b527-4cb7-998d-fa1d056fb8a1": {
@@ -26,9 +37,29 @@
2637
"type": "RasterLayer",
2738
"name": "Open Street Map",
2839
"visible": true
40+
},
41+
"a0044fd7-f167-445f-b3d1-620a8f94b498": {
42+
"parameters": {
43+
"source": "5fd42e3b-4681-4607-b15d-65c3a3e89b32"
44+
},
45+
"visible": true,
46+
"name": "Open Topo Map",
47+
"type": "RasterLayer"
48+
},
49+
"2112ce98-3cbb-4fae-bbff-655ee8cf205f": {
50+
"visible": true,
51+
"parameters": {
52+
"color": "#FF0000",
53+
"opacity": 1.0,
54+
"type": "fill",
55+
"source": "d52ab506-fd28-4708-b557-28b2b081ea20"
56+
},
57+
"name": "Vector layer test Layer",
58+
"type": "VectorLayer"
2959
}
3060
},
3161
"sources": {
62+
<<<<<<< HEAD
3263
"5fd42e3b-4681-4607-b15d-65c3a3e89b32": {
3364
"name": "Open Topo Map",
3465
"parameters": {
@@ -37,6 +68,16 @@
3768
"maxZoom": 24.0
3869
},
3970
"type": "RasterSource"
71+
=======
72+
"d52ab506-fd28-4708-b557-28b2b081ea20": {
73+
"name": "Vector layer test",
74+
"type": "VectorTileSource",
75+
"parameters": {
76+
"minZoom": null,
77+
"maxZoom": null,
78+
"url": "https://planetarycomputer.microsoft.com/api/data/v1/vector/collections/ms-buildings/tilesets/global-footprints/tiles/{z}/{x}/{y}"
79+
}
80+
>>>>>>> c391a08 (Vector tile source draft)
4081
},
4182
"7d082e75-69d5-447a-82d8-b05cca5945ba": {
4283
"name": "france_regions",
@@ -46,14 +87,33 @@
4687
},
4788
"type": "GeoJSONSource"
4889
},
90+
"5fd42e3b-4681-4607-b15d-65c3a3e89b32": {
91+
"name": "Open Topo Map",
92+
"parameters": {
93+
"url": "https://tile.opentopomap.org/{z}/{x}/{y}.png ",
94+
"maxZoom": 24.0,
95+
"minZoom": 0.0
96+
},
97+
"type": "RasterSource"
98+
},
4999
"699facc9-e7c4-4f38-acf1-1fd7f02d9f36": {
100+
<<<<<<< HEAD
50101
"type": "RasterSource",
51102
"name": "Open Street Map",
52103
"parameters": {
53104
"minZoom": 0.0,
54105
"maxZoom": 24.0,
55106
"url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
56107
}
108+
=======
109+
"name": "Open Street Map",
110+
"parameters": {
111+
"url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
112+
"minZoom": 0.0,
113+
"maxZoom": 24.0
114+
},
115+
"type": "RasterSource"
116+
>>>>>>> c391a08 (Vector tile source draft)
57117
}
58118
},
59119
"options": {
@@ -64,16 +124,17 @@
64124
"layerTree": [
65125
"a0044fd7-f167-445f-b3d1-620a8f94b498",
66126
{
67-
"name": "level 1 group",
68127
"layers": [
69128
"2467576f-b527-4cb7-998d-fa1d056fb8a1",
70129
{
71-
"name": "level 2 group",
72130
"layers": [
73131
"57ef55ef-facb-48a2-ae1d-c9c824be3e8a"
74-
]
132+
],
133+
"name": "level 2 group"
75134
}
76-
]
77-
}
135+
],
136+
"name": "level 1 group"
137+
},
138+
"2112ce98-3cbb-4fae-bbff-655ee8cf205f"
78139
]
79140
}

packages/base/src/commands.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ export namespace CommandIDs {
3737

3838
export const newGeoJSONLayer = 'jupytergis:newGeoJSONLayer';
3939
export const newGeoJSONSource = 'jupytergis:newGeoJSONSource';
40+
41+
export const newVectorTileLayer = 'jupytergis:newVectorTileLayer';
42+
4043
export const newVectorLayer = 'jupytergis:newVectorLayer';
4144
}
4245

@@ -125,6 +128,17 @@ export function addCommands(
125128
execute: Private.createVectorLayer(tracker)
126129
});
127130

131+
commands.addCommand(CommandIDs.newVectorTileLayer, {
132+
label: trans.__('New vector tile layer'),
133+
isEnabled: () => {
134+
return tracker.currentWidget
135+
? tracker.currentWidget.context.model.sharedModel.editable
136+
: false;
137+
},
138+
iconClass: 'fa fa-vector-square',
139+
execute: Private.createVectorTileLayer(tracker)
140+
});
141+
128142
commands.addCommand(CommandIDs.newGeoJSONSource, {
129143
label: trans.__('Add GeoJSON data from file'),
130144
isEnabled: () => {
@@ -200,6 +214,71 @@ namespace Private {
200214
};
201215
}
202216

217+
export function createVectorTileLayer(
218+
tracker: WidgetTracker<JupyterGISWidget>
219+
) {
220+
return async (args: any) => {
221+
const current = tracker.currentWidget;
222+
223+
if (!current) {
224+
return;
225+
}
226+
227+
const form = {
228+
title: 'Raster Layer parameters',
229+
default: (model: IJupyterGISModel) => {
230+
return {
231+
name: 'Vector Tile Source',
232+
url: 'https://planetarycomputer.microsoft.com/api/data/v1/vector/collections/ms-buildings/tilesets/global-footprints/tiles/{z}/{x}/{y}',
233+
maxZoom: 24,
234+
minZoom: 0
235+
};
236+
}
237+
};
238+
239+
const dialog = new FormDialog({
240+
context: current.context,
241+
title: form.title,
242+
sourceData: form.default(current.context.model),
243+
schema: FORM_SCHEMA['VectorTileSource'],
244+
syncData: (props: IDict) => {
245+
const sharedModel = current.context.model.sharedModel;
246+
if (!sharedModel) {
247+
return;
248+
}
249+
250+
const { name, ...parameters } = props;
251+
252+
const sourceId = UUID.uuid4();
253+
254+
const sourceModel: IJGISSource = {
255+
type: 'VectorTileSource',
256+
name,
257+
parameters: {
258+
url: parameters.url,
259+
minZoom: parameters.minZoom,
260+
maxZoom: parameters.maxZoom
261+
}
262+
};
263+
264+
const layerModel: IJGISLayer = {
265+
type: 'VectorLayer',
266+
parameters: {
267+
type: 'line',
268+
source: sourceId
269+
},
270+
visible: true,
271+
name: name + ' Layer'
272+
};
273+
274+
sharedModel.addSource(sourceId, sourceModel);
275+
current.context.model.addLayer(UUID.uuid4(), layerModel);
276+
}
277+
});
278+
await dialog.launch();
279+
};
280+
}
281+
203282
/**
204283
* Command to create a GeoJSON source.
205284
*

packages/base/src/mainview/mainview.tsx

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ export class MainView extends React.Component<IProps, IStates> {
166166
}
167167
break;
168168
}
169+
case 'VectorTileSource': {
170+
const mapSource = this._Map.getSource(id) as MapLibre.VectorTileSource;
171+
if (!mapSource) {
172+
this._Map.addSource(id, {
173+
type: 'vector',
174+
tiles: [this.computeSourceUrl(source)]
175+
});
176+
}
177+
break;
178+
}
169179
case 'GeoJSONSource': {
170180
const mapSource = this._Map.getSource(id) as MapLibre.GeoJSONSource;
171181
if (!mapSource) {
@@ -223,6 +233,12 @@ export class MainView extends React.Component<IProps, IStates> {
223233
]);
224234
break;
225235
}
236+
case 'VectorTileSource': {
237+
(mapSource as MapLibre.RasterTileSource).setTiles([
238+
this.computeSourceUrl(source)
239+
]);
240+
break;
241+
}
226242
case 'GeoJSONSource': {
227243
const data =
228244
source.parameters?.data ||
@@ -364,7 +380,8 @@ export class MainView extends React.Component<IProps, IStates> {
364380
this._Map.addLayer(
365381
{
366382
id: id,
367-
type: vectorLayerType,
383+
type: 'line',
384+
"source-layer": 'buildings',
368385
layout: {
369386
visibility: layer.visible ? 'visible' : 'none'
370387
},
@@ -374,18 +391,18 @@ export class MainView extends React.Component<IProps, IStates> {
374391
},
375392
beforeId
376393
);
377-
this._Map.setPaintProperty(
378-
id,
379-
`${vectorLayerType}-color`,
380-
layer.parameters?.color !== undefined
381-
? layer.parameters.color
382-
: '#FF0000'
383-
);
384-
this._Map.setPaintProperty(
385-
id,
386-
`${vectorLayerType}-opacity`,
387-
layer.parameters?.opacity !== undefined ? layer.parameters.opacity : 1
388-
);
394+
// this._Map.setPaintProperty(
395+
// id,
396+
// `${vectorLayerType}-color`,
397+
// layer.parameters?.color !== undefined
398+
// ? layer.parameters.color
399+
// : '#FF0000'
400+
// );
401+
// this._Map.setPaintProperty(
402+
// id,
403+
// `${vectorLayerType}-opacity`,
404+
// layer.parameters?.opacity !== undefined ? layer.parameters.opacity : 1
405+
// );
389406
break;
390407
}
391408
}

packages/base/src/toolbar/widget.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ export class ToolbarWidget extends Toolbar {
5555

5656
this.addItem('separator1', new Separator());
5757

58+
this.addItem(
59+
'newVectorTileLayer',
60+
new CommandToolbarButton({
61+
id: CommandIDs.newVectorTileLayer,
62+
label: '',
63+
commands: options.commands
64+
})
65+
);
66+
5867
this.addItem(
5968
'openLayerBrowser',
6069
new CommandToolbarButton({

packages/schema/src/schema/jgis.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"sourceType": {
2626
"type": "string",
27-
"enum": ["RasterSource", "GeoJSONSource"]
27+
"enum": ["RasterSource", "VectorTileSource", "GeoJSONSource"]
2828
},
2929
"jGISLayer": {
3030
"title": "IJGISLayer",

packages/schema/src/schema/vectorLayer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"type": {
1313
"type": "string",
1414
"enum": ["circle", "fill", "line"],
15+
"default": "line",
1516
"description": "The type of vector layer"
1617
},
1718
"color": {

0 commit comments

Comments
 (0)