From: Mathieu Baudier Date: Wed, 18 Oct 2023 10:04:53 +0000 (+0200) Subject: Clean up OpenLayers integration X-Git-Tag: v2.3.17~1 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=362c92fd2bdb555e1d691b661f0ee69c513be5a8 Clean up OpenLayers integration --- diff --git a/js/src/geo/LayerStyles.js b/js/src/geo/LayerStyles.js deleted file mode 100644 index 8c50c67..0000000 --- a/js/src/geo/LayerStyles.js +++ /dev/null @@ -1,6 +0,0 @@ -import * as SLDReader from '@nieuwlandgeo/sldreader'; - -export default class LayerStyles { - #sld; - -} \ No newline at end of file diff --git a/js/src/geo/MapPart.js b/js/src/geo/MapPart.js index d2f712c..b7fd086 100644 --- a/js/src/geo/MapPart.js +++ b/js/src/geo/MapPart.js @@ -16,26 +16,11 @@ export default class MapPart { // // ABSTRACT METHODS // - - /** Zoom the map to the given value. */ - setZoom(zoom) { - throw new Error("Abstract method"); - } - /** Set the center of the map to the given coordinates. */ setCenter(lng, lat) { throw new Error("Abstract method"); } - /** Add a single point. */ - addPoint(lng, lat, style) { - throw new Error("Abstract method"); - } - - addUrlLayer(url, format) { - throw new Error("Abstract method"); - } - // // EXTENSIONS // diff --git a/js/src/geo/OpenLayersMapPart.js b/js/src/geo/OpenLayersMapPart.js index 4be5987..a31bc21 100644 --- a/js/src/geo/OpenLayersMapPart.js +++ b/js/src/geo/OpenLayersMapPart.js @@ -3,25 +3,18 @@ */ import { fromLonLat, getPointResolution } from 'ol/proj.js'; -import Feature from 'ol/Feature.js'; -import { Point } from 'ol/geom.js'; import { transformExtent } from 'ol/proj.js'; -import VectorLayer from 'ol/layer/Vector.js'; import TileLayer from 'ol/layer/Tile.js'; -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'; -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'; @@ -34,13 +27,15 @@ export default class OpenLayersMapPart extends MapPart { /** The OpenLayers Map. */ #map; + /** The overview map */ #overviewMap; - select; - /** Styled layer descriptor */ #sld; + /** The select interaction */ + select; + /** Externally added callback functions. */ callbacks = {}; @@ -81,10 +76,6 @@ export default class OpenLayersMapPart extends MapPart { /* GEOGRAPHICAL METHODS */ - setZoom(zoom) { - this.#map.getView().setZoom(zoom); - } - setCenter(lat, lon) { this.#map.getView().setCenter(fromLonLat([lon, lat])); } @@ -94,49 +85,7 @@ export default class OpenLayersMapPart extends MapPart { this.#map.getView().fit(transformed, options); } - addPoint(lng, lat, style) { - let vectorSource = new VectorSource({ - features: [new Feature({ - geometry: new Point(fromLonLat([lng, lat])) - })] - }); - this.#map.addLayer(new VectorLayer({ - source: vectorSource, - style: style, - })); - } - - addUrlLayer(url, format, style, sld) { - let featureFormat; - if (format === 'GEOJSON') { - featureFormat = new GeoJSON(); - } - else if (format === 'GPX') { - featureFormat = new GPX(); - } else { - throw new Error("Unsupported format " + format); - } - const vectorSource = new VectorSource({ - url: url, - format: featureFormat, - }); - const vectorLayer = new VectorLayer({ - source: vectorSource, - }); - if (sld) { - this.#applySLD(vectorLayer, style); - } else if (style !== null) { - vectorLayer.setStyle(style); - } - this.#map.addLayer(vectorLayer); - } - - addLayer(js) { - const func = new Function(js); - const layer = (func)(); - this.#map.addLayer(layer); - } - + /** Accessors */ getMap() { return this.#map; } @@ -235,13 +184,6 @@ export default class OpenLayersMapPart extends MapPart { }); } - // - // HTML - // - getMapDivCssClass() { - return 'map'; - } - selectFeatures(layerName, featureIds) { // we cannot use 'this' in the function provided to OpenLayers let mapPart = this; @@ -280,6 +222,14 @@ export default class OpenLayersMapPart extends MapPart { }); } + // + // HTML + // + getMapDivCssClass() { + return 'map'; + } + + // // STATIC FOR EXTENSION // diff --git a/js/src/geo/export-package.js b/js/src/geo/export-package.js index cdf39c7..50b9d04 100644 --- a/js/src/geo/export-package.js +++ b/js/src/geo/export-package.js @@ -9,6 +9,7 @@ import TileLayer from 'ol/layer/Tile.js'; import VectorSource from 'ol/source/Vector.js'; import VectorLayer from 'ol/layer/Vector.js'; import GeoJSON from 'ol/format/GeoJSON.js'; +import { Style, Icon } from 'ol/style.js'; // PSEUDO PACKAGE if (typeof globalThis.argeo === 'undefined') @@ -36,6 +37,8 @@ globalThis.argeo.tp.ol.OSM = OSM; globalThis.argeo.tp.ol.VectorSource = VectorSource; globalThis.argeo.tp.ol.VectorLayer = VectorLayer; globalThis.argeo.tp.ol.GeoJSON = GeoJSON; +globalThis.argeo.tp.ol.Style = Style; +globalThis.argeo.tp.ol.Icon = Icon; "use strict"; diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/JsImplementation.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/JsImplementation.java deleted file mode 100644 index 56b892b..0000000 --- a/org.argeo.app.geo/src/org/argeo/app/geo/ux/JsImplementation.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.argeo.app.geo.ux; - -/** Known JavaScript implementations for this package. */ -public enum JsImplementation { - OPENLAYERS_MAP_PART("argeo.app.geo.OpenLayersMapPart"); - - private String jsClass; - - JsImplementation(String jsClass) { - this.jsClass = jsClass; - } - - public String getJsClass() { - return jsClass; - } -} diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java index 84f4dd5..8d5da7e 100644 --- a/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java +++ b/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java @@ -2,17 +2,6 @@ package org.argeo.app.geo.ux; /** An UX part displaying a map. */ public interface MapPart { - /** A supported geographical data format. */ - enum GeoFormat { - GEOJSON, GPX; - } - - void addPoint(double lng, double lat, String style); - - void addUrlLayer(String url, GeoFormat format, String style); - - void setZoom(int zoom); - void setCenter(double lng, double lat); /** Event when a feature has been single-clicked. */ 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 6b5c926..0d99f40 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 @@ -4,9 +4,6 @@ import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; -import org.argeo.app.geo.ux.MapPart.FeaturePopupEvent; -import org.argeo.app.geo.ux.MapPart.FeatureSelectedEvent; -import org.argeo.app.geo.ux.MapPart.FeatureSingleClickEvent; import org.argeo.app.ol.AbstractOlObject; import org.argeo.app.ol.Layer; import org.argeo.app.ol.OlMap; @@ -19,7 +16,7 @@ import org.locationtech.jts.geom.Envelope; * A wrapper around an OpenLayers map, adding specific features, such as SLD * styling. */ -public class OpenLayersMapPart extends AbstractGeoJsObject { +public class OpenLayersMapPart extends AbstractGeoJsObject implements MapPart { private final String mapPartName; public OpenLayersMapPart(JsClient jsClient, String mapPartName) { @@ -36,7 +33,7 @@ public class OpenLayersMapPart extends AbstractGeoJsObject { executeMethod(getMethodName(), JsClient.escapeQuotes(xml)); } - public void setCenter(Double lat, Double lon) { + public void setCenter(double lat, double lon) { executeMethod(getMethodName(), lat, lon); } diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJsMapPart.java b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJsMapPart.java deleted file mode 100644 index c7e9156..0000000 --- a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtJsMapPart.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.argeo.app.geo.swt; - -import java.util.function.Consumer; -import java.util.function.Function; - -import org.argeo.app.geo.GeoUtils; -import org.argeo.app.geo.ux.JsImplementation; -import org.argeo.app.geo.ux.MapPart; -import org.argeo.app.swt.js.SwtBrowserJsPart; -import org.eclipse.swt.widgets.Composite; - -/** - * An SWT implementation of {@link MapPart} based on JavaScript. - */ -public class SwtJsMapPart extends SwtBrowserJsPart implements MapPart { - static final long serialVersionUID = 2713128477504858552L; - - private String jsImplementation = JsImplementation.OPENLAYERS_MAP_PART.getJsClass(); - private final String mapName;// = "argeoMap"; - - public SwtJsMapPart(String mapName, Composite parent, int style) { - super(parent, style, "/pkg/org.argeo.app.js/geo.html"); - this.mapName = mapName; - } - - @Override - protected void init() { - // create map - doExecute(getJsMapVar() + " = new " + jsImplementation + "('" + mapName + "');"); - } - - /* - * MapPart.js METHODS - */ - - @Override - public void addPoint(double lng, double lat, String style) { - executeMapMethod("addPoint(%f, %f, %s)", lng, lat, style == null ? "'default'" : style); - } - - @Override - public void addUrlLayer(String url, GeoFormat format, String style) { - executeMapMethod("addUrlLayer('%s', '%s', %s, false)", url, format.name(), style); - } - - public void addCssUrlLayer(String url, GeoFormat format, String css) { - String style = GeoUtils.createSldFromCss("layer", "Layer", css); - executeMapMethod("addUrlLayer('%s', '%s', '%s', true)", url, format.name(), style); - } - - public void addLayer() { - //executeMapMethod("addLayer(\"return new argeo.app.geo.TileLayer({source: new argeo.app.geo.OSM()})\")"); - executeMapMethod("getMap().addLayer(new argeo.tp.ol.TileLayer({source: new argeo.tp.ol.OSM()}))"); - } - - @Override - public void setZoom(int zoom) { - executeMapMethod("setZoom(%d)", zoom); - } - - @Override - public void setCenter(double lng, double lat) { - executeMapMethod("setCenter(%f, %f)", lng, lat); - } - - protected Object callMapMethod(String methodCall, Object... args) { - return callMethod(getJsMapVar(), methodCall, args); - } - - protected void executeMapMethod(String methodCall, Object... args) { - executeMethod(getJsMapVar(), methodCall, args); - } - - private String getJsMapVar() { - return getJsVarName(mapName); - } - - /* - * CALLBACKS - */ - public void onFeatureSelected(Consumer toDo) { - addCallback("FeatureSelected", (arr) -> { - toDo.accept(new FeatureSelectedEvent((String) arr[0])); - return null; - }); - } - - public void onFeatureSingleClick(Consumer toDo) { - addCallback("FeatureSingleClick", (arr) -> { - toDo.accept(new FeatureSingleClickEvent((String) arr[0])); - return null; - }); - } - - public void onFeaturePopup(Function toDo) { - addCallback("FeaturePopup", (arr) -> { - return toDo.apply(new FeaturePopupEvent((String) arr[0])); - }); - } - - protected void addCallback(String suffix, Function toDo) { - getReadyStage().thenAccept((ready) -> { - String functionName = createJsFunction(mapName + "__on" + suffix, toDo); - doExecute(getJsMapVar() + ".callbacks['on" + suffix + "']=" + functionName + ";"); - executeMethod(mapName, "enable" + suffix + "()"); - }); - } -} diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/map-overview.html b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/map-overview.html deleted file mode 100644 index b3fd036..0000000 --- a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/map-overview.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -
- - - - - \ No newline at end of file