Allow reverse search, where you find the farthest start point from a given end point

This commit is contained in:
Martin Asprusten
2025-07-05 17:06:52 +02:00
parent 2ca8a14d8f
commit dc2e8170a4
6 changed files with 170 additions and 90 deletions
+4 -2
View File
@@ -45,7 +45,8 @@ interface FindPathsFromNode {
allowMotorways: boolean,
allowTunnels: boolean,
allowAgainstOneway: boolean,
limitCornerSpeed: boolean
limitCornerSpeed: boolean,
reverse: boolean
}
export interface Endpoint {
@@ -57,7 +58,8 @@ export interface Endpoint {
interface FoundPathsFromNode {
nodeId: number,
endpoints: Endpoint[]
endpoints: Endpoint[],
reverse: boolean
}
interface GetFullPath {
+14 -9
View File
@@ -17,7 +17,8 @@ interface Settings {
allowTunnels: boolean,
allowAgainstOneway: boolean,
limitCornerSpeed: boolean,
cutoffDistance: number
cutoffDistance: number,
reverse: boolean
}
// Default settings values
@@ -47,6 +48,7 @@ let loadingContainer = document.getElementById('loadingcontainer');
let mapContainer = document.getElementById('mapcontainer');
let searchButton = document.getElementById('search-button');
let exportButton = document.getElementById('export-route-button');
let reverseCheckbox = document.getElementById('reverse-search-input');
let searchStatusParagraph = document.getElementById('search-status-paragraph');
let searchResultsTable = document.getElementById('search-result-table');
let searchResultTableBody = document.getElementById('search-result-table-body');
@@ -72,8 +74,8 @@ routeWorker.onmessage = e => {
}
else if (message.foundClosestNode != null) {
mapHandler?.drawStartNode(message.foundClosestNode.foundNodeId, message.foundClosestNode.foundLatitude, message.foundClosestNode.foundLongitude);
let settings = getSettings();
mapHandler?.drawStartNode(message.foundClosestNode.foundNodeId, message.foundClosestNode.foundLatitude, message.foundClosestNode.foundLongitude, settings.reverse);
let findPathsMessage: Message = {findPathsFromNode: {
nodeId: message.foundClosestNode.foundNodeId,
minimumSpeed: settings.minimumSpeed,
@@ -83,11 +85,12 @@ routeWorker.onmessage = e => {
allowMotorways: settings.allowMotorways,
allowTunnels: settings.allowTunnels,
allowAgainstOneway: settings.allowAgainstOneway,
limitCornerSpeed: settings.limitCornerSpeed
limitCornerSpeed: settings.limitCornerSpeed,
reverse: settings.reverse
}};
routeWorker.postMessage(findPathsMessage);
} else if (message.foundPathsFromNode != null) {
mapHandler?.drawEndPoints(message.foundPathsFromNode.endpoints);
mapHandler?.drawEndPoints(message.foundPathsFromNode.endpoints, message.foundPathsFromNode.reverse);
} else if (message.returnFullPath != null) {
let settings = getSettings();
mapHandler?.drawPath(message.returnFullPath.pathSegments, settings.minimumSpeed, settings.maximumSpeed);
@@ -130,8 +133,7 @@ routeWorker.onmessage = e => {
button.setHTMLUnsafe('Show in map');
button.addEventListener('click', _ => {
mapHandler?.drawStartNode(result.nodeId, result.latitude, result.longitude);
let settings = getSettings();
mapHandler?.drawStartNode(result.nodeId, result.latitude, result.longitude, false);
let requestMessage: Message = {
findPathsFromNode: {
nodeId: result.nodeId,
@@ -142,7 +144,8 @@ routeWorker.onmessage = e => {
allowMotorways: settings.allowMotorways,
allowTunnels: settings.allowTunnels,
allowAgainstOneway: settings.allowAgainstOneway,
limitCornerSpeed: settings.limitCornerSpeed
limitCornerSpeed: settings.limitCornerSpeed,
reverse: false
}
};
routeWorker.postMessage(requestMessage);
@@ -195,7 +198,8 @@ function setUpMapHandler() {
allowMotorways: settings.allowMotorways,
allowTunnels: settings.allowTunnels,
allowAgainstOneway: settings.allowAgainstOneway,
limitCornerSpeed: settings.limitCornerSpeed
limitCornerSpeed: settings.limitCornerSpeed,
reverse: settings.reverse
}};
routeWorker.postMessage(newRoutesMessage);
}
@@ -325,7 +329,8 @@ function getSettings(): Settings {
allowTunnels: getBooleanValue(allowTunnelsInput, DEFAULT_ALLOW_TUNNELS),
allowAgainstOneway: getBooleanValue(allowAgainstOnewayInput, DEFAULT_ALLOW_AGAINST_ONE_WAY),
limitCornerSpeed: getBooleanValue(limitCornerSpeedInput, DEFAULT_LIMIT_CORNER_SPEED),
cutoffDistance: getNumberValue(cutoffDistanceInput, DEFAULT_CUTOFF_DISTANCE)
cutoffDistance: getNumberValue(cutoffDistanceInput, DEFAULT_CUTOFF_DISTANCE),
reverse: getBooleanValue(reverseCheckbox, false)
};
}
+21 -5
View File
@@ -250,28 +250,44 @@ class MapHandler {
this.searchAreaPolygonListeners.push(searchAreaListener);
}
public drawStartNode(nodeId: number, latitude: number, longitude: number): void {
public drawStartNode(nodeId: number, latitude: number, longitude: number, reverse: boolean): void {
this.path.clearLayers();
if (this.startMarker != null) {
this.map.removeLayer(this.startMarker);
}
var settings;
if (reverse) {
settings = {icon: redIcon};
} else {
settings = {icon: greenIcon};
}
this.currentStartPoint = nodeId;
this.endMarkers.clearLayers();
this.startMarker = L.marker([latitude, longitude], {icon: greenIcon}).addTo(this.map);
this.startMarker = L.marker([latitude, longitude], settings).addTo(this.map);
}
public drawEndPoints(endpoints: Endpoint[]): void {
public drawEndPoints(endpoints: Endpoint[], reverse: boolean): void {
this.endMarkers.clearLayers();
this.path.clearLayers();
var firstMarker = true;
var color = reverse ? 'orange' : 'violet';
var settings: L.MarkerOptions;
if (reverse) {
settings = {icon: greenIcon};
} else {
settings = {icon: redIcon};
}
endpoints.forEach(endpoint => {
var marker;
if (firstMarker) {
marker = L.marker([endpoint.latitude, endpoint.longitude], {icon: redIcon}).addTo(this.endMarkers);
marker = L.marker([endpoint.latitude, endpoint.longitude], settings).addTo(this.endMarkers);
} else {
marker = L.circleMarker([endpoint.latitude, endpoint.longitude], {radius: 2, fillOpacity: 1.0, color: 'purple', bubblingMouseEvents: false}).addTo(this.endMarkers);
marker = L.circleMarker([endpoint.latitude, endpoint.longitude], {radius: 2, fillOpacity: 1.0, color: color, bubblingMouseEvents: false}).addTo(this.endMarkers);
}
marker.bindTooltip(Math.round(endpoint.distanceFromStart) + 'm');
+4 -2
View File
@@ -103,7 +103,8 @@ onmessage = async (e) => {
message.findPathsFromNode.allowMotorways,
message.findPathsFromNode.allowTunnels,
message.findPathsFromNode.allowAgainstOneway,
message.findPathsFromNode.limitCornerSpeed
message.findPathsFromNode.limitCornerSpeed,
message.findPathsFromNode.reverse
);
let endpoints: Endpoint[] = [];
@@ -122,9 +123,10 @@ onmessage = async (e) => {
distanceFromStart: nodeData.distanceFromStart
});
}
let reverse: boolean = results.reverse;
results.delete();
let returnMessage: Message = {foundPathsFromNode: {nodeId: message.findPathsFromNode.nodeId, endpoints: endpoints}};
let returnMessage: Message = {foundPathsFromNode: {nodeId: message.findPathsFromNode.nodeId, endpoints: endpoints, reverse: reverse}};
postMessage(returnMessage);
}