@vcmap/core 5.0.0-rc.28 → 5.0.0-rc.29
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/README.md +9 -3
- package/build/postinstall.js +13 -2
- package/index.d.ts +155 -106
- package/package.json +9 -4
- package/src/category/category.js +71 -32
- package/src/category/categoryCollection.js +27 -18
- package/src/cesium/cesiumVcsCameraPrimitive.js +13 -5
- package/src/cesium/entity.js +3 -1
- package/src/cesium/wallpaperMaterial.js +4 -2
- package/src/classRegistry.js +11 -4
- package/src/featureProvider/abstractFeatureProvider.js +43 -22
- package/src/featureProvider/tileProviderFeatureProvider.js +11 -5
- package/src/featureProvider/wmsFeatureProvider.js +37 -15
- package/src/interaction/abstractInteraction.js +5 -1
- package/src/interaction/coordinateAtPixel.js +34 -12
- package/src/interaction/eventHandler.js +63 -23
- package/src/interaction/featureAtPixelInteraction.js +96 -32
- package/src/interaction/featureProviderInteraction.js +23 -8
- package/src/interaction/interactionChain.js +19 -9
- package/src/interaction/interactionType.js +23 -26
- package/src/layer/cesium/cesiumTilesetCesiumImpl.js +45 -15
- package/src/layer/cesium/clusterContext.js +10 -3
- package/src/layer/cesium/dataSourceCesiumImpl.js +13 -4
- package/src/layer/cesium/openStreetMapCesiumImpl.js +7 -3
- package/src/layer/cesium/rasterLayerCesiumImpl.js +6 -2
- package/src/layer/cesium/singleImageCesiumImpl.js +14 -3
- package/src/layer/cesium/terrainCesiumImpl.js +3 -2
- package/src/layer/cesium/tmsCesiumImpl.js +15 -3
- package/src/layer/cesium/vectorCesiumImpl.js +69 -25
- package/src/layer/cesium/vectorContext.js +25 -5
- package/src/layer/cesium/vectorRasterTileCesiumImpl.js +15 -5
- package/src/layer/cesium/vectorTileImageryProvider.js +51 -13
- package/src/layer/cesium/wmsCesiumImpl.js +15 -3
- package/src/layer/cesium/wmtsCesiumImpl.js +18 -6
- package/src/layer/cesium/x3dmHelper.js +4 -1
- package/src/layer/cesiumTilesetLayer.js +55 -26
- package/src/layer/czmlLayer.js +11 -5
- package/src/layer/dataSourceLayer.js +25 -17
- package/src/layer/featureLayer.js +33 -18
- package/src/layer/featureStoreLayer.js +161 -99
- package/src/layer/featureStoreLayerChanges.js +57 -17
- package/src/layer/featureVisibility.js +89 -59
- package/src/layer/geojsonHelpers.js +70 -29
- package/src/layer/geojsonLayer.js +17 -11
- package/src/layer/globalHider.js +14 -4
- package/src/layer/layer.js +77 -44
- package/src/layer/layerImplementation.js +12 -4
- package/src/layer/oblique/layerObliqueImpl.js +3 -1
- package/src/layer/oblique/obliqueHelpers.js +75 -30
- package/src/layer/oblique/vectorObliqueImpl.js +175 -69
- package/src/layer/openStreetMapLayer.js +34 -20
- package/src/layer/openlayers/layerOpenlayersImpl.js +37 -15
- package/src/layer/openlayers/openStreetMapOpenlayersImpl.js +3 -1
- package/src/layer/openlayers/rasterLayerOpenlayersImpl.js +3 -1
- package/src/layer/openlayers/singleImageOpenlayersImpl.js +3 -1
- package/src/layer/openlayers/tileDebugOpenlayersImpl.js +3 -1
- package/src/layer/openlayers/tmsOpenlayersImpl.js +6 -3
- package/src/layer/openlayers/vectorOpenlayersImpl.js +14 -4
- package/src/layer/openlayers/vectorTileOpenlayersImpl.js +12 -5
- package/src/layer/openlayers/wmsOpenlayersImpl.js +3 -1
- package/src/layer/openlayers/wmtsOpenlayersImpl.js +12 -5
- package/src/layer/pointCloudLayer.js +21 -10
- package/src/layer/rasterLayer.js +73 -22
- package/src/layer/singleImageLayer.js +10 -7
- package/src/layer/terrainHelpers.js +30 -19
- package/src/layer/terrainLayer.js +16 -7
- package/src/layer/tileLoadedHelper.js +9 -4
- package/src/layer/tileProvider/mvtTileProvider.js +10 -4
- package/src/layer/tileProvider/staticGeojsonTileProvider.js +10 -4
- package/src/layer/tileProvider/tileProvider.js +163 -87
- package/src/layer/tileProvider/urlTemplateTileProvider.js +10 -4
- package/src/layer/tmsLayer.js +7 -6
- package/src/layer/vectorHelpers.js +34 -25
- package/src/layer/vectorLayer.js +77 -36
- package/src/layer/vectorProperties.js +245 -74
- package/src/layer/vectorSymbols.js +3 -1
- package/src/layer/vectorTileLayer.js +121 -70
- package/src/layer/wfsLayer.js +19 -8
- package/src/layer/wmsHelpers.js +11 -6
- package/src/layer/wmsLayer.js +36 -14
- package/src/layer/wmtsLayer.js +35 -20
- package/src/map/baseOLMap.js +57 -31
- package/src/map/cameraLimiter.js +67 -18
- package/src/map/cesiumMap.js +307 -95
- package/src/map/obliqueMap.js +84 -34
- package/src/map/openlayersMap.js +40 -19
- package/src/map/vcsMap.js +21 -8
- package/src/oblique/helpers.js +212 -64
- package/src/oblique/obliqueCollection.js +111 -48
- package/src/oblique/obliqueDataSet.js +53 -21
- package/src/oblique/obliqueImage.js +50 -17
- package/src/oblique/obliqueImageMeta.js +7 -6
- package/src/oblique/obliqueProvider.js +75 -27
- package/src/oblique/obliqueView.js +18 -7
- package/src/oblique/obliqueViewDirection.js +3 -2
- package/src/oblique/parseImageJson.js +57 -23
- package/src/ol/feature.js +8 -3
- package/src/ol/geom/circle.js +12 -3
- package/src/ol/geom/geometryCollection.js +11 -4
- package/src/ol/render/canvas/canvasTileRenderer.js +11 -9
- package/src/overrideClassRegistry.js +13 -3
- package/src/style/arcStyle.js +129 -36
- package/src/style/arrowStyle.js +57 -22
- package/src/style/declarativeStyleItem.js +107 -62
- package/src/style/shapesCategory.js +8 -6
- package/src/style/styleFactory.js +4 -1
- package/src/style/styleHelpers.js +17 -8
- package/src/style/styleItem.js +28 -10
- package/src/style/vectorStyleItem.js +160 -74
- package/src/style/writeStyle.js +5 -7
- package/src/util/clipping/clippingObject.js +72 -38
- package/src/util/clipping/clippingObjectManager.js +53 -19
- package/src/util/clipping/clippingPlaneHelper.js +120 -53
- package/src/util/collection.js +12 -6
- package/src/util/editor/createFeatureSession.js +21 -6
- package/src/util/editor/editFeaturesSession.js +41 -15
- package/src/util/editor/editGeometrySession.js +55 -30
- package/src/util/editor/editorHelpers.js +114 -29
- package/src/util/editor/editorSessionHelpers.js +8 -3
- package/src/util/editor/interactions/createBBoxInteraction.js +11 -3
- package/src/util/editor/interactions/createCircleInteraction.js +7 -2
- package/src/util/editor/interactions/createLineStringInteraction.js +7 -2
- package/src/util/editor/interactions/createPolygonInteraction.js +7 -2
- package/src/util/editor/interactions/editFeaturesMouseOverInteraction.js +7 -5
- package/src/util/editor/interactions/editGeometryMouseOverInteraction.js +8 -3
- package/src/util/editor/interactions/ensureHandlerSelectionInteraction.js +4 -2
- package/src/util/editor/interactions/insertVertexInteraction.js +17 -6
- package/src/util/editor/interactions/mapInteractionController.js +31 -14
- package/src/util/editor/interactions/removeVertexInteraction.js +4 -1
- package/src/util/editor/interactions/selectFeatureMouseOverInteraction.js +19 -10
- package/src/util/editor/interactions/selectMultiFeatureInteraction.js +33 -20
- package/src/util/editor/interactions/selectSingleFeatureInteraction.js +14 -8
- package/src/util/editor/selectFeaturesSession.js +37 -21
- package/src/util/editor/transformation/create2DHandlers.js +82 -37
- package/src/util/editor/transformation/create3DHandlers.js +187 -84
- package/src/util/editor/transformation/extrudeInteraction.js +20 -5
- package/src/util/editor/transformation/rotateInteraction.js +29 -16
- package/src/util/editor/transformation/scaleInteraction.js +31 -15
- package/src/util/editor/transformation/transformationHandler.js +23 -8
- package/src/util/editor/transformation/transformationTypes.js +8 -4
- package/src/util/editor/transformation/translateInteraction.js +86 -32
- package/src/util/editor/validateGeoemetry.js +3 -1
- package/src/util/exclusiveManager.js +6 -3
- package/src/util/extent.js +20 -10
- package/src/util/featureconverter/arcToCesium.js +46 -12
- package/src/util/featureconverter/circleToCesium.js +61 -27
- package/src/util/featureconverter/convert.js +85 -13
- package/src/util/featureconverter/extent3D.js +69 -28
- package/src/util/featureconverter/featureconverterHelper.js +232 -79
- package/src/util/featureconverter/lineStringToCesium.js +107 -35
- package/src/util/featureconverter/pointHelpers.js +117 -45
- package/src/util/featureconverter/pointToCesium.js +128 -31
- package/src/util/featureconverter/polygonToCesium.js +50 -16
- package/src/util/fetch.js +3 -1
- package/src/util/geometryHelpers.js +15 -10
- package/src/util/indexedCollection.js +7 -3
- package/src/util/isMobile.js +8 -2
- package/src/util/layerCollection.js +28 -12
- package/src/util/mapCollection.js +37 -18
- package/src/util/math.js +35 -19
- package/src/util/overrideCollection.js +57 -32
- package/src/util/projection.js +21 -5
- package/src/util/urlHelpers.js +5 -3
- package/src/util/viewpoint.js +66 -33
- package/src/vcsApp.js +133 -69
- package/src/vcsModule.js +3 -2
- package/src/vcsModuleHelpers.js +24 -9
- package/src/vcsObject.js +3 -2
- package/tests/data/dynamicPointCzml.json +24 -35
- package/tests/data/oblique/imageData/imagev34.json +56 -272
- package/tests/data/oblique/imageData/imagev35.json +272 -19
- package/tests/data/oblique/imageData/imagev35PerImageSize.json +299 -19
- package/tests/data/oblique/tiledImageData/12/2199/1342.json +11056 -1
- package/tests/data/oblique/tiledImageData/12/2199/1343.json +11236 -1
- package/tests/data/oblique/tiledImageData/12/2199/1344.json +11077 -1
- package/tests/data/oblique/tiledImageData/12/2200/1342.json +11036 -1
- package/tests/data/oblique/tiledImageData/12/2200/1343.json +11277 -1
- package/tests/data/oblique/tiledImageData/12/2200/1344.json +11131 -1
- package/tests/data/oblique/tiledImageData/12/2201/1342.json +10870 -1
- package/tests/data/oblique/tiledImageData/12/2201/1343.json +11492 -1
- package/tests/data/oblique/tiledImageData/12/2201/1344.json +10909 -1
- package/tests/data/oblique/tiledImageData/image.json +70 -1
- package/tests/data/terrain/layer.json +121 -130
- package/tests/data/testGeoJSON.json +4 -16
- package/tests/unit/helpers/cesiumHelpers.js +58 -33
- package/tests/unit/helpers/helpers.js +10 -2
- package/tests/unit/helpers/imageHelpers.js +8 -4
- package/tests/unit/helpers/obliqueData.js +39 -13
- package/tests/unit/helpers/obliqueHelpers.js +12 -9
- package/tests/unit/helpers/openlayersHelpers.js +4 -1
- package/tests/unit/helpers/terrain/terrainData.js +8 -7
|
@@ -65,7 +65,10 @@ class CreateBBoxInteraction extends AbstractInteraction {
|
|
|
65
65
|
|
|
66
66
|
this._lastCoordinate[2] = this._origin[2];
|
|
67
67
|
let ringCoordinates;
|
|
68
|
-
if (
|
|
68
|
+
if (
|
|
69
|
+
(originXHigher && originYHigher) ||
|
|
70
|
+
(!originXHigher && !originYHigher)
|
|
71
|
+
) {
|
|
69
72
|
ringCoordinates = [
|
|
70
73
|
this._origin,
|
|
71
74
|
[this._lastCoordinate[0], this._origin[1], this._origin[2]],
|
|
@@ -91,7 +94,11 @@ class CreateBBoxInteraction extends AbstractInteraction {
|
|
|
91
94
|
*/
|
|
92
95
|
async pipe(event) {
|
|
93
96
|
if (event.type & EventType.CLICKMOVE && this._geometry) {
|
|
94
|
-
this._lastCoordinate.splice(
|
|
97
|
+
this._lastCoordinate.splice(
|
|
98
|
+
0,
|
|
99
|
+
event.positionOrPixel.length,
|
|
100
|
+
...event.positionOrPixel,
|
|
101
|
+
);
|
|
95
102
|
this._setCoordinates();
|
|
96
103
|
}
|
|
97
104
|
|
|
@@ -101,7 +108,8 @@ class CreateBBoxInteraction extends AbstractInteraction {
|
|
|
101
108
|
} else {
|
|
102
109
|
this._geometry = new Polygon([[event.positionOrPixel.slice()]], 'XYZ');
|
|
103
110
|
this._geometry.set('_vcsGeomType', GeometryType.BBox);
|
|
104
|
-
this._geometry[alreadyTransformedToImage] =
|
|
111
|
+
this._geometry[alreadyTransformedToImage] =
|
|
112
|
+
event.map instanceof ObliqueMap;
|
|
105
113
|
this.created.raiseEvent(this._geometry);
|
|
106
114
|
this._origin = event.positionOrPixel.slice();
|
|
107
115
|
this._lastCoordinate = this._origin.slice();
|
|
@@ -61,7 +61,11 @@ class CreateCircleInteraction extends AbstractInteraction {
|
|
|
61
61
|
*/
|
|
62
62
|
async pipe(event) {
|
|
63
63
|
if (event.type & EventType.CLICKMOVE && this._geometry) {
|
|
64
|
-
this._lastCoordinate.splice(
|
|
64
|
+
this._lastCoordinate.splice(
|
|
65
|
+
0,
|
|
66
|
+
event.positionOrPixel.length,
|
|
67
|
+
...event.positionOrPixel,
|
|
68
|
+
);
|
|
65
69
|
this._setCoordinates();
|
|
66
70
|
}
|
|
67
71
|
|
|
@@ -71,7 +75,8 @@ class CreateCircleInteraction extends AbstractInteraction {
|
|
|
71
75
|
} else {
|
|
72
76
|
this._geometry = new Circle(event.positionOrPixel, 20, 'XYZ');
|
|
73
77
|
this._geometry[actuallyIsCircle] = event.map instanceof ObliqueMap;
|
|
74
|
-
this._geometry[alreadyTransformedToImage] =
|
|
78
|
+
this._geometry[alreadyTransformedToImage] =
|
|
79
|
+
event.map instanceof ObliqueMap;
|
|
75
80
|
this.created.raiseEvent(this._geometry);
|
|
76
81
|
this._coordinates = this._geometry.getCoordinates();
|
|
77
82
|
this._lastCoordinate = this._coordinates[1];
|
|
@@ -57,14 +57,19 @@ class CreateLineStringInteraction extends AbstractInteraction {
|
|
|
57
57
|
*/
|
|
58
58
|
async pipe(event) {
|
|
59
59
|
if (event.type & EventType.CLICKMOVE && this._geometry) {
|
|
60
|
-
this._lastCoordinate.splice(
|
|
60
|
+
this._lastCoordinate.splice(
|
|
61
|
+
0,
|
|
62
|
+
event.positionOrPixel.length,
|
|
63
|
+
...event.positionOrPixel,
|
|
64
|
+
);
|
|
61
65
|
this._setCoordinates();
|
|
62
66
|
}
|
|
63
67
|
|
|
64
68
|
if (event.type & EventType.CLICK) {
|
|
65
69
|
if (!this._geometry) {
|
|
66
70
|
this._geometry = new LineString([event.positionOrPixel], 'XYZ');
|
|
67
|
-
this._geometry[alreadyTransformedToImage] =
|
|
71
|
+
this._geometry[alreadyTransformedToImage] =
|
|
72
|
+
event.map instanceof ObliqueMap;
|
|
68
73
|
this.created.raiseEvent(this._geometry);
|
|
69
74
|
this._coordinates = [event.positionOrPixel.slice()];
|
|
70
75
|
this._lastCoordinate = this._coordinates[0].slice();
|
|
@@ -65,14 +65,19 @@ class CreatePolygonInteraction extends AbstractInteraction {
|
|
|
65
65
|
*/
|
|
66
66
|
async pipe(event) {
|
|
67
67
|
if (event.type & EventType.CLICKMOVE && this._geometry) {
|
|
68
|
-
this._lastCoordinate.splice(
|
|
68
|
+
this._lastCoordinate.splice(
|
|
69
|
+
0,
|
|
70
|
+
event.positionOrPixel.length,
|
|
71
|
+
...event.positionOrPixel,
|
|
72
|
+
);
|
|
69
73
|
this._setCoordinates();
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
if (event.type & EventType.CLICK) {
|
|
73
77
|
if (!this._geometry) {
|
|
74
78
|
this._geometry = new Polygon([[event.positionOrPixel.slice()]], 'XYZ');
|
|
75
|
-
this._geometry[alreadyTransformedToImage] =
|
|
79
|
+
this._geometry[alreadyTransformedToImage] =
|
|
80
|
+
event.map instanceof ObliqueMap;
|
|
76
81
|
this.created.raiseEvent(this._geometry);
|
|
77
82
|
this._coordinates = [event.positionOrPixel.slice()];
|
|
78
83
|
this._lastCoordinate = [...event.positionOrPixel];
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { handlerSymbol, mouseOverSymbol } from '../editorSymbols.js';
|
|
2
2
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
EventType,
|
|
6
|
+
} from '../../../interaction/interactionType.js';
|
|
4
7
|
import { cursorMap } from './editGeometryMouseOverInteraction.js';
|
|
5
8
|
|
|
6
9
|
/**
|
|
@@ -30,10 +33,9 @@ class EditFeaturesMouseOverInteraction extends AbstractInteraction {
|
|
|
30
33
|
* @returns {Promise<InteractionEvent>}
|
|
31
34
|
*/
|
|
32
35
|
async pipe(event) {
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
this._currentHandler = /** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
36
|
+
if (event.feature && event.feature[handlerSymbol]) {
|
|
37
|
+
this._currentHandler =
|
|
38
|
+
/** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
37
39
|
(event.feature);
|
|
38
40
|
} else {
|
|
39
41
|
this._currentHandler = null;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { mouseOverSymbol, vertexSymbol } from '../editorSymbols.js';
|
|
2
2
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
EventType,
|
|
6
|
+
} from '../../../interaction/interactionType.js';
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* @type {Object}
|
|
7
10
|
*/
|
|
8
|
-
export const cursorMap = {
|
|
11
|
+
export const cursorMap = {
|
|
12
|
+
// TODO these can now be designed custom. IE11 no linger required
|
|
9
13
|
auto: 'auto',
|
|
10
14
|
scaleNESW: 'nesw-resize',
|
|
11
15
|
scaleNWSE: 'nwse-resize',
|
|
@@ -48,7 +52,8 @@ class EditGeometryMouseOverInteraction extends AbstractInteraction {
|
|
|
48
52
|
*/
|
|
49
53
|
async pipe(event) {
|
|
50
54
|
if (event.feature && event.feature[vertexSymbol]) {
|
|
51
|
-
this._currentVertex =
|
|
55
|
+
this._currentVertex =
|
|
56
|
+
/** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
52
57
|
(event.feature);
|
|
53
58
|
} else {
|
|
54
59
|
this._currentVertex = null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
2
2
|
import { EventType } from '../../../interaction/interactionType.js';
|
|
3
|
-
import { handlerSymbol } from '
|
|
3
|
+
import { handlerSymbol } from '../editorSymbols.js';
|
|
4
4
|
import CesiumMap from '../../../map/cesiumMap.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -33,7 +33,9 @@ class EnsureHandlerSelectionInteraction extends AbstractInteraction {
|
|
|
33
33
|
!event.feature[handlerSymbol] &&
|
|
34
34
|
event.map instanceof CesiumMap
|
|
35
35
|
) {
|
|
36
|
-
const handler = event.map
|
|
36
|
+
const handler = event.map
|
|
37
|
+
.getScene()
|
|
38
|
+
.drillPick(event.windowPosition, undefined, 10, 10)
|
|
37
39
|
.find((p) => {
|
|
38
40
|
return p?.primitive?.olFeature?.[handlerSymbol];
|
|
39
41
|
});
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { LinearRing } from 'ol/geom.js';
|
|
2
2
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
EventType,
|
|
5
|
+
ModificationKeyType,
|
|
6
|
+
} from '../../../interaction/interactionType.js';
|
|
4
7
|
import { cartesian2DDistance } from '../../math.js';
|
|
5
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
createVertex,
|
|
10
|
+
pointOnLine2D,
|
|
11
|
+
pointOnLine3D,
|
|
12
|
+
} from '../editorHelpers.js';
|
|
6
13
|
import VcsEvent from '../../../vcsEvent.js';
|
|
7
14
|
|
|
8
15
|
/**
|
|
@@ -65,9 +72,10 @@ class InsertVertexInteraction extends AbstractInteraction {
|
|
|
65
72
|
const length = lineCoords.length - 1;
|
|
66
73
|
let i = 0;
|
|
67
74
|
for (i; i < length; i++) {
|
|
68
|
-
const onLine =
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
const onLine =
|
|
76
|
+
this._feature.get('olcs_altitudeMode') === 'clampToGround' // todo altitude mode
|
|
77
|
+
? pointOnLine2D(lineCoords[i], lineCoords[i + 1], closestCoord)
|
|
78
|
+
: pointOnLine3D(lineCoords[i], lineCoords[i + 1], closestCoord);
|
|
71
79
|
if (onLine) {
|
|
72
80
|
break;
|
|
73
81
|
}
|
|
@@ -77,7 +85,10 @@ class InsertVertexInteraction extends AbstractInteraction {
|
|
|
77
85
|
if (this._isLinearRing && index === lineCoords.length) {
|
|
78
86
|
index = 0;
|
|
79
87
|
}
|
|
80
|
-
this.vertexInserted.raiseEvent({
|
|
88
|
+
this.vertexInserted.raiseEvent({
|
|
89
|
+
vertex: createVertex(closestCoord),
|
|
90
|
+
index,
|
|
91
|
+
});
|
|
81
92
|
}
|
|
82
93
|
}
|
|
83
94
|
return event;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import DragPan from 'ol/interaction/DragPan.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EventType,
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
} from '../../../interaction/interactionType.js';
|
|
3
6
|
import { handlerSymbol, vertexSymbol } from '../editorSymbols.js';
|
|
4
7
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
5
8
|
|
|
@@ -8,8 +11,12 @@ import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
|
8
11
|
* @returns {function():void}
|
|
9
12
|
*/
|
|
10
13
|
function suspendOpenlayerMap(map) {
|
|
11
|
-
const dragPan = /** @type {import("ol/interaction").DragPan} */ (
|
|
12
|
-
.
|
|
14
|
+
const dragPan = /** @type {import("ol/interaction").DragPan} */ (
|
|
15
|
+
map.olMap
|
|
16
|
+
.getInteractions()
|
|
17
|
+
.getArray()
|
|
18
|
+
.find((i) => i instanceof DragPan)
|
|
19
|
+
);
|
|
13
20
|
|
|
14
21
|
if (dragPan) {
|
|
15
22
|
dragPan.setActive(false);
|
|
@@ -36,20 +43,26 @@ function suspendCesiumMap(map) {
|
|
|
36
43
|
|
|
37
44
|
const originalScreenSpaceEvents = {};
|
|
38
45
|
const { screenSpaceCameraController } = map.getScene();
|
|
39
|
-
['lookEventTypes', 'tiltEventTypes', 'rotateEventTypes'].forEach(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
['lookEventTypes', 'tiltEventTypes', 'rotateEventTypes'].forEach(
|
|
47
|
+
(eventTypes) => {
|
|
48
|
+
if (screenSpaceCameraController != null) {
|
|
49
|
+
originalScreenSpaceEvents[eventTypes] = getOriginalEventTypes(
|
|
50
|
+
screenSpaceCameraController[eventTypes],
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
);
|
|
45
55
|
screenSpaceCameraController.lookEventTypes = undefined;
|
|
46
56
|
screenSpaceCameraController.tiltEventTypes = undefined;
|
|
47
57
|
screenSpaceCameraController.rotateEventTypes = undefined;
|
|
48
58
|
|
|
49
59
|
return () => {
|
|
50
|
-
screenSpaceCameraController.lookEventTypes =
|
|
51
|
-
|
|
52
|
-
screenSpaceCameraController.
|
|
60
|
+
screenSpaceCameraController.lookEventTypes =
|
|
61
|
+
originalScreenSpaceEvents.lookEventTypes;
|
|
62
|
+
screenSpaceCameraController.tiltEventTypes =
|
|
63
|
+
originalScreenSpaceEvents.tiltEventTypes;
|
|
64
|
+
screenSpaceCameraController.rotateEventTypes =
|
|
65
|
+
originalScreenSpaceEvents.rotateEventTypes;
|
|
53
66
|
};
|
|
54
67
|
}
|
|
55
68
|
|
|
@@ -80,10 +93,14 @@ class MapInteractionController extends AbstractInteraction {
|
|
|
80
93
|
(event.feature[vertexSymbol] || event.feature[handlerSymbol])
|
|
81
94
|
) {
|
|
82
95
|
if (event.map.className === 'CesiumMap') {
|
|
83
|
-
this._clear = suspendCesiumMap(
|
|
96
|
+
this._clear = suspendCesiumMap(
|
|
97
|
+
/** @type {import("@vcmap/core").CesiumMap} */ (event.map),
|
|
98
|
+
);
|
|
84
99
|
} else {
|
|
85
100
|
this._clear = suspendOpenlayerMap(
|
|
86
|
-
/** @type {import("@vcmap/core").OpenlayersMap|import("@vcmap/core").ObliqueMap} */ (
|
|
101
|
+
/** @type {import("@vcmap/core").OpenlayersMap|import("@vcmap/core").ObliqueMap} */ (
|
|
102
|
+
event.map
|
|
103
|
+
),
|
|
87
104
|
);
|
|
88
105
|
}
|
|
89
106
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EventType,
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
} from '../../../interaction/interactionType.js';
|
|
3
6
|
import { vertexSymbol } from '../editorSymbols.js';
|
|
4
7
|
import VcsEvent from '../../../vcsEvent.js';
|
|
5
8
|
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EventType,
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
} from '../../../interaction/interactionType.js';
|
|
3
6
|
import SelectMultiFeatureInteraction from './selectMultiFeatureInteraction.js';
|
|
4
7
|
import SelectSingleFeatureInteraction from './selectSingleFeatureInteraction.js';
|
|
5
8
|
import { cursorMap } from './editGeometryMouseOverInteraction.js';
|
|
@@ -33,7 +36,9 @@ class SelectFeatureMouseOverInteraction extends AbstractInteraction {
|
|
|
33
36
|
if (selectFeatureInteraction instanceof SelectSingleFeatureInteraction) {
|
|
34
37
|
modkeys = ModificationKeyType.NONE;
|
|
35
38
|
selectionMode = SelectionMode.SINGLE;
|
|
36
|
-
} else if (
|
|
39
|
+
} else if (
|
|
40
|
+
selectFeatureInteraction instanceof SelectMultiFeatureInteraction
|
|
41
|
+
) {
|
|
37
42
|
modkeys = ModificationKeyType.NONE | ModificationKeyType.CTRL;
|
|
38
43
|
selectionMode = SelectionMode.MULTI;
|
|
39
44
|
} else {
|
|
@@ -69,11 +74,9 @@ class SelectFeatureMouseOverInteraction extends AbstractInteraction {
|
|
|
69
74
|
* @returns {Promise<InteractionEvent>}
|
|
70
75
|
*/
|
|
71
76
|
async pipe(event) {
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
) {
|
|
76
|
-
this._currentFeature = /** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
77
|
+
if (event.feature && event.feature[vcsLayerName] === this.layerName) {
|
|
78
|
+
this._currentFeature =
|
|
79
|
+
/** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
77
80
|
(event.feature);
|
|
78
81
|
} else {
|
|
79
82
|
this._currentFeature = null;
|
|
@@ -114,11 +117,17 @@ class SelectFeatureMouseOverInteraction extends AbstractInteraction {
|
|
|
114
117
|
*/
|
|
115
118
|
_evaluate(modifier) {
|
|
116
119
|
if (this._currentFeature) {
|
|
117
|
-
const isCtrlPressed =
|
|
118
|
-
|
|
120
|
+
const isCtrlPressed =
|
|
121
|
+
this.selectionMode === SelectionMode.MULTI &&
|
|
122
|
+
modifier & ModificationKeyType.CTRL;
|
|
123
|
+
const isSelected = this._selectFeatureInteraction.hasFeatureId(
|
|
124
|
+
this._currentFeature.getId(),
|
|
125
|
+
);
|
|
119
126
|
|
|
120
127
|
if (isCtrlPressed) {
|
|
121
|
-
this.cursorStyle.cursor = isSelected
|
|
128
|
+
this.cursorStyle.cursor = isSelected
|
|
129
|
+
? cursorMap.removeFromSelection
|
|
130
|
+
: cursorMap.addToSelection;
|
|
122
131
|
} else {
|
|
123
132
|
this.cursorStyle.cursor = cursorMap.select;
|
|
124
133
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EventType,
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
} from '../../../interaction/interactionType.js';
|
|
3
6
|
import VcsEvent from '../../../vcsEvent.js';
|
|
4
7
|
import { vcsLayerName } from '../../../layer/layerSymbols.js';
|
|
5
8
|
import { isTiledFeature } from '../../../layer/featureStoreLayer.js';
|
|
@@ -43,7 +46,9 @@ class SelectMultiFeatureInteraction extends AbstractInteraction {
|
|
|
43
46
|
* @type {VcsEvent<Array<import("ol").Feature>>}
|
|
44
47
|
* @readonly
|
|
45
48
|
*/
|
|
46
|
-
get featuresChanged() {
|
|
49
|
+
get featuresChanged() {
|
|
50
|
+
return this._featuresChanged;
|
|
51
|
+
}
|
|
47
52
|
|
|
48
53
|
/**
|
|
49
54
|
* @returns {Array<import("ol").Feature>}
|
|
@@ -67,16 +72,14 @@ class SelectMultiFeatureInteraction extends AbstractInteraction {
|
|
|
67
72
|
* @returns {Promise<InteractionEvent>}
|
|
68
73
|
*/
|
|
69
74
|
async pipe(event) {
|
|
70
|
-
if (
|
|
71
|
-
event.feature &&
|
|
72
|
-
event.feature[vcsLayerName] === this._layer.name
|
|
73
|
-
) {
|
|
75
|
+
if (event.feature && event.feature[vcsLayerName] === this._layer.name) {
|
|
74
76
|
if (event.key & ModificationKeyType.CTRL) {
|
|
75
77
|
event.stopPropagation = true;
|
|
76
78
|
await this._modifySelectionSet(event.feature);
|
|
77
79
|
} else if (
|
|
78
80
|
!this._selectedFeatures.has(event.feature.getId()) ||
|
|
79
|
-
(this._selectedFeatures.has(event.feature.getId()) &&
|
|
81
|
+
(this._selectedFeatures.has(event.feature.getId()) &&
|
|
82
|
+
this._selectedFeatures.size > 1)
|
|
80
83
|
) {
|
|
81
84
|
event.stopPropagation = true;
|
|
82
85
|
await this.setSelected([event.feature]);
|
|
@@ -94,16 +97,21 @@ class SelectMultiFeatureInteraction extends AbstractInteraction {
|
|
|
94
97
|
async setSelected(features) {
|
|
95
98
|
this._selectedFeatures.clear();
|
|
96
99
|
const featureArray = Array.isArray(features) ? features : [features];
|
|
97
|
-
const olFeatures = await Promise.all(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
const olFeatures = await Promise.all(
|
|
101
|
+
featureArray.map((f) => {
|
|
102
|
+
if (f[isTiledFeature]) {
|
|
103
|
+
return /** @type {import("@vcmap/core").FeatureStoreLayer} */ (
|
|
104
|
+
this._layer
|
|
105
|
+
).switchStaticFeatureToDynamic(f.getId());
|
|
106
|
+
}
|
|
107
|
+
return f;
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
olFeatures.forEach(
|
|
111
|
+
/** @param {import("ol").Feature} f */ (f) => {
|
|
112
|
+
this._selectedFeatures.set(f.getId(), f);
|
|
113
|
+
},
|
|
114
|
+
);
|
|
107
115
|
|
|
108
116
|
this._featuresChanged.raiseEvent(this.selected);
|
|
109
117
|
}
|
|
@@ -120,10 +128,15 @@ class SelectMultiFeatureInteraction extends AbstractInteraction {
|
|
|
120
128
|
} else {
|
|
121
129
|
let olFeature = feature;
|
|
122
130
|
if (feature[isTiledFeature]) {
|
|
123
|
-
olFeature =
|
|
124
|
-
.
|
|
131
|
+
olFeature =
|
|
132
|
+
await /** @type {import("@vcmap/core").FeatureStoreLayer} */ (
|
|
133
|
+
this._layer
|
|
134
|
+
).switchStaticFeatureToDynamic(id);
|
|
125
135
|
}
|
|
126
|
-
this._selectedFeatures.set(
|
|
136
|
+
this._selectedFeatures.set(
|
|
137
|
+
id,
|
|
138
|
+
/** @type {import("ol").Feature} */ (olFeature),
|
|
139
|
+
);
|
|
127
140
|
}
|
|
128
141
|
|
|
129
142
|
this._featuresChanged.raiseEvent(this.selected);
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import AbstractInteraction from '../../../interaction/abstractInteraction.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EventType,
|
|
4
|
+
ModificationKeyType,
|
|
5
|
+
} from '../../../interaction/interactionType.js';
|
|
3
6
|
import VcsEvent from '../../../vcsEvent.js';
|
|
4
7
|
import { vcsLayerName } from '../../../layer/layerSymbols.js';
|
|
5
8
|
import { isTiledFeature } from '../../../layer/featureStoreLayer.js';
|
|
@@ -48,11 +51,13 @@ class SelectSingleFeatureInteraction extends AbstractInteraction {
|
|
|
48
51
|
* @returns {Promise<InteractionEvent>}
|
|
49
52
|
*/
|
|
50
53
|
async pipe(event) {
|
|
51
|
-
if (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
if (event.feature && event.feature[vcsLayerName] === this._layer.name) {
|
|
55
|
+
if (
|
|
56
|
+
!(
|
|
57
|
+
this._selectedFeature &&
|
|
58
|
+
event.feature.getId() === this._selectedFeature.getId()
|
|
59
|
+
)
|
|
60
|
+
) {
|
|
56
61
|
event.stopPropagation = true;
|
|
57
62
|
await this.setSelected(
|
|
58
63
|
/** @type {import("ol").Feature|import("@vcmap-cesium/engine").Cesium3DTileFeature|import("@vcmap-cesium/engine").Cesium3DTilePointFeature} */
|
|
@@ -74,8 +79,9 @@ class SelectSingleFeatureInteraction extends AbstractInteraction {
|
|
|
74
79
|
async setSelected(feature) {
|
|
75
80
|
let olFeature = Array.isArray(feature) ? feature[0] : feature;
|
|
76
81
|
if (feature[isTiledFeature]) {
|
|
77
|
-
olFeature = await /** @type {import("@vcmap/core").FeatureStoreLayer} */ (
|
|
78
|
-
.
|
|
82
|
+
olFeature = await /** @type {import("@vcmap/core").FeatureStoreLayer} */ (
|
|
83
|
+
this._layer
|
|
84
|
+
).switchStaticFeatureToDynamic(olFeature.getId());
|
|
79
85
|
}
|
|
80
86
|
|
|
81
87
|
this._selectedFeature = /** @type {import("ol").Feature} */ (olFeature);
|
|
@@ -4,7 +4,9 @@ import { createSync } from '../../layer/vectorSymbols.js';
|
|
|
4
4
|
import { SessionType, setupInteractionChain } from './editorSessionHelpers.js';
|
|
5
5
|
import SelectSingleFeatureInteraction from './interactions/selectSingleFeatureInteraction.js';
|
|
6
6
|
import SelectMultiFeatureInteraction from './interactions/selectMultiFeatureInteraction.js';
|
|
7
|
-
import SelectFeatureMouseOverInteraction, {
|
|
7
|
+
import SelectFeatureMouseOverInteraction, {
|
|
8
|
+
SelectionMode,
|
|
9
|
+
} from './interactions/selectFeatureMouseOverInteraction.js';
|
|
8
10
|
import VcsEvent from '../../vcsEvent.js';
|
|
9
11
|
import ObliqueMap from '../../map/obliqueMap.js';
|
|
10
12
|
import { vcsLayerName } from '../../layer/layerSymbols.js';
|
|
@@ -30,10 +32,12 @@ function createHighlightManager(layer, highlightStyle) {
|
|
|
30
32
|
* @param {Array<import("ol").Feature>} newFeatures Features to be highlighted.
|
|
31
33
|
*/
|
|
32
34
|
const update = (newFeatures) => {
|
|
33
|
-
const newIds = new Set(
|
|
34
|
-
f
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
const newIds = new Set(
|
|
36
|
+
newFeatures.map((f) => {
|
|
37
|
+
f[createSync] = true;
|
|
38
|
+
return f.getId();
|
|
39
|
+
}),
|
|
40
|
+
);
|
|
37
41
|
const idsToHighlight = [];
|
|
38
42
|
newIds.forEach((id) => {
|
|
39
43
|
if (!currentFeaturesMap.has(id)) {
|
|
@@ -49,11 +53,17 @@ function createHighlightManager(layer, highlightStyle) {
|
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
layer.featureVisibility.unHighlight(idsToUnHighlight);
|
|
52
|
-
layer.featureVisibility.highlight(
|
|
53
|
-
|
|
56
|
+
layer.featureVisibility.highlight(
|
|
57
|
+
Object.fromEntries(idsToHighlight.map((id) => [id, highlightStyle])),
|
|
58
|
+
);
|
|
59
|
+
layer
|
|
60
|
+
.getFeaturesById(idsToUnHighlight)
|
|
61
|
+
.forEach((feature) => delete feature[createSync]);
|
|
54
62
|
|
|
55
63
|
currentFeaturesMap.clear();
|
|
56
|
-
newFeatures.forEach(
|
|
64
|
+
newFeatures.forEach((feature) =>
|
|
65
|
+
currentFeaturesMap.set(feature.getId(), feature),
|
|
66
|
+
);
|
|
57
67
|
};
|
|
58
68
|
|
|
59
69
|
return {
|
|
@@ -61,14 +71,18 @@ function createHighlightManager(layer, highlightStyle) {
|
|
|
61
71
|
return [...currentFeaturesMap.values()];
|
|
62
72
|
},
|
|
63
73
|
update(newFeatures) {
|
|
64
|
-
const featuresOnHighlightLayer = newFeatures.filter(
|
|
74
|
+
const featuresOnHighlightLayer = newFeatures.filter(
|
|
75
|
+
(feature) => feature[vcsLayerName] === layer.name,
|
|
76
|
+
);
|
|
65
77
|
update(featuresOnHighlightLayer);
|
|
66
78
|
},
|
|
67
79
|
destroy() {
|
|
68
80
|
if (currentFeaturesMap.size > 0) {
|
|
69
81
|
const idsToUnHighlight = [...currentFeaturesMap.keys()];
|
|
70
82
|
layer.featureVisibility.unHighlight(idsToUnHighlight);
|
|
71
|
-
layer
|
|
83
|
+
layer
|
|
84
|
+
.getFeaturesById(idsToUnHighlight)
|
|
85
|
+
.forEach((feature) => delete feature[createSync]);
|
|
72
86
|
currentFeaturesMap.clear();
|
|
73
87
|
}
|
|
74
88
|
},
|
|
@@ -141,9 +155,7 @@ function startSelectFeaturesSession(
|
|
|
141
155
|
destroy: destroyInteractionChain,
|
|
142
156
|
} = setupInteractionChain(app.maps.eventHandler, interactionId);
|
|
143
157
|
|
|
144
|
-
const highlightManager = createHighlightManager(
|
|
145
|
-
layer, highlightStyle,
|
|
146
|
-
);
|
|
158
|
+
const highlightManager = createHighlightManager(layer, highlightStyle);
|
|
147
159
|
|
|
148
160
|
let interactionListeners = [];
|
|
149
161
|
function destroyCurrentSelectInteraction() {
|
|
@@ -159,7 +171,9 @@ function startSelectFeaturesSession(
|
|
|
159
171
|
mouseOverInteraction = null;
|
|
160
172
|
}
|
|
161
173
|
}
|
|
162
|
-
interactionListeners.forEach((cb) => {
|
|
174
|
+
interactionListeners.forEach((cb) => {
|
|
175
|
+
cb();
|
|
176
|
+
});
|
|
163
177
|
interactionListeners = [];
|
|
164
178
|
}
|
|
165
179
|
|
|
@@ -190,13 +204,15 @@ function startSelectFeaturesSession(
|
|
|
190
204
|
} else if (newMode === SelectionMode.MULTI) {
|
|
191
205
|
currentSelectInteraction = new SelectMultiFeatureInteraction(layer);
|
|
192
206
|
interactionListeners.push(
|
|
193
|
-
currentSelectInteraction.featuresChanged.addEventListener(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
obliqueMap
|
|
198
|
-
|
|
199
|
-
|
|
207
|
+
currentSelectInteraction.featuresChanged.addEventListener(
|
|
208
|
+
(features) => {
|
|
209
|
+
highlightManager.update(features);
|
|
210
|
+
featuresChanged.raiseEvent(features);
|
|
211
|
+
if (obliqueMap) {
|
|
212
|
+
obliqueMap.switchEnabled = features.length === 0;
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
),
|
|
200
216
|
);
|
|
201
217
|
}
|
|
202
218
|
const { highlightedFeatures } = highlightManager;
|