Allow reverse search, where you find the farthest start point from a given end point
This commit is contained in:
+4
-2
@@ -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
@@ -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)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user