UX: fix zooming of minimaps, fix #1892

This commit is contained in:
Pieter Vander Vennet 2024-04-24 00:28:29 +02:00
parent 3968a1e841
commit e9b7df6d2d
2 changed files with 62 additions and 51 deletions

View file

@ -154,7 +154,7 @@ class PointRenderingLayer {
if (this._onClick) {
const self = this
el.addEventListener("click", function (ev) {
el.addEventListener("click", function(ev) {
ev.preventDefault()
self._onClick(feature)
// Workaround to signal the MapLibreAdaptor to ignore this click
@ -200,7 +200,7 @@ class LineRenderingLayer {
"lineCap",
"offset",
"fill",
"fillColor",
"fillColor"
] as const
private static readonly lineConfigKeysColor = ["color", "fillColor"] as const
@ -264,8 +264,8 @@ class LineRenderingLayer {
"icon-rotation-alignment": "map",
"icon-pitch-alignment": "map",
"icon-image": imgId,
"icon-size": 0.055,
},
"icon-size": 0.055
}
}
const filter = img.if?.asMapboxExpression()
if (filter) {
@ -338,9 +338,9 @@ class LineRenderingLayer {
type: "geojson",
data: {
type: "FeatureCollection",
features,
features
},
promoteId: "id",
promoteId: "id"
})
const linelayer = this._layername + "_line"
const layer: AddLayerObject = {
@ -351,11 +351,11 @@ class LineRenderingLayer {
"line-color": ["feature-state", "color"],
"line-opacity": ["feature-state", "color-opacity"],
"line-width": ["feature-state", "width"],
"line-offset": ["feature-state", "offset"],
"line-offset": ["feature-state", "offset"]
},
layout: {
"line-cap": "round",
},
"line-cap": "round"
}
}
if (this._config.dashArray) {
layer.paint["line-dasharray"] =
@ -393,8 +393,8 @@ class LineRenderingLayer {
layout: {},
paint: {
"fill-color": ["feature-state", "fillColor"],
"fill-opacity": ["feature-state", "fillColor-opacity"],
},
"fill-opacity": ["feature-state", "fillColor-opacity"]
}
})
if (this._onClick) {
map.on("click", polylayer, (e) => {
@ -425,7 +425,7 @@ class LineRenderingLayer {
this.currentSourceData = features
src.setData({
type: "FeatureCollection",
features: this.currentSourceData,
features: this.currentSourceData
})
}
}
@ -494,8 +494,7 @@ export default class ShowDataLayer {
}
) {
this._options = options
const self = this
this.onDestroy.push(map.addCallbackAndRunD((map) => self.initDrawFeatures(map)))
this.onDestroy.push(map.addCallbackAndRunD((map) => this.initDrawFeatures(map)))
}
public static showMultipleLayers(
@ -509,14 +508,24 @@ export default class ShowDataLayer {
layers.filter((l) => l.source !== null).map((l) => new FilteredLayer(l)),
features,
{
constructStore: (features, layer) => new SimpleFeatureSource(layer, features),
constructStore: (features, layer) => new SimpleFeatureSource(layer, features)
}
)
if (options?.zoomToFeatures) {
options.zoomToFeatures = false
features.features.addCallbackD(features => {
ShowDataLayer.zoomToCurrentFeatures(mlmap.data, features)
})
mlmap.addCallbackD(map => {
ShowDataLayer.zoomToCurrentFeatures(map, features.features.data)
})
}
perLayer.forEach((fs) => {
new ShowDataLayer(mlmap, {
layer: fs.layer.layerDef,
features: fs,
...(options ?? {}),
...(options ?? {})
})
})
}
@ -529,34 +538,39 @@ export default class ShowDataLayer {
return new ShowDataLayer(map, {
layer: ShowDataLayer.rangeLayer,
features,
doShowLayer,
doShowLayer
})
}
public destruct() {}
public destruct() {
}
private zoomToCurrentFeatures(map: MlMap) {
if (this._options.zoomToFeatures) {
const features = this._options.features.features.data
const bbox = BBox.bboxAroundAll(features.map(BBox.get))
map.resize()
map.fitBounds(bbox.toLngLat(), {
padding: { top: 10, bottom: 10, left: 10, right: 10 },
animate: false,
})
private static zoomToCurrentFeatures(map: MlMap, features: Feature[]) {
if (!features || !map || features.length == 0) {
return
}
const bbox = BBox.bboxAroundAll(features.map(BBox.get))
console.log("Zooming to features", bbox.asGeoJson())
window.requestAnimationFrame(() => {
map.resize()
map.fitBounds(bbox.toLngLat(), {
padding: { top: 10, bottom: 10, left: 10, right: 10 },
animate: false
})
})
}
private initDrawFeatures(map: MlMap) {
let { features, doShowLayer, fetchStore, selectedElement } = this._options
const { features, doShowLayer, fetchStore, selectedElement } = this._options
let onClick = this._options.onClick
if (!onClick && selectedElement) {
onClick =
this._options.layer.title === undefined
? undefined
: (feature: Feature) => {
selectedElement?.setData(feature)
}
selectedElement?.setData(feature)
}
}
if (this._options.drawLines !== false) {
for (let i = 0; i < this._options.layer.lineRendering.length; i++) {
@ -587,6 +601,8 @@ export default class ShowDataLayer {
)
}
}
features.features.addCallbackAndRunD((_) => this.zoomToCurrentFeatures(map))
if (this._options.zoomToFeatures) {
features.features.addCallbackAndRunD((features) => ShowDataLayer.zoomToCurrentFeatures(map, features))
}
}
}