X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.geo%2Fsrc%2Forg%2Fargeo%2Fapp%2Fgeo%2Fux%2FOpenLayersMapPart.java;h=0d99f40300bacff44cd1a2a9638ddd8638565ddb;hb=362c92fd2bdb555e1d691b661f0ee69c513be5a8;hp=829b343a38bccd88dffe60f99899e9e22263e4dd;hpb=59da7271e876ca8a429beb86b67e7350eef1e1ca;p=gpl%2Fargeo-suite.git 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 829b343..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 @@ -1,11 +1,23 @@ package org.argeo.app.geo.ux; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.argeo.app.ol.AbstractOlObject; +import org.argeo.app.ol.Layer; import org.argeo.app.ol.OlMap; -import org.argeo.app.ux.js.AbstractJsObject; +import org.argeo.app.ol.TileLayer; +import org.argeo.app.ol.VectorLayer; import org.argeo.app.ux.js.JsClient; +import org.locationtech.jts.geom.Envelope; -public class OpenLayersMapPart extends AbstractGeoJsObject { - private String mapPartName; +/** + * A wrapper around an OpenLayers map, adding specific features, such as SLD + * styling. + */ +public class OpenLayersMapPart extends AbstractGeoJsObject implements MapPart { + private final String mapPartName; public OpenLayersMapPart(JsClient jsClient, String mapPartName) { super(mapPartName); @@ -16,4 +28,80 @@ public class OpenLayersMapPart extends AbstractGeoJsObject { public OlMap getMap() { return new OlMap(getJsClient(), getReference() + ".getMap()"); } + + public void setSld(String xml) { + executeMethod(getMethodName(), JsClient.escapeQuotes(xml)); + } + + public void setCenter(double lat, double lon) { + executeMethod(getMethodName(), lat, lon); + } + + public void fit(double[] extent, Map options) { + executeMethod(getMethodName(), extent, options); + } + + public void fit(Envelope extent, Map options) { + fit(new double[] { extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY() }, options); + } + + public void applyStyle(String layerName, String styledLayerName) { + executeMethod(getMethodName(), layerName, styledLayerName); + } + + public Layer getLayer(String name) { + // TODO deal with not found + String reference = getReference() + ".getLayerByName('" + name + "')"; + if (getJsClient().isInstanceOf(reference, AbstractOlObject.getJsClassName(VectorLayer.class))) { + return new VectorLayer(getJsClient(), reference); + } else if (getJsClient().isInstanceOf(reference, AbstractOlObject.getJsClassName(TileLayer.class))) { + return new TileLayer(getJsClient(), reference); + } else { + return new Layer(getJsClient(), reference); + } + } + + public String getMapPartName() { + return mapPartName; + } + + public void selectFeatures(String layerName, Object... ids) { + executeMethod(getMethodName(), layerName, (Object[]) ids); + } + + public void fitToLayer(String layerName) { + executeMethod(getMethodName(), layerName); + } + + /* + * 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) { + getJsClient().getReadyStage().thenAccept((ready) -> { + String functionName = getJsClient().createJsFunction(getMapPartName() + "__on" + suffix, toDo); + getJsClient().execute(getJsReference() + ".callbacks['on" + suffix + "']=" + functionName + ";"); + executeMethod("enable" + suffix); + }); + } + }