From 54fd1e470467a39839759850546c691a732bfc6c Mon Sep 17 00:00:00 2001 From: don philipe Date: Sun, 4 Aug 2024 20:26:32 +0200 Subject: [PATCH] Simple routing with GH --- .gitignore | 1 + pom.xml | 23 ++-- src/main/java/de/spacedon/ConfigServlet.java | 43 ++++++ src/main/java/de/spacedon/MyServlet.java | 18 --- src/main/java/de/spacedon/PilgrimServer.java | 4 +- .../de/spacedon/pilgrim-example.properties | 1 + src/main/webapp/index.html | 51 +------ src/main/webapp/lib.js | 127 +++++++++++++++++- 8 files changed, 188 insertions(+), 80 deletions(-) create mode 100644 src/main/java/de/spacedon/ConfigServlet.java delete mode 100644 src/main/java/de/spacedon/MyServlet.java create mode 100644 src/main/resources/de/spacedon/pilgrim-example.properties diff --git a/.gitignore b/.gitignore index 2f7896d..2923b60 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ target/ +pilgrim.properties diff --git a/pom.xml b/pom.xml index f5228e2..72104db 100644 --- a/pom.xml +++ b/pom.xml @@ -17,19 +17,24 @@ - org.eclipse.jetty - jetty-server - 11.0.3 + org.eclipse.jetty + jetty-server + 11.0.3 - org.eclipse.jetty - jetty-servlet - 11.0.3 + org.eclipse.jetty + jetty-servlet + 11.0.3 - org.eclipse.jetty - apache-jsp - 11.0.3 + org.eclipse.jetty + apache-jsp + 11.0.3 + + + org.json + json + 20240303 diff --git a/src/main/java/de/spacedon/ConfigServlet.java b/src/main/java/de/spacedon/ConfigServlet.java new file mode 100644 index 0000000..07000c8 --- /dev/null +++ b/src/main/java/de/spacedon/ConfigServlet.java @@ -0,0 +1,43 @@ +package de.spacedon; + +import java.io.InputStream; +import java.io.IOException; +import java.util.Properties; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.json.JSONObject; + +public class ConfigServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("application/json"); + response.setStatus(HttpServletResponse.SC_OK); + Properties conf = getConfig("de/spacedon/pilgrim.properties"); + JSONObject jo = new JSONObject(); + jo.put("ghbase", conf.getProperty("ghbase")); + response.getWriter().println(jo); + } + + /** + * Try to load properties file from given path and return it. + * IOExceptions will be caught (e.g. when the file doesn't exist). + * @param path Path to properties file + * @return properties from given path + */ + protected static Properties getConfig(String path) { + Properties config = new Properties(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + try (InputStream resourceStream = loader.getResourceAsStream(path)) { + config.load(resourceStream); + } catch (IOException ex) { + ex.printStackTrace(); + } + + return config; + } +} diff --git a/src/main/java/de/spacedon/MyServlet.java b/src/main/java/de/spacedon/MyServlet.java deleted file mode 100644 index 1221aa6..0000000 --- a/src/main/java/de/spacedon/MyServlet.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.spacedon; - -import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -public class MyServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setContentType("application/json"); - response.setStatus(HttpServletResponse.SC_OK); - response.getWriter().println("{\"status\":\"ok\"}"); - } -} diff --git a/src/main/java/de/spacedon/PilgrimServer.java b/src/main/java/de/spacedon/PilgrimServer.java index 4efa859..40beb30 100644 --- a/src/main/java/de/spacedon/PilgrimServer.java +++ b/src/main/java/de/spacedon/PilgrimServer.java @@ -20,8 +20,8 @@ public class PilgrimServer { contextHandler.setContextPath("/"); server.setHandler(contextHandler); - // register custom Servlet at endpoint /index - contextHandler.addServlet(new ServletHolder(new MyServlet()), "/index"); + // register custom Servlet at endpoint /config + contextHandler.addServlet(new ServletHolder(new ConfigServlet()), "/config"); // register index.html ServletHolder staticHolder = new ServletHolder(new DefaultServlet()); diff --git a/src/main/resources/de/spacedon/pilgrim-example.properties b/src/main/resources/de/spacedon/pilgrim-example.properties new file mode 100644 index 0000000..c49122b --- /dev/null +++ b/src/main/resources/de/spacedon/pilgrim-example.properties @@ -0,0 +1 @@ +ghbase=http:// diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 8293dd0..3d120db 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -2,9 +2,10 @@ - Display a map + Pilgrim - + + -
-
- +

         
 
 
diff --git a/src/main/webapp/lib.js b/src/main/webapp/lib.js
index 2814ae5..76ff08e 100644
--- a/src/main/webapp/lib.js
+++ b/src/main/webapp/lib.js
@@ -1,7 +1,124 @@
-let lib = new function () {
-    this.setStartMarker = function (coordinates) {
-    }
-    this.setMarker = function (marker, lng, lat, map) {
-        marker.setLngLat([lng, lat]).addTo(map);
+const lib = new function () {
+
+    let ghbase = ""
+
+    /**
+     * Initialize Map etc
+     */
+    this.init = function () {
+        $.get("/config", function(result) { ghbase = result["ghbase"]; });
+
+		const map = new maplibregl.Map({ container: 'map',
+			style: 'spacedon.json',
+			center: [13, 51],
+			zoom: 6
+		}); 
+		map.addControl(new maplibregl.NavigationControl());
+
+        const startMarker = new maplibregl.Marker({color: "#00FF00", draggable: true}).setLngLat([0, 0]);
+        const finishMarker = new maplibregl.Marker({color: "#FF0000", draggable: true}).setLngLat([0, 0]);
+        startMarker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat());});
+        finishMarker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat());});
+		const viaMarkers = new Array();
+
+		map.on('mousemove', function (e) {
+			var features = map.queryRenderedFeatures(e.point);
+			// Limit the number of properties we're displaying for
+			// legibility and performance
+			var displayProperties = [ 'type', 'properties', 'id', 'layer', 'source', 'sourceLayer', 'state' ];
+			var displayFeatures = features.map(function (feat) {
+				var displayFeat = {};
+				displayProperties.forEach(function (prop) {
+					displayFeat[prop] = feat[prop];
+				});
+				return displayFeat;
+			});
+			document.getElementById('features').innerHTML = JSON.stringify( displayFeatures, null, 2 );
+		});
+		map.on('click', function (e) {
+			let coordinates = e.lngLat;
+
+			// Ensure that if the map is zoomed out such that multiple
+			// copies of the feature are visible, the popup appears
+			// over the copy being pointed to.
+			while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
+				coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
+			}
+
+			const contextmenu = new maplibregl.Popup()
+				.setLngLat(coordinates)
+				.setHTML('

') + .addTo(map); + + let startbtn = document.getElementById("btn-start"); + startbtn.onclick = function () { + contextmenu.remove(); + startMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map); + startMarker.onMap = true; + if (finishMarker.onMap) { + lib.doRouting(map, coordinates, finishMarker.getLngLat()); + } + }; + let finishbtn = document.getElementById("btn-finish"); + finishbtn.onclick = function () { + contextmenu.remove(); + finishMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map); + finishMarker.onMap = true; + if (startMarker.onMap) { + lib.doRouting(map, startMarker.getLngLat(), coordinates); + } + }; + }); + }; + + this.doRouting = function (map, start, finish, vias = undefined, vehicle = "foot") { + const s = [start.lat, start.lng]; + let data = { + points: [ + [start.lng, start.lat] + ], + profile: vehicle, + points_encoded: false + }; + if (vias != undefined && vias.length > 0) { + + } + data.points.push([finish.lng, finish.lat]) + $.ajax({ + type: "POST", + url: ghbase + "/route", + data: JSON.stringify(data), + contentType: "application/json", + success: function (result) { + if(map.getLayer("route") !== undefined) { + map.removeLayer("route"); + } + if(map.getSource("ghroute") !== undefined) { + map.removeSource("ghroute"); + } + + map.addSource("ghroute", { + "type": "geojson", + "data": { + "type": "Feature", + "geometry": result.paths[0].points + } + }); + map.addLayer({ + "id": "route", + "type": "line", + "source": "ghroute", + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "paint": { + "line-color": "#f00", + "line-width": 9 + } + }); + }, + dataType: "json" + }); }; };