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]); const viaMarkers = new Array(); startMarker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);}); finishMarker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);}); 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 featbtn = document.getElementById("btn-feat"); featbtn.onclick = function () { contextmenu.remove(); const features = map.queryRenderedFeatures(e.point); const prop = features.map(function (feat) { return feat["properties"]; }); const featPopup = new maplibregl.Popup() .setLngLat(coordinates) .setHTML(JSON.stringify(prop)) .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(), viaMarkers); } }; 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, viaMarkers); } }; let viabtn = document.getElementById("btn-via"); viabtn.onclick = function () { contextmenu.remove(); const marker = new maplibregl.Marker({color: "#0000FF", draggable: true}).setLngLat([coordinates.lng, coordinates.lat]); marker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);}); marker.addTo(map); marker.onMap = true; viaMarkers.push(marker); if (startMarker.onMap && finishMarker.onMap) { lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers); } }; }); }; 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) { for (let marker of vias) { const lnglat = marker.getLngLat() data.points.push([lnglat["lng"], lnglat["lat"]]); } } 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" }); }; };