@masterportal/masterportalapi 2.23.0 → 2.25.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.
- package/CHANGELOG.md +57 -6
- package/example/config/portal.json +7 -1
- package/example/config/services.json +10 -0
- package/example/index.js +1 -1
- package/jest.config.js +3 -0
- package/package.json +66 -65
- package/src/index.js +0 -2
- package/src/layer/geojson/index.js +7 -5
- package/src/layer/oaf.js +3 -2
- package/src/layer/terrain.js +8 -6
- package/src/layer/tileset.js +14 -5
- package/src/layer/vectorBase.js +2 -2
- package/src/layer/vectorTile.js +32 -8
- package/src/layer/wfs.js +4 -3
- package/src/layer/wmts.js +4 -2
- package/src/maps/interactions/drawInteraction.js +27 -3
- package/src/maps/ol/olMap.js +0 -2
- package/src/maps/olcs/3dUtils/wmsRasterSynchronizer.js +2 -2
- package/src/maps/olcs/olcsMap.js +2 -2
- package/src/renderer/webgl.js +140 -23
- package/src/vectorStyle/styleList.js +8 -24
- package/test/layer/geojson/index.test.js +19 -5
- package/test/layer/oaf.test.js +21 -6
- package/test/layer/terrain.test.js +4 -2
- package/test/layer/tileset.test.js +10 -5
- package/test/layer/vectorTile.test.js +23 -4
- package/test/layer/wfs.test.js +20 -5
- package/test/maps/interactions/drawInteraction.test.js +34 -0
- package/test/renderer/webgl.test.js +76 -9
- package/test/layer/vectorBase.test.js +0 -83
|
@@ -6,8 +6,8 @@ import {getUid} from "olcs/util.js";
|
|
|
6
6
|
import TileWMS from "ol/source/TileWMS.js";
|
|
7
7
|
import ImageWMS from "ol/source/ImageWMS.js";
|
|
8
8
|
import WMTS from "ol/source/WMTS.js";
|
|
9
|
-
import olcsAbstractSynchronizer from "olcs/AbstractSynchronizer.
|
|
10
|
-
import {extentToRectangle, tileLayerToImageryLayer, updateCesiumLayerProperties} from "olcs/core.
|
|
9
|
+
import olcsAbstractSynchronizer from "olcs/AbstractSynchronizer.ts";
|
|
10
|
+
import {extentToRectangle, tileLayerToImageryLayer, updateCesiumLayerProperties} from "olcs/core.ts";
|
|
11
11
|
import {Tile, Image as ImageLayer} from "ol/layer.js";
|
|
12
12
|
import {stableSort} from "ol/array.js";
|
|
13
13
|
import {getBottomLeft, getBottomRight, getTopRight, getTopLeft} from "ol/extent.js";
|
package/src/maps/olcs/olcsMap.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import OLCesium from "olcs/OLCesium.
|
|
1
|
+
import OLCesium from "olcs/OLCesium.ts";
|
|
2
2
|
import {transform, get} from "ol/proj.js";
|
|
3
|
-
import VectorSynchronizer from "olcs/VectorSynchronizer.
|
|
3
|
+
import VectorSynchronizer from "olcs/VectorSynchronizer.ts";
|
|
4
4
|
|
|
5
5
|
import FixedOverlaySynchronizer from "./3dUtils/fixedOverlaySynchronizer.js";
|
|
6
6
|
import WMSRasterSynchronizer from "./3dUtils/wmsRasterSynchronizer.js";
|
package/src/renderer/webgl.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import WebGLPointsLayer from "ol/layer/WebGLPoints";
|
|
2
2
|
import WebGLVectorLayerRenderer from "ol/renderer/webgl/VectorLayer";
|
|
3
|
+
import WebGLVectorTileLayerRenderer from "ol/renderer/webgl/VectorTileLayer.js";
|
|
4
|
+
import VectorTile from "ol/layer/VectorTile.js";
|
|
3
5
|
import VectorLayer from "ol/layer/Layer";
|
|
4
6
|
import styleList from "../vectorStyle/styleList";
|
|
5
7
|
import {getRulesForFeature} from "../vectorStyle/lib/getRuleForIndex";
|
|
6
8
|
import {returnColor} from "../vectorStyle/lib/colorConvertions";
|
|
9
|
+
import {asArray} from "ol/color.js";
|
|
10
|
+
import {packColor, parseLiteralStyle} from "ol/webgl/styleparser.js";
|
|
7
11
|
|
|
8
12
|
/**
|
|
9
13
|
* The default style for OpenLayers WebGLPoints class
|
|
@@ -23,20 +27,20 @@ const defaultStyle = {
|
|
|
23
27
|
|
|
24
28
|
/** @type {import('ol/style/literal.js').LiteralStyle} */
|
|
25
29
|
style = {
|
|
26
|
-
"stroke-color": ["get", "
|
|
27
|
-
"stroke-width": ["get", "
|
|
28
|
-
"fill-color": ["get", "
|
|
29
|
-
"opacity": ["get", "
|
|
30
|
-
"size": ["get", "
|
|
30
|
+
"stroke-color": ["get", "strokeColor"],
|
|
31
|
+
"stroke-width": ["get", "strokeWidth", "number"],
|
|
32
|
+
"fill-color": ["get", "fillColor"],
|
|
33
|
+
"opacity": ["get", "opacity", "number"],
|
|
34
|
+
"size": ["get", "circleSize", "number"],
|
|
35
|
+
symbol: defaultStyle.symbol
|
|
31
36
|
};
|
|
32
37
|
|
|
33
38
|
/**
|
|
34
|
-
*
|
|
39
|
+
* Creates a vector layer with custom renderer.
|
|
35
40
|
* @augments VectorLayer
|
|
36
41
|
* @private
|
|
37
42
|
* @implements {WebGLVectorLayerRenderer}
|
|
38
|
-
* @
|
|
39
|
-
* @returns {module:ol/layer/Layer} the LocalWebGLLayer with a custom renderer for WebGL styling
|
|
43
|
+
* @returns {module:ol/layer/VectorLayer} the LocalWebGLLayer with a custom renderer for WebGL styling
|
|
40
44
|
*/
|
|
41
45
|
export function createVectorLayerRenderer () {
|
|
42
46
|
/**
|
|
@@ -46,7 +50,7 @@ export function createVectorLayerRenderer () {
|
|
|
46
50
|
*/
|
|
47
51
|
class LocalWebGLLayer extends VectorLayer {
|
|
48
52
|
/**
|
|
49
|
-
* Creates a new renderer that takes the defined style of the new layer as an input
|
|
53
|
+
* Creates a new renderer that takes the defined style of the new layer as an input.
|
|
50
54
|
* @returns {module:ol/renderer/webgl/WebGLVectorLayerRenderer} the custom renderer
|
|
51
55
|
* @experimental
|
|
52
56
|
*/
|
|
@@ -60,9 +64,101 @@ export function createVectorLayerRenderer () {
|
|
|
60
64
|
return LocalWebGLLayer;
|
|
61
65
|
}
|
|
62
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Creates a vector tile layer with custom renderer.
|
|
69
|
+
* @augments VectorTile
|
|
70
|
+
* @private
|
|
71
|
+
* @implements {WebGLVectorTileLayerRenderer}
|
|
72
|
+
* @returns {module:ol/layer/VectorTile} the LocalWebGLLayer with a custom renderer for WebGL styling of vectorTile layers.
|
|
73
|
+
*/
|
|
74
|
+
export function createVectorTileLayerRenderer () {
|
|
75
|
+
/**
|
|
76
|
+
* @class LocalWebGLLayer
|
|
77
|
+
* @see https://openlayers.org/en/latest/examples/webgl-vector-tiles.html
|
|
78
|
+
* @description the temporary class with a custom renderer to render the vectortiles with WebGL
|
|
79
|
+
*/
|
|
80
|
+
class LocalWebGLLayer extends VectorTile {
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new renderer that takes the defined style of the new layer as an input.
|
|
84
|
+
* @returns {module:ol/renderer/webgl/WebGLVectorTileLayerRenderer} the custom renderer
|
|
85
|
+
* @experimental
|
|
86
|
+
*/
|
|
87
|
+
createRenderer () {
|
|
88
|
+
const result = parseLiteralStyle(style),
|
|
89
|
+
invisible = [255, 255, 255, 0],
|
|
90
|
+
grey = [119, 119, 119, 1];
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
return new WebGLVectorTileLayerRenderer(this, {
|
|
94
|
+
style: {
|
|
95
|
+
fill: {
|
|
96
|
+
fragment: result.builder.getFillFragmentShader(),
|
|
97
|
+
vertex: result.builder.getFillVertexShader()
|
|
98
|
+
},
|
|
99
|
+
stroke: {
|
|
100
|
+
fragment: result.builder.getStrokeFragmentShader(),
|
|
101
|
+
vertex: result.builder.getStrokeVertexShader()
|
|
102
|
+
},
|
|
103
|
+
symbol: {
|
|
104
|
+
fragment: result.builder.getSymbolFragmentShader(),
|
|
105
|
+
vertex: result.builder.getSymbolVertexShader()
|
|
106
|
+
},
|
|
107
|
+
attributes: {
|
|
108
|
+
fillColor: {
|
|
109
|
+
size: 2,
|
|
110
|
+
callback: (feature) => {
|
|
111
|
+
const featureStyle = this.getStyle()(feature, 1);
|
|
112
|
+
|
|
113
|
+
if (featureStyle && featureStyle[0]) {
|
|
114
|
+
const color = featureStyle[0]?.getFill()?.getColor();
|
|
115
|
+
|
|
116
|
+
return packColor(color && typeof color === "string" ? asArray(color) : invisible);
|
|
117
|
+
}
|
|
118
|
+
return packColor(grey);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
strokeColor: {
|
|
122
|
+
size: 2,
|
|
123
|
+
callback: (feature) => {
|
|
124
|
+
const featureStyle = this.getStyle()(feature, 1);
|
|
125
|
+
|
|
126
|
+
if (featureStyle && featureStyle[0]) {
|
|
127
|
+
const color = featureStyle[0]?.getStroke()?.getColor();
|
|
128
|
+
|
|
129
|
+
return packColor(color ? asArray(color) : invisible);
|
|
130
|
+
}
|
|
131
|
+
return packColor(grey);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
strokeWidth: {
|
|
135
|
+
size: 1,
|
|
136
|
+
callback: (feature) => {
|
|
137
|
+
const featureStyle = this.getStyle()(feature, 1);
|
|
138
|
+
|
|
139
|
+
if (featureStyle && featureStyle[0]) {
|
|
140
|
+
const width = featureStyle[0]?.getStroke()?.getWidth();
|
|
141
|
+
|
|
142
|
+
if (width !== undefined) {
|
|
143
|
+
return width > 10 ? width / 10 : 1;/** @todo needs refactoring in later versions */
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return LocalWebGLLayer;
|
|
156
|
+
}
|
|
157
|
+
|
|
63
158
|
/**
|
|
64
159
|
* Parses the vectorStyle from style.json to the feature
|
|
65
|
-
* to reduce processing on runtime
|
|
160
|
+
* to reduce processing on runtime.
|
|
161
|
+
* Sets properties with style at feature to use by literalSytle of renderer of VectorLayer.
|
|
66
162
|
* @private
|
|
67
163
|
* @param {module:ol/Feature} feature - the feature to check
|
|
68
164
|
* @param {module:Backbone/Model} [styleObject] - (optional) the style model from StyleList
|
|
@@ -87,11 +183,11 @@ export function formatFeatureStyles (feature, styleObject) {
|
|
|
87
183
|
strokeWidth = rule.style.polygonStrokeWidth || rule.style.lineStrokeWidth,
|
|
88
184
|
size = rule.style.circleRadius;
|
|
89
185
|
|
|
90
|
-
feature.set("
|
|
91
|
-
feature.set("
|
|
92
|
-
feature.set("
|
|
93
|
-
feature.set("
|
|
94
|
-
feature.set("
|
|
186
|
+
feature.set("fillColor", fillColor ? fillColor : "#006688");
|
|
187
|
+
feature.set("strokeColor", strokeColor ? strokeColor : "#006688");
|
|
188
|
+
feature.set("strokeWidth", strokeWidth ? strokeWidth : 1);
|
|
189
|
+
feature.set("opacity", fillColor ? (rule.style.polygonFillColor || rule.style.circleFillColor)[3] : 1);
|
|
190
|
+
feature.set("circleSize", size ? size : 20);
|
|
95
191
|
}
|
|
96
192
|
}
|
|
97
193
|
|
|
@@ -134,19 +230,28 @@ export function formatFeatureData (feature, excludeTypes = ["boolean"]) {
|
|
|
134
230
|
}
|
|
135
231
|
|
|
136
232
|
/**
|
|
137
|
-
* feature transformations called after loading
|
|
233
|
+
* feature transformations called after loading - but not for layer of typ VectortTile
|
|
138
234
|
* called by the layer source loader, binds the instance of the layer model
|
|
139
235
|
* should be called on each source refresh
|
|
140
236
|
* @param {module:ol/Feature[]} features - the features loaded by the layer
|
|
141
237
|
* @param {String} styleId - The layer's styleId
|
|
142
238
|
* @param {String[]} excludeTypesFromParsing - types that should not be parsed from strings, only necessary for webgl
|
|
239
|
+
* @param {Boolean} isPointLayer - whether the layer source should consist only of points (or multi points)
|
|
143
240
|
* @returns {void}
|
|
144
241
|
*/
|
|
145
|
-
export function afterLoading (features, styleId, excludeTypesFromParsing) {
|
|
242
|
+
export function afterLoading (features, styleId, excludeTypesFromParsing, isPointLayer) {
|
|
146
243
|
const styleObject = styleList.returnStyleObject(styleId); // load styleModel to extract rules per feature
|
|
147
244
|
|
|
148
245
|
if (Array.isArray(features)) {
|
|
149
246
|
features.forEach(feature => {
|
|
247
|
+
/**
|
|
248
|
+
* extract first point from Multipoint
|
|
249
|
+
* @deprecated will probably not be necessary anymore in release version
|
|
250
|
+
* @example An example for that behavior can be found when rendering "Strassenbaumkataster"
|
|
251
|
+
*/
|
|
252
|
+
if (isPointLayer && feature.getGeometry().getType() === "MultiPoint") {
|
|
253
|
+
feature.setGeometry(feature.getGeometry().getPoint(0)); // other points in the multi point will be ignored for now
|
|
254
|
+
}
|
|
150
255
|
formatFeatureGeometry(feature); /** @deprecated will propbably not be necessary anymore in release version */
|
|
151
256
|
formatFeatureStyles(feature, styleObject); /** @todo needs refactoring in release version */
|
|
152
257
|
formatFeatureData(feature, excludeTypesFromParsing); /** Necessary since the WebGLPoints Style Syntax depends on data types (i.e. numbers not as strings) */
|
|
@@ -175,7 +280,8 @@ export function createLayer (attrs) {
|
|
|
175
280
|
opacity: attrs.transparency ? (100 - attrs.transparency) / 100 : attrs.opacity,
|
|
176
281
|
renderer: "webgl",
|
|
177
282
|
styleId: attrs.styleId,
|
|
178
|
-
excludeTypesFromParsing: attrs.excludeTypesFromParsing
|
|
283
|
+
excludeTypesFromParsing: attrs.excludeTypesFromParsing,
|
|
284
|
+
extent: attrs.extent
|
|
179
285
|
};
|
|
180
286
|
|
|
181
287
|
/**
|
|
@@ -196,11 +302,22 @@ export function createLayer (attrs) {
|
|
|
196
302
|
});
|
|
197
303
|
}
|
|
198
304
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
305
|
+
if (attrs.typ === "VectorTile") {
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* use ol/renderer/webgl/WebGLVectorLayerRenderer if not point layer
|
|
309
|
+
* Point styling as quads only
|
|
310
|
+
*/
|
|
311
|
+
LayerConstructor = createVectorTileLayerRenderer(attrs);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* use ol/renderer/webgl/WebGLVectorLayerRenderer if not point layer
|
|
317
|
+
* Point styling as quads only
|
|
318
|
+
*/
|
|
319
|
+
LayerConstructor = createVectorLayerRenderer(attrs);
|
|
320
|
+
}
|
|
204
321
|
return new LayerConstructor({
|
|
205
322
|
...options,
|
|
206
323
|
isPointLayer: false
|
|
@@ -230,31 +230,15 @@ function initializeStyleList (styleGetters, Config, layers, tools, callback) {
|
|
|
230
230
|
styleConf = Config.styleConf;
|
|
231
231
|
featureViaUrlLayers = Config.featureViaURL?.layers;
|
|
232
232
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
xhr.onreadystatechange = function (event) {
|
|
237
|
-
const target = event.target,
|
|
238
|
-
status = target.status;
|
|
239
|
-
let data;
|
|
240
|
-
|
|
241
|
-
if (status === 200) {
|
|
242
|
-
try {
|
|
243
|
-
data = JSON.parse(target.response);
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
console.error("An error occured when parsing the response after loading '" + styleConf + "':", error);
|
|
247
|
-
return callback(false, error);
|
|
248
|
-
}
|
|
233
|
+
fetch(styleConf)
|
|
234
|
+
.then(response => response.json())
|
|
235
|
+
.then(data => {
|
|
249
236
|
styleList = parseStyles(data);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
console.error(
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
return callback(styleList);
|
|
256
|
-
};
|
|
257
|
-
xhr.send();
|
|
237
|
+
})
|
|
238
|
+
.catch(error => {
|
|
239
|
+
console.error(error);
|
|
240
|
+
callback(false, true);
|
|
241
|
+
});
|
|
258
242
|
}
|
|
259
243
|
|
|
260
244
|
/**
|
|
@@ -10,8 +10,10 @@ const features = [new Feature(), new Feature()];
|
|
|
10
10
|
jest.mock("../../../src/renderer/webgl.js", () => {
|
|
11
11
|
const original = jest.requireActual("../../../src/renderer/webgl.js");
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
return {
|
|
14
|
+
...original,
|
|
15
|
+
afterLoading: jest.fn()
|
|
16
|
+
};
|
|
15
17
|
});
|
|
16
18
|
|
|
17
19
|
describe("geojson/index", function () {
|
|
@@ -96,11 +98,23 @@ describe("geojson/index", function () {
|
|
|
96
98
|
it("creates a vectorSource with an additional listener, when renderer is \"webgl\"", () => {
|
|
97
99
|
const
|
|
98
100
|
rawLayer = {url: "example.com/geo.json"},
|
|
99
|
-
|
|
101
|
+
layerParams = {
|
|
102
|
+
renderer: "webgl",
|
|
103
|
+
styleId: "id",
|
|
104
|
+
excludeTypesFromParsing: null,
|
|
105
|
+
isPointLayer: true
|
|
106
|
+
},
|
|
107
|
+
source = geojson.createLayerSource({
|
|
108
|
+
...rawLayer,
|
|
109
|
+
renderer: layerParams.renderer,
|
|
110
|
+
styleId: layerParams.styleId,
|
|
111
|
+
excludeTypesFromParsing: layerParams.excludeTypesFromParsing,
|
|
112
|
+
isPointLayer: layerParams.isPointLayer
|
|
113
|
+
}, {});
|
|
100
114
|
|
|
101
115
|
expect(source.getListeners("featuresloadend")).toHaveLength(2);
|
|
102
|
-
source.getListeners("featuresloadend")[1]({features
|
|
103
|
-
expect(webgl.afterLoading).
|
|
116
|
+
source.getListeners("featuresloadend")[1]({features});
|
|
117
|
+
expect(webgl.afterLoading).toHaveBeenCalledWith(features, layerParams.styleId, layerParams.excludeTypesFromParsing, layerParams.isPointLayer);
|
|
104
118
|
});
|
|
105
119
|
|
|
106
120
|
});
|
package/test/layer/oaf.test.js
CHANGED
|
@@ -19,8 +19,10 @@ jest.mock("../../src/rawLayerList.js", () => {
|
|
|
19
19
|
jest.mock("../../src/renderer/webgl.js", () => {
|
|
20
20
|
const original = jest.requireActual("../../src/renderer/webgl.js");
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
return {
|
|
23
|
+
...original,
|
|
24
|
+
afterLoading: jest.fn()
|
|
25
|
+
};
|
|
24
26
|
});
|
|
25
27
|
|
|
26
28
|
|
|
@@ -265,11 +267,24 @@ describe("oaf.js", function () {
|
|
|
265
267
|
featureType: "krankenhaeuser_hh",
|
|
266
268
|
version: "1.0.0"
|
|
267
269
|
},
|
|
268
|
-
|
|
270
|
+
layerParams = {
|
|
271
|
+
renderer: "webgl",
|
|
272
|
+
styleId: "id",
|
|
273
|
+
excludeTypesFromParsing: null,
|
|
274
|
+
isPointLayer: true
|
|
275
|
+
},
|
|
276
|
+
source = oaf.createLayerSource({
|
|
277
|
+
...rawLayer,
|
|
278
|
+
renderer: layerParams.renderer,
|
|
279
|
+
styleId: layerParams.styleId,
|
|
280
|
+
excludeTypesFromParsing: layerParams.excludeTypesFromParsing,
|
|
281
|
+
isPointLayer: layerParams.isPointLayer
|
|
282
|
+
}),
|
|
283
|
+
features = [];
|
|
269
284
|
|
|
270
285
|
expect(source.getListeners("featuresloadend")).toHaveLength(1);
|
|
271
|
-
source.getListeners("featuresloadend")[0]({features
|
|
272
|
-
expect(webgl.afterLoading).
|
|
286
|
+
source.getListeners("featuresloadend")[0]({features});
|
|
287
|
+
expect(webgl.afterLoading).toHaveBeenCalledWith(features, layerParams.styleId, layerParams.excludeTypesFromParsing, layerParams.isPointLayer);
|
|
273
288
|
});
|
|
274
289
|
});
|
|
275
|
-
});
|
|
290
|
+
});
|
|
@@ -5,8 +5,10 @@ describe("terrain.js", function () {
|
|
|
5
5
|
|
|
6
6
|
beforeEach(() => {
|
|
7
7
|
global.Cesium = {};
|
|
8
|
-
global.Cesium.CesiumTerrainProvider =
|
|
8
|
+
global.Cesium.CesiumTerrainProvider = {};
|
|
9
|
+
global.Cesium.CesiumTerrainProvider.fromUrl = jest.fn();
|
|
9
10
|
global.Cesium.EllipsoidTerrainProvider = jest.fn();
|
|
11
|
+
|
|
10
12
|
attr = {
|
|
11
13
|
id: "12883",
|
|
12
14
|
name: "Gelaende",
|
|
@@ -21,7 +23,7 @@ describe("terrain.js", function () {
|
|
|
21
23
|
return {};
|
|
22
24
|
}
|
|
23
25
|
};
|
|
24
|
-
cesiumTerrainProviderSpy = jest.spyOn(global.Cesium, "
|
|
26
|
+
cesiumTerrainProviderSpy = jest.spyOn(global.Cesium.CesiumTerrainProvider, "fromUrl");
|
|
25
27
|
});
|
|
26
28
|
|
|
27
29
|
afterEach(() => {
|
|
@@ -6,7 +6,8 @@ describe("tileset.js", function () {
|
|
|
6
6
|
|
|
7
7
|
beforeEach(() => {
|
|
8
8
|
global.Cesium = {};
|
|
9
|
-
global.Cesium.Cesium3DTileset =
|
|
9
|
+
global.Cesium.Cesium3DTileset = {};
|
|
10
|
+
global.Cesium.Cesium3DTileset.fromUrl = jest.fn();
|
|
10
11
|
global.Cesium.Cesium3DTileStyle = jest.fn(color => color);
|
|
11
12
|
attr = {
|
|
12
13
|
id: "4002",
|
|
@@ -28,7 +29,9 @@ describe("tileset.js", function () {
|
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
};
|
|
31
|
-
cesium3DTilesetSpy = jest.spyOn(global.Cesium, "
|
|
32
|
+
cesium3DTilesetSpy = jest.spyOn(global.Cesium.Cesium3DTileset, "fromUrl").mockImplementation(() => {
|
|
33
|
+
return Promise.resolve({});
|
|
34
|
+
});
|
|
32
35
|
console.warn = jest.fn();
|
|
33
36
|
});
|
|
34
37
|
|
|
@@ -38,21 +41,23 @@ describe("tileset.js", function () {
|
|
|
38
41
|
console.warn = consoleWarn;
|
|
39
42
|
});
|
|
40
43
|
|
|
41
|
-
function checkAttributes (layer, attrs) {
|
|
44
|
+
async function checkAttributes (layer, attrs) {
|
|
45
|
+
const tileset = await layer.tileset;
|
|
46
|
+
|
|
42
47
|
expect(layer.get("name")).toEqual(attrs.name);
|
|
43
48
|
expect(layer.get("typ")).toEqual(attrs.typ);
|
|
44
49
|
expect(layer.get("id")).toEqual(attrs.id);
|
|
45
|
-
expect(
|
|
50
|
+
expect(tileset.layerReferenceId).toEqual(attrs.id);
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
describe("createLayer", function () {
|
|
49
54
|
it("creates tileset layer without map", function () {
|
|
50
55
|
const layer = new Tileset(attr);
|
|
51
56
|
|
|
52
|
-
checkAttributes(layer, attr);
|
|
53
57
|
expect(layer.tileSet).toEqual(undefined);
|
|
54
58
|
expect(layer.tileset.show).toEqual(undefined);
|
|
55
59
|
expect(cesium3DTilesetSpy).toHaveBeenCalledTimes(1);
|
|
60
|
+
checkAttributes(layer, attr);
|
|
56
61
|
});
|
|
57
62
|
it("creates 2 tileset layers with map and checks attributes", function () {
|
|
58
63
|
const attr2 = {
|
|
@@ -2,6 +2,7 @@ import OpenLayersVectorTileLayer from "ol/layer/VectorTile";
|
|
|
2
2
|
import OpenLayersVectorTileSource from "ol/source/VectorTile";
|
|
3
3
|
import OpenLayersTileGrid from "ol/tilegrid/TileGrid";
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
import {Feature} from "ol";
|
|
6
7
|
import Polygon from "ol/geom/Polygon";
|
|
7
8
|
|
|
@@ -16,11 +17,21 @@ jest.mock("../../src/rawLayerList.js", () => {
|
|
|
16
17
|
return original;
|
|
17
18
|
});
|
|
18
19
|
|
|
20
|
+
jest.mock("../../src/renderer/webgl.js", () => {
|
|
21
|
+
const original = jest.requireActual("../../src/renderer/webgl.js");
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
...original,
|
|
25
|
+
afterLoading: jest.fn()
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
|
|
19
30
|
describe("vectorTile.js", function () {
|
|
20
31
|
|
|
21
32
|
beforeAll(() => crs.registerProjections());
|
|
22
33
|
|
|
23
|
-
const
|
|
34
|
+
const rawLayer = {
|
|
24
35
|
name: "VT Test",
|
|
25
36
|
id: "VT_01",
|
|
26
37
|
url: "https://example.org"
|
|
@@ -79,12 +90,13 @@ describe("vectorTile.js", function () {
|
|
|
79
90
|
source = vectorTile.createLayerSource("https://foo.example.org", sourceParams);
|
|
80
91
|
|
|
81
92
|
expect(source).toBeInstanceOf(OpenLayersVectorTileSource);
|
|
93
|
+
expect(typeof source.getTileLoadFunction()).toEqual("function");
|
|
82
94
|
});
|
|
83
95
|
});
|
|
84
96
|
|
|
85
97
|
describe("createLayer", function () {
|
|
86
98
|
it("creates a vector Tile Layer", function () {
|
|
87
|
-
const layer = vectorTile.createLayer(
|
|
99
|
+
const layer = vectorTile.createLayer(rawLayer);
|
|
88
100
|
|
|
89
101
|
expect(layer).toBeInstanceOf(OpenLayersVectorTileLayer);
|
|
90
102
|
expect(layer.getSource()).toBeInstanceOf(OpenLayersVectorTileSource);
|
|
@@ -92,6 +104,13 @@ describe("vectorTile.js", function () {
|
|
|
92
104
|
expect(layer.get("id")).toEqual("VT_01");
|
|
93
105
|
});
|
|
94
106
|
|
|
107
|
+
it("creates a vector Tile Layer with webgl renderer", function () {
|
|
108
|
+
const layer = vectorTile.createLayer(rawLayer, {layerParams: {renderer: "webgl"}});
|
|
109
|
+
|
|
110
|
+
expect(layer.constructor.name).toEqual("LocalWebGLLayer");
|
|
111
|
+
expect(layer.getSource()).toBeInstanceOf(OpenLayersVectorTileSource);
|
|
112
|
+
});
|
|
113
|
+
|
|
95
114
|
it("should log an error when required param is missing", function () {
|
|
96
115
|
const spyConsole = jest.spyOn(console, "error").mockImplementation(() => ""),
|
|
97
116
|
layer = vectorTile.createLayer({
|
|
@@ -139,7 +158,7 @@ describe("vectorTile.js", function () {
|
|
|
139
158
|
],
|
|
140
159
|
tileSize: 512
|
|
141
160
|
},
|
|
142
|
-
layer = vectorTile.createLayer(
|
|
161
|
+
layer = vectorTile.createLayer(rawLayer),
|
|
143
162
|
source = layer.getSource(),
|
|
144
163
|
tileGrid = source.getTileGrid();
|
|
145
164
|
|
|
@@ -156,7 +175,7 @@ describe("vectorTile.js", function () {
|
|
|
156
175
|
|
|
157
176
|
describe("setStyle", function () {
|
|
158
177
|
it("should apply a given style", function () {
|
|
159
|
-
const layer = vectorTile.createLayer(
|
|
178
|
+
const layer = vectorTile.createLayer(rawLayer);
|
|
160
179
|
|
|
161
180
|
let featureStyle = null;
|
|
162
181
|
|
package/test/layer/wfs.test.js
CHANGED
|
@@ -24,8 +24,10 @@ jest.mock("../../src/rawLayerList.js", () => {
|
|
|
24
24
|
jest.mock("../../src/renderer/webgl.js", () => {
|
|
25
25
|
const original = jest.requireActual("../../src/renderer/webgl.js");
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
return {
|
|
28
|
+
...original,
|
|
29
|
+
afterLoading: jest.fn()
|
|
30
|
+
};
|
|
29
31
|
});
|
|
30
32
|
|
|
31
33
|
|
|
@@ -420,11 +422,24 @@ describe("wfs.js", function () {
|
|
|
420
422
|
featureType: "krankenhaeuser_hh",
|
|
421
423
|
version: "1.0.0"
|
|
422
424
|
},
|
|
423
|
-
|
|
425
|
+
layerParams = {
|
|
426
|
+
renderer: "webgl",
|
|
427
|
+
styleId: "id",
|
|
428
|
+
excludeTypesFromParsing: null,
|
|
429
|
+
isPointLayer: true
|
|
430
|
+
},
|
|
431
|
+
source = wfs.createLayerSource({
|
|
432
|
+
...rawLayer,
|
|
433
|
+
renderer: layerParams.renderer,
|
|
434
|
+
styleId: layerParams.styleId,
|
|
435
|
+
excludeTypesFromParsing: layerParams.excludeTypesFromParsing,
|
|
436
|
+
isPointLayer: layerParams.isPointLayer
|
|
437
|
+
}),
|
|
438
|
+
features = [];
|
|
424
439
|
|
|
425
440
|
expect(source.getListeners("featuresloadend")).toHaveLength(1);
|
|
426
|
-
source.getListeners("featuresloadend")[0]({features
|
|
427
|
-
expect(webgl.afterLoading).
|
|
441
|
+
source.getListeners("featuresloadend")[0]({features});
|
|
442
|
+
expect(webgl.afterLoading).toHaveBeenCalledWith(features, layerParams.styleId, layerParams.excludeTypesFromParsing, layerParams.isPointLayer);
|
|
428
443
|
});
|
|
429
444
|
it("creates a vectorSource with credentials: include as params", () => {
|
|
430
445
|
global.fetch = jest.fn().mockImplementationOnce(() => {
|
|
@@ -6,6 +6,40 @@ import VectorSource from "ol/source/Vector";
|
|
|
6
6
|
import drawInteractions, {styleObject} from "../../../src/maps/interactions/drawInteraction";
|
|
7
7
|
|
|
8
8
|
describe("src/maps/interactions/drawInteraction.js", () => {
|
|
9
|
+
describe("convertUnits", () => {
|
|
10
|
+
it("shold return 1000 for sourceUnit === 'm' and targetUnit === 'm'", () =>{
|
|
11
|
+
const value = 1000,
|
|
12
|
+
sourceUnit = "m",
|
|
13
|
+
targetUnit = "m";
|
|
14
|
+
|
|
15
|
+
expect(drawInteractions.convertUnits(value, sourceUnit, targetUnit)).toEqual(1000);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("shold return 1000 for sourceUnit === 'm' and targetUnit === 'km'", () =>{
|
|
19
|
+
const value = 1000,
|
|
20
|
+
sourceUnit = "m",
|
|
21
|
+
targetUnit = "km";
|
|
22
|
+
|
|
23
|
+
expect(drawInteractions.convertUnits(value, sourceUnit, targetUnit)).toEqual(1);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("shold return 1000 for sourceUnit === 'km' and targetUnit === 'm'", () =>{
|
|
27
|
+
const value = 1000,
|
|
28
|
+
sourceUnit = "km",
|
|
29
|
+
targetUnit = "m";
|
|
30
|
+
|
|
31
|
+
expect(drawInteractions.convertUnits(value, sourceUnit, targetUnit)).toEqual(1000000);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("shold return 1000 for sourceUnit === 'abc' and targetUnit === 'def'", () =>{
|
|
35
|
+
const value = 1000,
|
|
36
|
+
sourceUnit = "abc",
|
|
37
|
+
targetUnit = "def";
|
|
38
|
+
|
|
39
|
+
expect(drawInteractions.convertUnits(value, sourceUnit, targetUnit)).toEqual(1000);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
9
43
|
describe("transformMapUnitRadius", () => {
|
|
10
44
|
it("should return the input meter radius in meter ", () => {
|
|
11
45
|
const radius = 100,
|