Compare commits

...

2 Commits

Author SHA1 Message Date
don philipe
81b65968c6 Add waypoint mode 2025-05-09 21:07:53 +02:00
don philipe
61d96b30b9 Replace sidebar 2025-05-09 18:26:43 +02:00
2 changed files with 157 additions and 57 deletions

View File

@@ -6,8 +6,8 @@
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"> <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<script src="jquery-3.7.1.min.js"></script> <script src="jquery-3.7.1.min.js"></script>
<script src="lib.js"></script> <script src="lib.js"></script>
<script src="https://unpkg.com/maplibre-gl@3.1.0/dist/maplibre-gl.js"></script> <script src="https://unpkg.com/maplibre-gl@5.5.0/dist/maplibre-gl.js"></script>
<link href="https://unpkg.com/maplibre-gl@3.1.0/dist/maplibre-gl.css" rel="stylesheet"> <link href="https://unpkg.com/maplibre-gl@5.5.0/dist/maplibre-gl.css" rel="stylesheet">
<style> <style>
body { body {
margin: 0; margin: 0;
@@ -19,26 +19,95 @@
bottom: 0; bottom: 0;
width: 100%; width: 100%;
} }
#features {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 20%;
overflow: auto;
background: rgba(255, 255, 255, 0.8);
}
.maplibregl-popup { .maplibregl-popup {
max-width: 200px; max-width: 200px;
font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
} }
.rounded-rect {
background: white;
border-radius: 10px;
box-shadow: 0 0 50px -25px black;
}
.flex-center {
position: absolute;
display: flex;
justify-content: center;
align-items: center;
}
.flex-center.left {
left: 0px;
}
.sidebar-content {
position: absolute;
width: 95%;
height: 95%;
font-family: Arial, Helvetica, sans-serif;
color: gray;
flex-direction: column;
}
.sidebar-toggle {
position: absolute;
width: 1.3em;
height: 1.3em;
overflow: visible;
display: flex;
justify-content: center;
align-items: center;
font-size: 32px;
}
.sidebar-toggle.left {
right: -1.5em;
}
.sidebar-toggle:hover {
color: #0aa1cf;
cursor: pointer;
}
.sidebar {
transition: transform 1s;
z-index: 1;
width: 300px;
height: 100%;
}
#features {
max-height: 50%;
}
/*
The sidebar styling has them "expanded" by default, we use CSS transforms to push them offscreen
The toggleSidebar() function removes this class from the element in order to expand it.
*/
.left.collapsed {
transform: translateX(-295px);
}
</style> </style>
</head> </head>
<body> <body>
<div id="map"></div> <div id="map">
<pre id="features"></pre> <div id="sidebarLeft" class="sidebar flex-center left">
<div class="sidebar-content rounded-rect flex-center">
<div>
<input type="radio" name="planningMode" id="classicPlanning">classic</input>
<input type="radio" name="planningMode" id="modernPlanning">modern</input>
</div>
<h2>Features</h2>
<div id="features"></div>
<div class="sidebar-toggle rounded-rect left"
onclick="toggleSidebar('left')"
>
&rarr;
</div>
</div>
</div>
</div>
<script> <script>
lib.init(); lib.init();
</script> </script>
</body> </body>
</html> </html>

View File

@@ -1,6 +1,11 @@
const lib = new function () { const lib = new function () {
let ghbase = "" let ghbase = ""
let planningMode = "modern";
const modeContext = {
"classic": '<button id="btn-feat">feature</button></br><button id="btn-start">start</button></br><button id="btn-via">via</button></br><button id="btn-finish">finish</button>',
"modern": '<button id="btn-feat">feature</button></br><button id="btn-waypoint">waypoint</button>'
};
/** /**
* Initialize Map etc * Initialize Map etc
@@ -47,51 +52,74 @@ const lib = new function () {
const contextmenu = new maplibregl.Popup() const contextmenu = new maplibregl.Popup()
.setLngLat(coordinates) .setLngLat(coordinates)
.setHTML('<button id="btn-feat">feature</button></br><button id="btn-start">start</button></br><button id="btn-via">via</button></br><button id="btn-finish">finish</button>') .setHTML(modeContext[planningMode])
.addTo(map); .addTo(map);
let featbtn = document.getElementById("btn-feat"); if (planningMode === 'classic') {
featbtn.onclick = function () { let featbtn = document.getElementById("btn-feat");
contextmenu.remove(); featbtn.onclick = function () {
const features = map.queryRenderedFeatures(e.point); contextmenu.remove();
const prop = features.map(function (feat) { const features = map.queryRenderedFeatures(e.point);
return feat["properties"]; const prop = features.map(function (feat) {
}); return feat["properties"];
const featPopup = new maplibregl.Popup() });
.setLngLat(coordinates) const featPopup = new maplibregl.Popup()
.setHTML(JSON.stringify(prop)) .setLngLat(coordinates)
.addTo(map); .setHTML(JSON.stringify(prop))
}; .addTo(map);
let startbtn = document.getElementById("btn-start"); };
startbtn.onclick = function () { let startbtn = document.getElementById("btn-start");
contextmenu.remove(); startbtn.onclick = function () {
startMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map); contextmenu.remove();
startMarker.onMap = true; startMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map);
if (finishMarker.onMap) { startMarker.onMap = true;
lib.doRouting(map, coordinates, finishMarker.getLngLat(), viaMarkers); if (finishMarker.onMap) {
} lib.doRouting(map, coordinates, finishMarker.getLngLat(), viaMarkers);
}; }
let finishbtn = document.getElementById("btn-finish"); };
finishbtn.onclick = function () { let finishbtn = document.getElementById("btn-finish");
contextmenu.remove(); finishbtn.onclick = function () {
finishMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map); contextmenu.remove();
finishMarker.onMap = true; finishMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map);
if (startMarker.onMap) { finishMarker.onMap = true;
lib.doRouting(map, startMarker.getLngLat(), coordinates, viaMarkers); if (startMarker.onMap) {
} lib.doRouting(map, startMarker.getLngLat(), coordinates, viaMarkers);
}; }
let viabtn = document.getElementById("btn-via"); };
viabtn.onclick = function () { let viabtn = document.getElementById("btn-via");
contextmenu.remove(); viabtn.onclick = function () {
const marker = new maplibregl.Marker({color: "#0000FF", draggable: true}).setLngLat([coordinates.lng, coordinates.lat]); contextmenu.remove();
marker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);}); const marker = new maplibregl.Marker({color: "#0000FF", draggable: true}).setLngLat([coordinates.lng, coordinates.lat]);
marker.addTo(map); marker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);});
marker.onMap = true; marker.addTo(map);
viaMarkers.push(marker); marker.onMap = true;
if (startMarker.onMap && finishMarker.onMap) { viaMarkers.push(marker);
lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers); if (startMarker.onMap && finishMarker.onMap) {
} lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);
}; }
};
} else if (planningMode === 'modern') {
let waypointbtn = document.getElementById("btn-waypoint");
waypointbtn.onclick = function () {
contextmenu.remove();
if (!startMarker.onMap) {
startMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map);
startMarker.onMap = true;
} else if (!finishMarker.onMap) {
finishMarker.setLngLat([coordinates.lng, coordinates.lat]).addTo(map);
finishMarker.onMap = true;
lib.doRouting(map, startMarker.getLngLat(), coordinates);
} else {
const oldFinishMarker = new maplibregl.Marker({color: "#0000FF", draggable: true}).setLngLat(finishMarker.getLngLat());
finishMarker.setLngLat([coordinates.lng, coordinates.lat]);
oldFinishMarker.on("dragend", function() {lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);});
oldFinishMarker.addTo(map);
oldFinishMarker.onMap = true;
viaMarkers.push(oldFinishMarker);
lib.doRouting(map, startMarker.getLngLat(), finishMarker.getLngLat(), viaMarkers);
}
}
};
}); });
}; };
@@ -148,4 +176,7 @@ const lib = new function () {
dataType: "json" dataType: "json"
}); });
}; };
this.togglePlanningMode = function () {
};
}; };