From 720e78163faf96ccc966d155a516487af52ccec2 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 18 Oct 2023 11:39:02 +0200 Subject: [PATCH] Introduce fit to map layer --- js/src/geo/OpenLayersMapPart.js | 20 +++++++++++++++++++ .../argeo/app/geo/ux/OpenLayersMapPart.java | 4 ++++ .../argeo/app/swt/js/SwtBrowserJsPart.java | 9 +-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/js/src/geo/OpenLayersMapPart.js b/js/src/geo/OpenLayersMapPart.js index 6fedd7a..4be5987 100644 --- a/js/src/geo/OpenLayersMapPart.js +++ b/js/src/geo/OpenLayersMapPart.js @@ -14,6 +14,7 @@ import VectorSource from 'ol/source/Vector.js'; import GeoJSON from 'ol/format/GeoJSON.js'; import GPX from 'ol/format/GPX.js'; import OSM from 'ol/source/OSM.js'; +import { isEmpty } from 'ol/extent'; import Select from 'ol/interaction/Select.js'; import Overlay from 'ol/Overlay.js'; @@ -22,6 +23,7 @@ import { Style, Icon } from 'ol/style.js'; import Map from 'ol/Map.js'; import View from 'ol/View.js'; import { OverviewMap, ScaleLine, defaults as defaultControls } from 'ol/control.js'; +import { easeOut } from 'ol/easing'; import * as SLDReader from '@nieuwlandgeo/sldreader'; @@ -260,6 +262,24 @@ export default class OpenLayersMapPart extends MapPart { } } + fitToLayer(layerName) { + // we cannot use 'this' in the function provided to OpenLayers + let mapPart = this; + const layer = this.getLayerByName(layerName); + const source = layer.getSource(); + const extent = source.getExtent(); + const options = { + duration: 1000, + padding: [20, 20, 20, 20], + easing: easeOut, + }; + if (!isEmpty(extent)) + this.#map.getView().fit(source.getExtent(), options); + source.on('featuresloadend', function(e) { + mapPart.getMap().getView().fit(source.getExtent(), options); + }); + } + // // STATIC FOR EXTENSION // diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java index 512a473..6b5c926 100644 --- a/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java +++ b/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java @@ -72,6 +72,10 @@ public class OpenLayersMapPart extends AbstractGeoJsObject { executeMethod(getMethodName(), layerName, (Object[]) ids); } + public void fitToLayer(String layerName) { + executeMethod(getMethodName(), layerName); + } + /* * CALLBACKS */ diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java index ec359c6..41cc3af 100644 --- a/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java +++ b/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java @@ -85,20 +85,13 @@ public class SwtBrowserJsPart implements JsClient { } /** - * To be overridden with calls to {@link #loadExtension( Supplier toDo - * = () -> { boolean success = browser.execute(); return success; }; String)}. + * To be overridden with calls to {@link #loadExtension(String)}. */ protected void loadExtensions() { } protected void loadExtension(String url) { -// String js = """ -// var script = document.createElement("script"); -// script.src = '%s'; -// document.head.appendChild(script); -// """; -// browser.evaluate(String.format(Locale.ROOT, js, url)); browser.evaluate(String.format(Locale.ROOT, "import('%s')", url)); } -- 2.30.2