From: Mathieu Baudier Date: Tue, 29 Aug 2023 12:33:57 +0000 (+0200) Subject: Working integration with OpenLayers X-Git-Tag: v2.3.16~54 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=be0d3b8c6d90256157ebf0ba9dd7a8703165ba6b Working integration with OpenLayers --- diff --git a/org.argeo.app.geo.js/.externalToolBuilders/npm run build.launch b/org.argeo.app.geo.js/.externalToolBuilders/npm run build.launch new file mode 100644 index 0000000..18227db --- /dev/null +++ b/org.argeo.app.geo.js/.externalToolBuilders/npm run build.launch @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/org.argeo.app.geo.js/.project b/org.argeo.app.geo.js/.project index b4b7877..f3db5e6 100644 --- a/org.argeo.app.geo.js/.project +++ b/org.argeo.app.geo.js/.project @@ -15,6 +15,16 @@ + + org.eclipse.ui.externaltools.ExternalToolBuilder + auto,full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/npm run build.launch + + + org.eclipse.pde.PluginNature diff --git a/org.argeo.app.geo.js/bnd.bnd b/org.argeo.app.geo.js/bnd.bnd index 9ac9b10..818a44c 100644 --- a/org.argeo.app.geo.js/bnd.bnd +++ b/org.argeo.app.geo.js/bnd.bnd @@ -2,4 +2,4 @@ Export-Package: org.argeo.app.geo.js Provide-Capability:\ -cms.publish;pkg=org.argeo.app.geo.js;file="*.png,*.js,*.css,*.html" +cms.publish;pkg=org.argeo.app.geo.js;file="*.png,*.js,*.map,*.css,*.html" diff --git a/org.argeo.app.geo.js/src/org.argeo.app.geo.js/index.js b/org.argeo.app.geo.js/src/org.argeo.app.geo.js/index.js index a6f3c81..a665d91 100644 --- a/org.argeo.app.geo.js/src/org.argeo.app.geo.js/index.js +++ b/org.argeo.app.geo.js/src/org.argeo.app.geo.js/index.js @@ -2,18 +2,94 @@ import Map from 'ol/Map.js'; import OSM from 'ol/source/OSM.js'; import TileLayer from 'ol/layer/Tile.js'; import View from 'ol/View.js'; +import { fromLonLat, toLonLat } from 'ol/proj.js'; import 'ol/ol.css'; -const map = new Map({ - layers: [ - new TileLayer({ - source: new OSM(), - }), - ], - target: 'map', - view: new View({ - center: [0, 0], - zoom: 2, - }), -}); +//window.map = new Map({ +// layers: [ +// new TileLayer({ +// source: new OSM(), +// }), +// ], +// target: 'mapTarget', +// view: new View({ +// center: [0, 0], +// zoom: 2, +// }), +//}); +//window.map.on('rendercomplete', e => { +// console.log('Render completed.'); +// onRenderComplete(); +//}); +//map.getView().setZoom(4); + +if (typeof window.argeo === 'undefined') + window.argeo = {}; +if (typeof window.argeo.app === 'undefined') + window.argeo.app = {}; +if (typeof window.argeo.app.geo === 'undefined') + window.argeo.app.geo = {}; + + + +window.argeo.app.geo.ArgeoMap = { + map: new Map({ + layers: [ + new TileLayer({ + source: new OSM(), + }), + ], + target: 'map', + }), + + setZoom: function(zoom) { + this.map.getView().setZoom(zoom); + }, + + setCenter: function(lng, lat) { + this.map.getView().setCenter(fromLonLat([lng, lat])); + }, + +}; +//window.argeoMap = Object.create(argeo.app.geo.ArgeoMap); +//window.argeoMap.map.on('rendercomplete', e => { +// console.log('Render completed.'); +// onRenderComplete(); +//}); + + +//function argeo_app_geo_Map() { +// console.log('Entered constructor'); +// this.map = new Map({ +// layers: [ +// new TileLayer({ +// source: new OSM(), +// }), +// ], +// target: 'map', +// view: new View({ +// center: [0, 0], +// zoom: 2, +// }), +// }); +// this.map.on('rendercomplete', e => { +// console.log('Render completed.'); +// onRenderComplete(); +// }); +// +// this.setCenter = function(lng, lat) { +// console.log('Center set '); +// //this.map.getView().setCenter(ol.proj.fromLonLat([lng, lat])); +// } +// +// this.setZoom = function(zoom) { +// this.map.getView().setZoom(zoom); +// } +//} +// +//window.argeoMap = new argeo_app_geo_Map(); +//argeoMap.setCenter(13.404954, 52.520008); +//function setCenter(lng, lat) { +// map.getView().setCenter(lng, lat); +//} \ No newline at end of file diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java index 58ad21e..2edd0f1 100644 --- a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java +++ b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java @@ -12,6 +12,9 @@ public class MapUiProvider implements SwtUiProvider { @Override public Control createUiPart(Composite parent, Content context) { OLMap map = new OLMap(parent, 0); + // map.setCenter(13.404954, 52.520008); // Berlin + map.setCenter(-74.00597, 40.71427); // NYC + map.setZoom(6); return map; } diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/OLMap.java b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/OLMap.java index bd2a15d..d045afd 100644 --- a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/OLMap.java +++ b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/openlayers/OLMap.java @@ -1,78 +1,96 @@ package org.argeo.app.geo.swt.openlayers; +import java.util.concurrent.CompletableFuture; + import org.argeo.app.geo.ux.MapPart; import org.argeo.cms.swt.CmsSwtUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.ProgressEvent; +import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; public class OLMap extends Composite implements MapPart { static final long serialVersionUID = 2713128477504858552L; - private Label div; + private Browser browser; + + // private CompletableFuture renderCompleted = new + // CompletableFuture<>(); + private CompletableFuture pageLoaded = new CompletableFuture<>(); + + private String mapVar = "window.argeoMap"; public OLMap(Composite parent, int style) { super(parent, style); parent.setLayout(CmsSwtUtils.noSpaceGridLayout()); setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); setLayout(CmsSwtUtils.noSpaceGridLayout()); -// div = new Label(this, SWT.NONE); -// CmsSwtUtils.markup(div); -// CmsSwtUtils.disableMarkupValidation(div); -// div.setText(html); -// div.setLayoutData(CmsSwtUtils.fillAll()); - String html = """ - - - - - Simple Map - - - - -
- - - - """; - Browser browser = new Browser(this, SWT.BORDER); + browser = new Browser(this, SWT.BORDER); browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - //browser.setText(html); + // functions exposed to JavaScript +// new onRenderComplete(); browser.setUrl("/pkg/org.argeo.app.geo.js/index.html"); - + browser.addProgressListener(new ProgressListener() { + static final long serialVersionUID = 1L; + + @Override + public void completed(ProgressEvent event) { + + // create map + browser.execute(mapVar + " = Object.create(window.argeo.app.geo.ArgeoMap);"); + pageLoaded.complete(true); + } + + @Override + public void changed(ProgressEvent event) { + } + }); } @Override public void addPoint(Double lng, Double lat) { // TODO Auto-generated method stub - + } @Override public void addUrlLayer(String layer, Format format) { // TODO Auto-generated method stub - + } @Override public void setZoom(int zoom) { - // TODO Auto-generated method stub - + pageLoaded.thenAccept((b) -> { + browser.evaluate(mapVar + ".setZoom(" + zoom + ")"); + }); } @Override public void setCenter(Double lng, Double lat) { - // TODO Auto-generated method stub - + pageLoaded.thenAccept((b) -> { + browser.evaluate(mapVar + ".setCenter(" + lng + ", " + lat + ")"); + }); + } - - +// private void setRenderCompleted() { +// renderCompleted.complete(true); +// } +// +// private class onRenderComplete extends BrowserFunction { +// +// onRenderComplete() { +// super(browser, onRenderComplete.class.getSimpleName()); +// } +// +// @Override +// public Object function(Object[] arguments) { +// setRenderCompleted(); +// System.out.println("Render complete (Java)"); +// return null; +// } +// +// } }