Implement current map display features.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 30 Aug 2023 09:56:38 +0000 (11:56 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 30 Aug 2023 09:56:38 +0000 (11:56 +0200)
org.argeo.app.geo.js/src/org.argeo.app.geo.js/MapPart.js
org.argeo.app.geo.js/src/org.argeo.app.geo.js/OpenLayerTileSources.js [new file with mode: 0644]
org.argeo.app.geo.js/src/org.argeo.app.geo.js/OpenLayersMapPart.js
org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java
swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java
swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/SwtMapPart.java

index 1a3dd2eb8818ed2672fe0cff91b285b887ca38f0..ef19f58143143de9cf0ea5d25a50ccf0a7173df5 100644 (file)
@@ -14,4 +14,13 @@ export default class MapPart {
        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");
+       }
 }
diff --git a/org.argeo.app.geo.js/src/org.argeo.app.geo.js/OpenLayerTileSources.js b/org.argeo.app.geo.js/src/org.argeo.app.geo.js/OpenLayerTileSources.js
new file mode 100644 (file)
index 0000000..3425384
--- /dev/null
@@ -0,0 +1,54 @@
+
+import WMTS from 'ol/source/WMTS.js';
+import WMTSTileGrid from 'ol/tilegrid/WMTS';
+import { getTopLeft } from 'ol/extent';
+import { getWidth } from 'ol/extent';
+import { get as getProjection } from 'ol/proj';
+
+export class SentinelCloudless extends WMTS {
+       static source_s2CL2019;
+       static EPSG4326 = getProjection('EPSG:4326');
+
+       static resolutions;
+       static matrixIds;
+
+       static {
+               let min_zoom = 6;
+               let max_zoom = 17;
+               let zoomOffset = 1;
+
+               // from https://s2maps.eu/
+               let size = getWidth(this.EPSG4326.getExtent()) / 512;
+               this.resolutions = new Array(max_zoom + zoomOffset);
+               this.matrixIds = new Array(max_zoom + zoomOffset);
+               for (let z = min_zoom; z <= max_zoom; ++z) {
+                       // generate resolutions and matrixIds arrays for this WMTS
+                       this.resolutions[z] = size / Math.pow(2, z);
+                       this.matrixIds[z] = z;
+               }
+       }
+       
+       constructor() {
+               super({
+                       urls: [
+                               "//a.s2maps-tiles.eu/wmts/",
+                               "//b.s2maps-tiles.eu/wmts/",
+                               "//c.s2maps-tiles.eu/wmts/",
+                               "//d.s2maps-tiles.eu/wmts/",
+                               "//e.s2maps-tiles.eu/wmts/"
+                       ],
+                       layer: 's2cloudless-2021',
+                       matrixSet: 'WGS84',
+                       format: 'image/jpeg',
+                       projection: SentinelCloudless.EPSG4326,
+                       tileGrid: new WMTSTileGrid({
+                               origin: getTopLeft(SentinelCloudless.EPSG4326.getExtent()),
+                               resolutions: SentinelCloudless.resolutions,
+                               matrixIds: SentinelCloudless.matrixIds,
+                       }),
+                       style: 'default',
+                       transition: 0,
+                       wrapX: true
+               });
+       }
+}
\ No newline at end of file
index 6284296f87492760383f0f614f5cb5b6afde7135..7c157eb19226a1716545aa4e11f09232060292fb 100644 (file)
@@ -5,10 +5,16 @@
 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 { fromLonLat } from 'ol/proj.js';
+import VectorSource from 'ol/source/Vector.js';
+import Feature from 'ol/Feature.js';
+import { Point } from 'ol/geom.js';
+import VectorLayer from 'ol/layer/Vector.js';
+import GeoJSON from 'ol/format/GeoJSON.js';
+import GPX from 'ol/format/GPX.js';
 
 import MapPart from './MapPart.js';
+import { SentinelCloudless } from './OpenLayerTileSources.js';
 
 /** OpenLayers implementation of MapPart. */
 export default class OpenLayersMapPart extends MapPart {
@@ -19,8 +25,13 @@ export default class OpenLayersMapPart extends MapPart {
                super();
                this.#map = new Map({
                        layers: [
+                               new TileLayer({
+                                       source: new SentinelCloudless(),
+                               }),
                                new TileLayer({
                                        source: new OSM(),
+                                       opacity: 0.4,
+                                       transition: 0,
                                }),
                        ],
                        target: 'map',
@@ -34,4 +45,26 @@ export default class OpenLayersMapPart extends MapPart {
        setCenter(lng, lat) {
                this.#map.getView().setCenter(fromLonLat([lng, lat]));
        }
+
+       addPoint(lng, lat, style) {
+               let vectorSource = new VectorSource({
+                       features: [new Feature({
+                               geometry: new Point(fromLonLat([lng, lat]))
+                       })]
+               });
+               this.#map.addLayer(new VectorLayer({ source: vectorSource }));
+       }
+
+       addUrlLayer(url, format) {
+               let vectorSource;
+               if (format === 'GEOJSON') {
+                       vectorSource = new VectorSource({ url: url, format: new GeoJSON() })
+               }
+               else if (format === 'GPX') {
+                       vectorSource = new VectorSource({ url: url, format: new GPX() })
+               }
+               this.#map.addLayer(new VectorLayer({
+                       source: vectorSource,
+               }));
+       }
 }
index d9536a339b81e47d45bb0060af1f5552b8293489..29678ab5eff00d44c7778e44b487bd548235eab7 100644 (file)
@@ -6,9 +6,9 @@ public interface MapPart {
                GEOJSON, GPX;
        }
 
-       void addPoint(Double lng, Double lat);
+       void addPoint(Double lng, Double lat, String style);
 
-       void addUrlLayer(String layer, Format format);
+       void addUrlLayer(String url, Format format);
 
        void setZoom(int zoom);
 
index 13966862103254c14a10ecb78e902c285b01d87a..80f875204e6c75e7a10bfded4ad21e8e6a1a4cf7 100644 (file)
@@ -11,9 +11,12 @@ public class MapUiProvider implements SwtUiProvider {
        @Override
        public Control createUiPart(Composite parent, Content context) {
                SwtMapPart map = new SwtMapPart(parent, 0);
-               // map.setCenter(13.404954, 52.520008); // Berlin
-               map.setCenter(-74.00597, 40.71427); // NYC
+               map.setCenter(13.404954, 52.520008); // Berlin
+//             map.setCenter(-74.00597, 40.71427); // NYC
+//             map.addPoint(-74.00597, 40.71427, null);
                map.setZoom(6);
+               // map.addUrlLayer("https://openlayers.org/en/v4.6.5/examples/data/geojson/countries.geojson",
+               // Format.GEOJSON);
                return map;
        }
 
index f063e5a7cc66a27def0735b197ccba1f7fc0dc4e..003b6b5d875a3e2afa5465973e39428c3c91ad2f 100644 (file)
@@ -53,15 +53,18 @@ public class SwtMapPart extends Composite implements MapPart {
        }
 
        @Override
-       public void addPoint(Double lng, Double lat) {
-               // TODO Auto-generated method stub
-
+       public void addPoint(Double lng, Double lat, String style) {
+               pageLoaded.thenAccept((b) -> {
+                       browser.evaluate(
+                                       mapVar + ".addPoint(" + lng + ", " + lat + "," + (style == null ? "'default'" : style) + ")");
+               });
        }
 
        @Override
-       public void addUrlLayer(String layer, Format format) {
-               // TODO Auto-generated method stub
-
+       public void addUrlLayer(String url, Format format) {
+               pageLoaded.thenAccept((b) -> {
+                       browser.evaluate(mapVar + ".addUrlLayer('" + url + "','" + format.name() + "')");
+               });
        }
 
        @Override