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"
+ });
};
};