Calculating driving distance between places
Calculating driving distance between places using OSRM
by Alexander Farber
HTML
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1/dist/leaflet.min.css">
<script src="https://cdn.jsdelivr.net/npm/leaflet@1/dist/leaflet-src.min.js"></script>
<div class="ui-widget ui-front" id="myWidget">
<label>Enter destination: <input id="myInput"></label>
<div id="myHint">Type in at least 5 letters!</div>
</div>
<div id="myMap"></div>
CSS
html,
body {
padding: 0;
margin: 0;
}
#myMap {
position: absolute;
top: 4em;
left: 0;
bottom: 0;
right: 0;
z-index: 1;
}
#myWidget {
position: absolute;
z-index: 2;
}
JavaScript
'use strict';
function processOsrmReply(data) {
console.log(data);
if (data.code !== 'Ok') {
$('#myHint').text('OSRM error code: ' + data.code);
return;
}
$('#myHint').text('Distance: ' + data.distances);
}
function sendOsrmRequest(startLat, startLng, endLat, endLng) {
var osrmUrl = 'https://router.project-osrm.org/table/v1/driving/' +
parseFloat(startLng).toFixed(6) + ',' + parseFloat(startLat).toFixed(6) + ';' +
parseFloat(endLng).toFixed(6) + ',' + parseFloat(endLat).toFixed(6);
var osrmParams = {
sources: 0,
destinations: 1,
annotations: 'distance'
};
$('#myHint').text('Calculating driving distance between places...');
$.get(osrmUrl, osrmParams, processOsrmReply);
}
var startPosition = [51.4661, 7.2491];
var myMap = L.map('myMap').setView(startPosition, 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(myMap);
var startMarker = L.marker(startPosition)
.bindPopup('Start: ' + startPosition)
.addTo(myMap);
$('#myInput').autocomplete({
source: function(request, response) {
var nominatimUrl = 'https://nominatim.openstreetmap.org/search/';
var nominatimParams = {
q: request.term,
format: 'json',
addressdetails: 1,
limit: 2,
polygon_geojson: 1
};
$.get(nominatimUrl, nominatimParams, function(data) {
console.log(data);
if (data.length === 0) {
$('#myHint').text('Nominatim returned nothing');
return;
}
var autocompleteParams = data.map(n => {
return {
label: n.display_name,
value: [n.lat, n.lon]
}
});
response(autocompleteParams);
});
},
minLength: 5,
select: function(event, ui) {
var finalPosition = ui.item.value;
var finalMarker = L.marker(finalPosition)
.bindPopup('Destination: ' + finalPosition)
...