Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fb995ad0b0 | |||
| 3a85661e45 | |||
| 23ca80030e | |||
| f08c389faa | |||
| 47369a0036 | |||
| 253b591a87 | |||
| 5c4488d350 | |||
| 25310ff1bd | |||
| c2d52080d3 | |||
| bf681855ed | |||
| 899d216b9b | |||
| 73aeab3a57 | |||
| 61073ebc9d | |||
| 393334cabd | |||
| 01e4afe2f0 | |||
| 9b599c90f8 | |||
| 252c234221 | |||
| 888a5d04c8 | |||
| b1631eff77 | |||
| ffd5e2de99 | |||
| ea207cef6e | |||
| 893c09f6fc | |||
| 213bb71b35 | |||
| 0fd8d4d8cf | |||
| 13f0a3fb6b | |||
| 3141d3ba48 | |||
| 4ff4fcf516 | |||
| f273f0cfc5 | |||
| dc192d47a8 | |||
| 0f032f7635 | |||
| 060c7e499a | |||
| 28a241c371 | |||
| bab2887f8f | |||
| abba49a44e | |||
| 4638e7c24d | |||
| fe420e5bfc | |||
| 93ae928236 | |||
| 3b485f1426 | |||
| 5165e01a5c | |||
| 7b4e923ec4 | |||
| 007dd19cec | |||
| fd3cf02af4 | |||
| 2bb51717b9 | |||
| 4fe6346146 | |||
| c5bd2b0b1d | |||
| 71426cf760 | |||
| 0ab287e707 | |||
| 49cc0bfb09 | |||
| e132ac5c53 | |||
| 1a9776cff9 | |||
| 342a0d22bd | |||
| 251a43980a | |||
| 41ba8b5e3e | |||
| 30df2aae10 | |||
| a6f00b1856 | |||
| af26c47052 | |||
| 0a774aeef2 | |||
| a89aa68686 | |||
| 4b93107415 | |||
| e0602934b2 | |||
| fdace26222 | |||
| bef41ed667 |
@@ -0,0 +1,55 @@
|
||||
Overview
|
||||
--------
|
||||
The repository provides a Leaflet [(1)] based web frontend to the Open Source Routing Machine (Project-OSRM [(2)]).
|
||||
The frontend is implemented in Javascript.
|
||||
Data is fetched from routing and geocoding servers using JSONP queries.
|
||||
The website is XHTML 1.0 Strict compliant.
|
||||
A deployed version of the the web frontend can be seen at [(3)].
|
||||
|
||||
|
||||
Setup
|
||||
-----
|
||||
The frontend should work directly as provided.
|
||||
Several settings - including the URL for the routing server and the geocoder server - can be specified in `OSRM.config.js`.
|
||||
Different tile servers can be specified in `OSRM.Map.js`.
|
||||
Note that the URL shortener used for generating route links only works with URLs pointing to the official Project-OSRM website.
|
||||
|
||||
|
||||
Branches
|
||||
--------
|
||||
* The `master` branch will always point to the latest released version of the frontend.
|
||||
* The `develop` branch should always point to a working version with new features and bugfixes (think of it as a nightly-build).
|
||||
* Other branches contain various work in progress.
|
||||
|
||||
|
||||
Bugtracking
|
||||
-----------
|
||||
Please use the OSRM-Project bug tracker [(4)] for submitting any bug reports or feature requests.
|
||||
|
||||
Integration into Project-OSRM repository
|
||||
----------------------------------------
|
||||
The Project-OSRM repository already contains the frontend repository as a submodule.
|
||||
It will always point to the latest deployed version.
|
||||
To successfully work a repository that contains submodules, use the following git commands (available in git 1.7.1+):
|
||||
|
||||
* `git clone --recursive`
|
||||
to clone a repository and the contained submodules
|
||||
|
||||
* `git pull && git submodule update`
|
||||
to pull the latest version of the repository and update its submodules if required
|
||||
|
||||
Note that the frontend can also be checked out independently of the Project-OSRM repository.
|
||||
|
||||
|
||||
References
|
||||
----------
|
||||
[(1)] Cloudmade Leaflet: http://leaflet.cloudmade.com/
|
||||
[(2)] Project OSRM: http://project-osrm.org/
|
||||
[(3)] Project OSRM Frontend: http://map.project-osrm.org/
|
||||
[(4)] Project OSRM Bugtracker: https://github.com/DennisOSRM/Project-OSRM/issues/
|
||||
|
||||
|
||||
[(1)]: http://leaflet.cloudmade.com/ "Cloudmade Leaflet"
|
||||
[(2)]: http://project-osrm.org/ "Project OSRM"
|
||||
[(3)]: http://map.project-osrm.org/ "Project-OSRM Frontend"
|
||||
[(4)]: https://github.com/DennisOSRM/Project-OSRM/issues/ "Project-OSRM Bugtracker"
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// Leaflet bugfixes
|
||||
// [assorted bugfixes to Leaflet functions we use]
|
||||
|
||||
|
||||
// return closest point on segment or distance to that point
|
||||
L.LineUtil._sqClosestPointOnSegment = function (p, p1, p2, sqDist) {
|
||||
var x = p1.x,
|
||||
y = p1.y,
|
||||
dx = p2.x - x,
|
||||
dy = p2.y - y,
|
||||
dot = dx * dx + dy * dy,
|
||||
t;
|
||||
|
||||
if (dot > 0) {
|
||||
t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
|
||||
|
||||
if (t > 1) {
|
||||
x = p2.x;
|
||||
y = p2.y;
|
||||
} else if (t > 0) {
|
||||
x += dx * t;
|
||||
y += dy * t;
|
||||
}
|
||||
}
|
||||
|
||||
dx = p.x - x;
|
||||
dy = p.y - y;
|
||||
|
||||
// DS_CHANGE: modified return values
|
||||
if(sqDist)
|
||||
return dx*dx + dy*dy;
|
||||
else {
|
||||
var p = new L.Point(x,y);
|
||||
p._sqDist = dx*dx + dy*dy;
|
||||
return p;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// makes requestAnimFrame respect the immediate paramter -> prevents drag events after dragend events
|
||||
// (alternatively: add if(!this.dragging ) return to L.Draggable._updatePosition, but must be done in leaflet.js!)
|
||||
// [TODO: In Leaflet 0.4 use L.Util.cancelAnimFrame(this._animRequest) in L.Draggable._onUp() instead, also has to be done in leaflet.js!]
|
||||
L.Util.requestAnimFrame = (function () {
|
||||
function timeoutDefer(callback) {
|
||||
window.setTimeout(callback, 1000 / 60);
|
||||
}
|
||||
|
||||
var requestFn = window.requestAnimationFrame ||
|
||||
window.webkitRequestAnimationFrame ||
|
||||
window.mozRequestAnimationFrame ||
|
||||
window.oRequestAnimationFrame ||
|
||||
window.msRequestAnimationFrame ||
|
||||
timeoutDefer;
|
||||
|
||||
return function (callback, context, immediate, contextEl) {
|
||||
callback = context ? L.Util.bind(callback, context) : callback;
|
||||
if (immediate ) { // DS_CHANGE: removed additional condition requestFn === timeoutDefer
|
||||
callback();
|
||||
} else {
|
||||
requestFn(callback, contextEl);
|
||||
}
|
||||
};
|
||||
}());
|
||||
@@ -16,8 +16,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// Leaflet extension: MouseMarker
|
||||
// [marker class that propagates modifier and button presses]
|
||||
// [currently deactivated: propagation mousemove events]
|
||||
// [marker class that propagates modifier and button presses in mouse click events and allows for changing icons]
|
||||
|
||||
|
||||
// extended marker class
|
||||
@@ -25,21 +24,34 @@ L.MouseMarker = L.Marker.extend({
|
||||
initialize: function (latlng, options) {
|
||||
L.Marker.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
// _initInteraction: function (){
|
||||
// L.Marker.prototype._initInteraction.apply(this, arguments);
|
||||
// if (this.options.clickable)
|
||||
// L.DomEvent.addListener(this._icon, 'mousemove', this._fireMouseEvent, this);
|
||||
// },
|
||||
|
||||
// _fireMouseEvent: function (e) {
|
||||
// this.fire(e.type, {
|
||||
// latlng: this._map.mouseEventToLatLng(e),
|
||||
// layerPoint: this._map.mouseEventToLayerPoint(e)
|
||||
// });
|
||||
// L.DomEvent.stopPropagation(e);
|
||||
// },
|
||||
|
||||
switchIcon: function( icon ) {
|
||||
this.options.icon = icon;
|
||||
|
||||
if (this._map) {
|
||||
this._changeIcon();
|
||||
this._reset();
|
||||
}
|
||||
},
|
||||
|
||||
_changeIcon: function () {
|
||||
var options = this.options;
|
||||
|
||||
if (this._icon) {
|
||||
this._icon = options.icon.switchIcon( this._icon );
|
||||
if (this.options.clickable) // TODO: only needed until Leaflet 0.4
|
||||
this._icon.className += ' leaflet-clickable';
|
||||
}
|
||||
|
||||
var panes = this._map._panes;
|
||||
|
||||
if (this._shadow)
|
||||
panes.shadowPane.removeChild(this._shadow);
|
||||
this._shadow = options.icon.createShadow();
|
||||
if (this._shadow)
|
||||
panes.shadowPane.appendChild(this._shadow);
|
||||
},
|
||||
|
||||
_onMouseClick: function (e) {
|
||||
L.DomEvent.stopPropagation(e);
|
||||
if (this.dragging && this.dragging.moved()) { return; }
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// Leaflet extension: SwitchableIcon
|
||||
// [will be an extension of L.Icon in Leaflet 0.4, for now it is a copy with added functionality]
|
||||
|
||||
|
||||
// icon class with functions to simply switch the icon images
|
||||
L.SwitchableIcon = L.Class.extend({
|
||||
options: {
|
||||
/*
|
||||
iconUrl: (String) (required)
|
||||
iconSize: (Point) (can be set through CSS)
|
||||
iconAnchor: (Point) (centered by default if size is specified, can be set in CSS with negative margins)
|
||||
popupAnchor: (Point) (if not specified, popup opens in the anchor point)
|
||||
shadowUrl: (Point) (no shadow by default)
|
||||
shadowSize: (Point)
|
||||
*/
|
||||
className: ''
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
L.Util.setOptions(this, options);
|
||||
},
|
||||
|
||||
createIcon: function () {
|
||||
return this._createIcon('icon');
|
||||
},
|
||||
|
||||
createShadow: function () {
|
||||
return this.options.shadowUrl ? this._createIcon('shadow') : null;
|
||||
},
|
||||
|
||||
_createIcon: function (name) {
|
||||
var img = this._createImg(this.options[name + 'Url']);
|
||||
this._setIconStyles(img, name);
|
||||
return img;
|
||||
},
|
||||
|
||||
_setIconStyles: function (img, name) {
|
||||
var options = this.options,
|
||||
size = options[name + 'Size'],
|
||||
anchor = options.iconAnchor;
|
||||
|
||||
if (!anchor && size) {
|
||||
anchor = size.divideBy(2, true);
|
||||
}
|
||||
|
||||
if (name === 'shadow' && anchor && options.shadowOffset) {
|
||||
anchor._add(options.shadowOffset);
|
||||
}
|
||||
|
||||
img.className = 'leaflet-marker-' + name + ' ' + options.className;
|
||||
|
||||
if (anchor) {
|
||||
img.style.marginLeft = (-anchor.x) + 'px';
|
||||
img.style.marginTop = (-anchor.y) + 'px';
|
||||
}
|
||||
|
||||
if (size) {
|
||||
img.style.width = size.x + 'px';
|
||||
img.style.height = size.y + 'px';
|
||||
}
|
||||
},
|
||||
|
||||
_createImg: function (src) {
|
||||
var el;
|
||||
if (!L.Browser.ie6) {
|
||||
el = document.createElement('img');
|
||||
el.src = src;
|
||||
} else {
|
||||
el = document.createElement('div');
|
||||
el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
|
||||
}
|
||||
return el;
|
||||
},
|
||||
|
||||
// new functions start here
|
||||
switchIcon: function (el) {
|
||||
return this._switchIcon('icon', el);
|
||||
},
|
||||
|
||||
switchShadow: function (el) {
|
||||
return this.options.shadowUrl ? this._switchIcon('shadow', el) : null;
|
||||
},
|
||||
|
||||
_switchIcon: function (name, el) {
|
||||
var img = this._switchImg(this.options[name + 'Url'], el);
|
||||
this._setIconStyles(img, name);
|
||||
return img;
|
||||
},
|
||||
|
||||
_switchImg: function (src, el) {
|
||||
if (!L.Browser.ie6) {
|
||||
el.src = src;
|
||||
} else {
|
||||
el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
|
||||
}
|
||||
return el;
|
||||
}
|
||||
});
|
||||
@@ -15,10 +15,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM browser detection
|
||||
// [simple detection routines to respect some browser peculiarities]
|
||||
// OSRM old browser support
|
||||
// [simple browser detection and routines to support some old browsers]
|
||||
|
||||
|
||||
// browser detection (runs anonymous function to prevent local variables cluttering global namespace)
|
||||
(function() {
|
||||
var useragent = navigator.userAgent;
|
||||
|
||||
@@ -28,4 +29,14 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
};
|
||||
}());
|
||||
|
||||
// (runs anonymous function to prevent local variables cluttering global namespace)
|
||||
|
||||
// compatibility tools for old browsers
|
||||
function getElementsByClassName(node, classname) {
|
||||
var a = [];
|
||||
var re = new RegExp('(^| )'+classname+'( |$)');
|
||||
var els = node.getElementsByTagName("*");
|
||||
for(var i=0,j=els.length; i<j; i++)
|
||||
if(re.test(els[i].className))a.push(els[i]);
|
||||
return a;
|
||||
}
|
||||
document.head = document.head || document.getElementsByTagName('head')[0];
|
||||
@@ -21,50 +21,104 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
|
||||
OSRM.GUI = {
|
||||
|
||||
// show/hide main-gui
|
||||
toggleMain: function() {
|
||||
// show main-gui
|
||||
if( document.getElementById('main-wrapper').style.left == "-410px" ) {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left="420px";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.top="5px";
|
||||
|
||||
document.getElementById('blob-wrapper').style.visibility="hidden";
|
||||
document.getElementById('main-wrapper').style.left="5px";
|
||||
if( OSRM.Browser.FF3!=-1 || OSRM.Browser.IE6_9!=-1 ) {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||
}
|
||||
// hide main-gui
|
||||
} else {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left="30px";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.top="5px";
|
||||
|
||||
document.getElementById('main-wrapper').style.left="-410px";
|
||||
if( OSRM.Browser.FF3!=-1 || OSRM.Browser.IE6_9!=-1 ) {
|
||||
document.getElementById('blob-wrapper').style.visibility="visible";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||
}
|
||||
}
|
||||
// defaults
|
||||
visible: null,
|
||||
width: null,
|
||||
|
||||
// execute after animation
|
||||
// init GUI
|
||||
init: function() {
|
||||
OSRM.GUI.visible = true;
|
||||
OSRM.GUI.width = document.getElementById("main-wrapper").clientWidth;
|
||||
|
||||
// init favicon
|
||||
document.getElementById('favicon').href=OSRM.G.images["favicon"].src;
|
||||
|
||||
// init starting source/target
|
||||
document.getElementById('gui-input-source').value = OSRM.DEFAULTS.ONLOAD_SOURCE;
|
||||
document.getElementById('gui-input-target').value = OSRM.DEFAULTS.ONLOAD_TARGET;
|
||||
|
||||
// init events
|
||||
// [TODO: switch to new event model]
|
||||
document.getElementById("gui-toggle-in").onclick = OSRM.GUI.toggleMain;
|
||||
document.getElementById("gui-toggle-out").onclick = OSRM.GUI.toggleMain;
|
||||
|
||||
document.getElementById("gui-input-source").onchange = function() {OSRM.RoutingGUI.inputChanged(OSRM.C.SOURCE_LABEL);};
|
||||
document.getElementById("gui-delete-source").onclick = function() {OSRM.RoutingGUI.deleteMarker(OSRM.C.SOURCE_LABEL);};
|
||||
document.getElementById("gui-search-source").onclick = function() {OSRM.RoutingGUI.showMarker(OSRM.C.SOURCE_LABEL);};
|
||||
|
||||
document.getElementById("gui-input-target").onchange = function() {OSRM.RoutingGUI.inputChanged(OSRM.C.TARGET_LABEL);};
|
||||
document.getElementById("gui-delete-target").onclick = function() {OSRM.RoutingGUI.deleteMarker(OSRM.C.TARGET_LABEL);};
|
||||
document.getElementById("gui-search-target").onclick = function() {OSRM.RoutingGUI.showMarker(OSRM.C.TARGET_LABEL);};
|
||||
|
||||
document.getElementById("gui-reset").onclick = OSRM.RoutingGUI.resetRouting;
|
||||
document.getElementById("gui-reverse").onclick = OSRM.RoutingGUI.reverseRouting;
|
||||
document.getElementById("gui-options-toggle").onclick = OSRM.GUI.toggleOptions;
|
||||
document.getElementById("open-josm").onclick = OSRM.RoutingGUI.openJOSM;
|
||||
document.getElementById("open-osmbugs").onclick = OSRM.RoutingGUI.openOSMBugs;
|
||||
document.getElementById("option-highlight-nonames").onclick = OSRM.Routing.getRoute;
|
||||
|
||||
// gui after transition events
|
||||
if( OSRM.Browser.FF3==-1 && OSRM.Browser.IE6_9==-1 ) {
|
||||
document.getElementById('main-wrapper').addEventListener("transitionend", OSRM.GUI.onMainTransitionEnd, false);
|
||||
document.getElementById('main-wrapper').addEventListener("webkitTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||
document.getElementById('main-wrapper').addEventListener("oTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||
document.getElementById('main-wrapper').addEventListener("MSTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||
}
|
||||
|
||||
// set default language
|
||||
OSRM.Localization.setLanguage( OSRM.DEFAULTS.LANGUAGE );
|
||||
},
|
||||
|
||||
// set language dependent labels
|
||||
setLabels: function() {
|
||||
document.getElementById("open-josm").innerHTML = OSRM.loc("OPEN_JOSM");
|
||||
document.getElementById("open-osmbugs").innerHTML = OSRM.loc("OPEN_OSMBUGS");
|
||||
document.getElementById("gui-reset").innerHTML = OSRM.loc("GUI_RESET");
|
||||
document.getElementById("gui-reverse").innerHTML = OSRM.loc("GUI_REVERSE");
|
||||
document.getElementById("gui-option-highlight-nonames-label").innerHTML = OSRM.loc("GUI_HIGHLIGHT_UNNAMED_ROADS");
|
||||
document.getElementById("gui-options-toggle").innerHTML = OSRM.loc("GUI_OPTIONS");
|
||||
document.getElementById("gui-search-source").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||
document.getElementById("gui-search-target").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||
document.getElementById("gui-search-source-label").innerHTML = OSRM.loc("GUI_START")+":";
|
||||
document.getElementById("gui-search-target-label").innerHTML = OSRM.loc("GUI_END")+":";
|
||||
document.getElementById("gui-input-source").title = OSRM.loc("GUI_START_TOOLTIP");
|
||||
document.getElementById("gui-input-target").title = OSRM.loc("GUI_END_TOOLTIP");
|
||||
document.getElementById("legal-notice").innerHTML = OSRM.loc("GUI_LEGAL_NOTICE");
|
||||
},
|
||||
|
||||
// show/hide main-gui
|
||||
toggleMain: function() {
|
||||
// show main-gui
|
||||
if( OSRM.GUI.visible == false ) {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left=(OSRM.GUI.width+10)+"px";;
|
||||
|
||||
document.getElementById('blob-wrapper').style.visibility="hidden";
|
||||
document.getElementById('main-wrapper').style.left="5px";
|
||||
// hide main-gui
|
||||
} else {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left="30px";
|
||||
|
||||
document.getElementById('main-wrapper').style.left=-OSRM.GUI.width+"px";
|
||||
}
|
||||
|
||||
// execute after animation (old browser support)
|
||||
if( OSRM.Browser.FF3!=-1 || OSRM.Browser.IE6_9!=-1 )
|
||||
OSRM.GUI.onMainTransitionEnd();
|
||||
},
|
||||
|
||||
// do stuff after main-gui animation finished
|
||||
onMainTransitionEnd: function() {
|
||||
// after hiding main-gui
|
||||
if( document.getElementById('main-wrapper').style.left == "-410px" ) {
|
||||
if( OSRM.GUI.visible == true ) {
|
||||
document.getElementById('blob-wrapper').style.visibility="visible";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||
OSRM.GUI.visible = false;
|
||||
// after showing main-gui
|
||||
} else {
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||
OSRM.GUI.visible = true;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -75,6 +129,12 @@ toggleOptions: function() {
|
||||
} else {
|
||||
document.getElementById('options-box').style.visibility="visible";
|
||||
}
|
||||
},
|
||||
|
||||
// clear output area
|
||||
clearResults: function() {
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM geocoding routines
|
||||
// [geocoder query, management and display of geocoder results]
|
||||
|
||||
// some constants
|
||||
OSRM.CONSTANTS.SOURCE_LABEL = "source";
|
||||
OSRM.CONSTANTS.TARGET_LABEL = "target";
|
||||
OSRM.CONSTANTS.VIA_LABEL = "via";
|
||||
OSRM.CONSTANTS.DO_FALLBACK_TO_LAT_LNG = true;
|
||||
|
||||
|
||||
OSRM.Geocoder = {
|
||||
|
||||
//[normal geocoding]
|
||||
|
||||
// process input request and call geocoder if needed
|
||||
call: function(marker_id, query) {
|
||||
if(query=="")
|
||||
return;
|
||||
|
||||
//geo coordinates given -> directly draw results
|
||||
if(query.match(/^\s*[-+]?[0-9]*\.?[0-9]+\s*[,;]\s*[-+]?[0-9]*\.?[0-9]+\s*$/)){
|
||||
var coord = query.split(/[,;]/);
|
||||
OSRM.Geocoder._onclickResult(marker_id, coord[0], coord[1]);
|
||||
OSRM.Geocoder.updateAddress( marker_id );
|
||||
return;
|
||||
}
|
||||
|
||||
//build request for geocoder
|
||||
var call = OSRM.DEFAULTS.HOST_GEOCODER_URL + "?format=json" + OSRM.DEFAULTS.GEOCODER_BOUNDS + "&accept-language="+OSRM.Localization.current_language+"&q=" + query;
|
||||
OSRM.JSONP.call( call, OSRM.Geocoder._showResults, OSRM.Geocoder._showResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "geocoder_"+marker_id, {marker_id:marker_id,query:query} );
|
||||
},
|
||||
|
||||
|
||||
// helper function for clicks on geocoder search results
|
||||
_onclickResult: function(marker_id, lat, lon) {
|
||||
var index;
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL )
|
||||
index = OSRM.G.markers.setSource( new L.LatLng(lat, lon) );
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL )
|
||||
index = OSRM.G.markers.setTarget( new L.LatLng(lat, lon) );
|
||||
else
|
||||
return;
|
||||
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView();
|
||||
if( OSRM.G.markers.route.length > 1 )
|
||||
OSRM.Routing.getRoute();
|
||||
},
|
||||
|
||||
|
||||
// process geocoder response
|
||||
_showResults: function(response, parameters) {
|
||||
if(!response){
|
||||
OSRM.Geocoder._showResults_Empty(parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
if(response.length == 0) {
|
||||
OSRM.Geocoder._showResults_Empty(parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
// show first result
|
||||
OSRM.Geocoder._onclickResult(parameters.marker_id, response[0].lat, response[0].lon);
|
||||
if( OSRM.G.markers.route.length > 1 ) // if a route is displayed, we don't need to show other possible geocoding results
|
||||
return;
|
||||
|
||||
// show possible results for input
|
||||
var html = "";
|
||||
html += '<table class="results-table medium-font">';
|
||||
for(var i=0; i < response.length; i++){
|
||||
var result = response[i];
|
||||
|
||||
//odd or even ?
|
||||
var rowstyle='results-odd';
|
||||
if(i%2==0) { rowstyle='results-even'; }
|
||||
|
||||
html += '<tr class="'+rowstyle+'">';
|
||||
html += '<td class="result-counter"><span">'+(i+1)+'.</span></td>';
|
||||
html += '<td class="result-items">';
|
||||
|
||||
if(result.display_name){
|
||||
html += '<div class="result-item" onclick="OSRM.Geocoder._onclickResult(\''+parameters.marker_id+'\', '+result.lat+', '+result.lon+');">'+result.display_name+'</div>';
|
||||
}
|
||||
html += "</td></tr>";
|
||||
}
|
||||
html += '</table>';
|
||||
|
||||
document.getElementById('information-box-header').innerHTML =
|
||||
"<div class='header-title'>"+OSRM.loc("SEARCH_RESULTS")+"</div>" +
|
||||
"<div class='header-content'>("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,response.length)+")</div>";
|
||||
"<div class='header-content'>(found "+response.length+" results)"+"</div>";
|
||||
document.getElementById('information-box').innerHTML = html;
|
||||
},
|
||||
_showResults_Empty: function(parameters) {
|
||||
document.getElementById('information-box-header').innerHTML =
|
||||
"<div class='header-title'>"+OSRM.loc("SEARCH_RESULTS")+"</div>" +
|
||||
"<div class='header-content'>("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,0)+")</div>";
|
||||
if(parameters.marker_id == OSRM.C.SOURCE_LABEL)
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+OSRM.loc("NO_RESULTS_FOUND_SOURCE")+": "+parameters.query +"</div>";
|
||||
else if(parameters.marker_id == OSRM.C.TARGET_LABEL)
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+OSRM.loc("NO_RESULTS_FOUND_TARGET")+": "+parameters.query +"</div>";
|
||||
else
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+OSRM.loc("NO_RESULTS_FOUND")+": "+parameters.query +"</div>";
|
||||
},
|
||||
_showResults_Timeout: function() {
|
||||
document.getElementById('information-box-header').innerHTML =
|
||||
"<div class='header-title'>"+OSRM.loc("SEARCH_RESULTS")+"</div>" +
|
||||
"<div class='header-content'>("+OSRM.loc("FOUND_X_RESULTS").replace(/%i/,0)+")</div>";
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+OSRM.loc("TIMED_OUT")+"</div>";
|
||||
},
|
||||
|
||||
|
||||
// [reverse geocoding]
|
||||
|
||||
//update geo coordinates in input boxes
|
||||
updateLocation: function(marker_id) {
|
||||
if (marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||
document.getElementById("gui-input-source").value = OSRM.G.markers.route[0].getLat().toFixed(6) + ", " + OSRM.G.markers.route[0].getLng().toFixed(6);
|
||||
} else if (marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget()) {
|
||||
document.getElementById("gui-input-target").value = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLat().toFixed(6) + ", " + OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLng().toFixed(6);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// update address in input boxes
|
||||
updateAddress: function(marker_id, do_fallback_to_lat_lng) {
|
||||
// build request for reverse geocoder
|
||||
var lat = null;
|
||||
var lng = null;
|
||||
|
||||
if(marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||
lat = OSRM.G.markers.route[0].getLat();
|
||||
lng = OSRM.G.markers.route[0].getLng();
|
||||
} else if(marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() ) {
|
||||
lat = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLat();
|
||||
lng = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLng();
|
||||
} else
|
||||
return;
|
||||
|
||||
var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&accept-language="+OSRM.Localization.current_language + "&lat=" + lat + "&lon=" + lng;
|
||||
OSRM.JSONP.call( call, OSRM.Geocoder._showReverseResults, OSRM.Geocoder._showReverseResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_"+marker_id, {marker_id:marker_id, do_fallback: do_fallback_to_lat_lng} );
|
||||
},
|
||||
|
||||
|
||||
// processing JSONP response of reverse geocoder
|
||||
_showReverseResults: function(response, parameters) {
|
||||
if(!response) {
|
||||
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
if(response.address == undefined) {
|
||||
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
// build reverse geocoding address
|
||||
var used_address_data = 0;
|
||||
var address = "";
|
||||
if( response.address.road) {
|
||||
address += response.address.road;
|
||||
used_address_data++;
|
||||
}
|
||||
if( response.address.city ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.city;
|
||||
used_address_data++;
|
||||
} else if( response.address.village ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.village;
|
||||
used_address_data++;
|
||||
}
|
||||
if( used_address_data < 2 && response.address.country ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.country;
|
||||
used_address_data++;
|
||||
}
|
||||
if( used_address_data == 0 ) {
|
||||
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
// add result to DOM
|
||||
if(parameters.marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||
document.getElementById("gui-input-source").value = address;
|
||||
else if(parameters.marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||
document.getElementById("gui-input-target").value = address;
|
||||
},
|
||||
_showReverseResults_Timeout: function(response, parameters) {
|
||||
if(!parameters.do_fallback)
|
||||
return;
|
||||
|
||||
OSRM.Geocoder.updateLocation(parameters.marker_id);
|
||||
}
|
||||
|
||||
};
|
||||
@@ -66,7 +66,8 @@ OSRM.JSONP = {
|
||||
OSRM.JSONP.fences[id] = undefined; // clean fence
|
||||
}
|
||||
|
||||
// OSRM.debug.log("[jsonp] response handling: "+id);
|
||||
// OSRM.JSONP.sum[id] += new Number( new Date() - OSRM.JSONP.durations[id] );
|
||||
// OSRM.debug.log("[jsonp] response handling: "+id+" "+ (OSRM.JSONP.sum[id]/OSRM.JSONP.counter[id]).toFixed(2) );
|
||||
};
|
||||
|
||||
// clean DOM (unfortunately, script elements cannot be reused by all browsers)
|
||||
@@ -83,8 +84,12 @@ OSRM.JSONP = {
|
||||
|
||||
// start timeout timer
|
||||
OSRM.JSONP.timers[id] = setTimeout(OSRM.JSONP.timeouts[id], timeout);
|
||||
|
||||
// OSRM.debug.log("[jsonp] init: "+id);
|
||||
|
||||
// if(!OSRM.JSONP.durations) { OSRM.JSONP.durations = {}; OSRM.JSONP.counter = {}; OSRM.JSONP.sum = {}; }
|
||||
// if(OSRM.JSONP.counter[id]) OSRM.JSONP.counter[id]++; else {OSRM.JSONP.counter[id] = 1;OSRM.JSONP.sum[id] = 0;}
|
||||
// OSRM.JSONP.durations[id] = new Date();
|
||||
// OSRM.debug.log("[jsonp] init: "+id);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
@@ -95,4 +100,4 @@ OSRM.JSONP = {
|
||||
OSRM.JSONP.timeouts = {};
|
||||
OSRM.JSONP.timers = {};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM map handling
|
||||
// [initialization, event handling, centering relative to UI]
|
||||
|
||||
// will hold the map object
|
||||
OSRM.GLOBALS.map = null;
|
||||
|
||||
|
||||
// map view/model
|
||||
// [extending Leaflet L.Map with setView/fitBounds methods that respect UI visibility]
|
||||
OSRM.MapView = L.Map.extend({
|
||||
setViewUI: function(position, zoom) {
|
||||
if( OSRM.GUI.visible == true ) {
|
||||
var point = OSRM.G.map.project( position, zoom);
|
||||
point.x-=OSRM.GUI.width/2;
|
||||
position = OSRM.G.map.unproject(point,zoom);
|
||||
}
|
||||
this.setView( position, zoom);
|
||||
},
|
||||
fitBoundsUI: function(bounds) {
|
||||
var southwest = bounds.getSouthWest();
|
||||
var northeast = bounds.getNorthEast();
|
||||
var zoom = OSRM.G.map.getBoundsZoom(bounds);
|
||||
var sw_point = OSRM.G.map.project( southwest, zoom);
|
||||
if( OSRM.GUI.visible == true )
|
||||
sw_point.x-=OSRM.GUI.width/2;
|
||||
else
|
||||
sw_point.x-=10;
|
||||
sw_point.y+=10;
|
||||
var ne_point = OSRM.G.map.project( northeast, zoom);
|
||||
ne_point.y-=10;
|
||||
sw_point.x+=10;
|
||||
bounds.extend( OSRM.G.map.unproject(sw_point,zoom) );
|
||||
bounds.extend( OSRM.G.map.unproject(ne_point,zoom) );
|
||||
this.fitBounds( bounds );
|
||||
},
|
||||
getCenterUI: function(unbounded) {
|
||||
var viewHalf = this.getSize();
|
||||
if( OSRM.GUI.visible == true )
|
||||
viewHalf.x += OSRM.GUI.width;
|
||||
var centerPoint = this._getTopLeftPoint().add(viewHalf.divideBy(2));
|
||||
|
||||
return this.unproject(centerPoint, this._zoom, unbounded);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// map controller
|
||||
// [map initialization, event handling]
|
||||
OSRM.Map = {
|
||||
|
||||
// map initialization
|
||||
init: function() {
|
||||
// check if GUI is initialized!
|
||||
if(OSRM.GUI.visible == null)
|
||||
OSRM.GUI.init();
|
||||
|
||||
// setup tile servers
|
||||
var tile_servers = OSRM.DEFAULTS.TILE_SERVERS;
|
||||
var base_maps = {};
|
||||
for(var i=0, size=tile_servers.length; i<size; i++) {
|
||||
tile_servers[i].options.attribution = tile_servers[i].attribution;
|
||||
base_maps[ tile_servers[i].display_name ] = new L.TileLayer( tile_servers[i].url, tile_servers[i].options );
|
||||
}
|
||||
|
||||
// setup map
|
||||
OSRM.G.map = new OSRM.MapView('map', {
|
||||
center: new L.LatLng(OSRM.DEFAULTS.ONLOAD_LATITUDE, OSRM.DEFAULTS.ONLOAD_LONGITUDE),
|
||||
zoom: OSRM.DEFAULTS.ZOOM_LEVEL,
|
||||
layers: [base_maps[tile_servers[0].display_name]],
|
||||
zoomAnimation: false, // remove animations -> routes are not hidden during zoom
|
||||
fadeAnimation: false
|
||||
});
|
||||
|
||||
// add layer control
|
||||
var layersControl = new L.Control.Layers(base_maps, {});
|
||||
OSRM.G.map.addControl(layersControl);
|
||||
|
||||
// move zoom markers
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left=(OSRM.GUI.width+10)+"px";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.top="5px";
|
||||
|
||||
// initial correct map position and zoom (respect UI visibility, use browser position)
|
||||
var position = new L.LatLng( OSRM.DEFAULTS.ONLOAD_LATITUDE, OSRM.DEFAULTS.ONLOAD_LONGITUDE);
|
||||
OSRM.G.map.setViewUI( position, OSRM.DEFAULTS.ZOOM_LEVEL);
|
||||
if (navigator.geolocation && document.URL.indexOf("file://") == -1) // convenience during development, as FF doesn't save rights for local files
|
||||
navigator.geolocation.getCurrentPosition(OSRM.Map.geolocationResponse);
|
||||
|
||||
// map events
|
||||
OSRM.G.map.on('zoomend', OSRM.Map.zoomed );
|
||||
OSRM.G.map.on('click', OSRM.Map.click );
|
||||
OSRM.G.map.on('contextmenu', OSRM.Map.contextmenu );
|
||||
OSRM.G.map.on('mousemove', OSRM.Map.mousemove );
|
||||
},
|
||||
|
||||
// map event handlers
|
||||
zoomed: function(e) { OSRM.Routing.getRoute(); },
|
||||
contextmenu: function(e) {;},
|
||||
mousemove: function(e) { OSRM.Via.drawDragMarker(e); },
|
||||
click: function(e) {
|
||||
if( !OSRM.G.markers.hasSource() ) {
|
||||
var index = OSRM.G.markers.setSource( e.latlng );
|
||||
OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||
OSRM.Routing.getRoute();
|
||||
} else if( !OSRM.G.markers.hasTarget() ) {
|
||||
var index = OSRM.G.markers.setTarget( e.latlng );
|
||||
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||
OSRM.Routing.getRoute();
|
||||
}
|
||||
},
|
||||
geolocationResponse: function(response) {
|
||||
var latlng = new L.LatLng(response.coords.latitude, response.coords.longitude);
|
||||
OSRM.G.map.setViewUI(latlng, OSRM.DEFAULTS.ZOOM_LEVEL );
|
||||
}
|
||||
};
|
||||
@@ -59,7 +59,7 @@ isShown: function() {
|
||||
centerView: function(zoom) {
|
||||
if( zoom == undefined )
|
||||
zoom = OSRM.DEFAULTS.ZOOM_LEVEL;
|
||||
OSRM.G.map.setView( new L.LatLng( this.position.lat, this.position.lng), zoom);
|
||||
OSRM.G.map.setViewUI( this.position, zoom );
|
||||
},
|
||||
toString: function() {
|
||||
return "OSRM.Marker: \""+this.label+"\", "+this.position+")";
|
||||
@@ -67,26 +67,9 @@ toString: function() {
|
||||
});
|
||||
|
||||
|
||||
// highlight marker class (cannot be dragged)
|
||||
OSRM.HighlightMarker = function( label, style, position) {
|
||||
OSRM.HighlightMarker.prototype.base.constructor.apply( this, arguments );
|
||||
this.label = label ? label : "highlight_marker";
|
||||
|
||||
this.marker.on( 'click', this.onClick );
|
||||
};
|
||||
OSRM.inheritFrom( OSRM.HighlightMarker, OSRM.Marker );
|
||||
OSRM.extend( OSRM.HighlightMarker, {
|
||||
toString: function() {
|
||||
return "OSRM.HighlightMarker: \""+this.label+"\", "+this.position+")";
|
||||
},
|
||||
onClick: function(e) {
|
||||
this.parent.hide();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// route marker class (draggable, invokes route drawing routines)
|
||||
OSRM.RouteMarker = function ( label, style, position ) {
|
||||
style.baseicon = style.icon;
|
||||
OSRM.RouteMarker.prototype.base.constructor.apply( this, arguments );
|
||||
this.label = label ? label : "route_marker";
|
||||
|
||||
@@ -105,39 +88,47 @@ onClick: function(e) {
|
||||
}
|
||||
}
|
||||
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
OSRM.Routing.getRoute();
|
||||
OSRM.G.markers.highlight.hide();
|
||||
OSRM.G.markers.dragger.hide();
|
||||
},
|
||||
onDrag: function(e) {
|
||||
this.parent.setPosition( e.target.getLatLng() );
|
||||
getRoute(OSRM.C.NO_DESCRIPTION);
|
||||
updateLocation( this.parent.label );
|
||||
if(OSRM.G.markers.route.length>1)
|
||||
OSRM.Routing.getDragRoute();
|
||||
OSRM.Geocoder.updateLocation( this.parent.label );
|
||||
},
|
||||
onDragStart: function(e) {
|
||||
OSRM.G.dragging = true;
|
||||
this.switchIcon(this.options.dragicon);
|
||||
|
||||
// store id of dragged marker
|
||||
for( var i=0; i<OSRM.G.markers.route.length; i++)
|
||||
if( OSRM.G.markers.route[i].marker === this ) {
|
||||
OSRM.G.dragid = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
OSRM.G.markers.highlight.hide();
|
||||
if( this.parent != OSRM.G.markers.highlight)
|
||||
OSRM.G.markers.highlight.hide();
|
||||
if( this.parent != OSRM.G.markers.dragger)
|
||||
OSRM.G.markers.dragger.hide();
|
||||
if (OSRM.G.route.isShown())
|
||||
OSRM.G.route.showOldRoute();
|
||||
},
|
||||
onDragEnd: function(e) {
|
||||
OSRM.G.dragging = false;
|
||||
this.switchIcon(this.options.baseicon);
|
||||
|
||||
this.parent.setPosition( e.target.getLatLng() );
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
if (OSRM.G.route.isShown()) {
|
||||
OSRM.Routing.getRoute();
|
||||
OSRM.G.route.hideOldRoute();
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
} else {
|
||||
OSRM.Geocoder.updateAddress(this.parent.label);
|
||||
OSRM.GUI.clearResults();
|
||||
}
|
||||
|
||||
if(OSRM.G.route.isShown()==false)
|
||||
updateAddress(this.parent.label);
|
||||
},
|
||||
toString: function() {
|
||||
return "OSRM.RouteMarker: \""+this.label+"\", "+this.position+")";
|
||||
@@ -145,17 +136,50 @@ toString: function() {
|
||||
});
|
||||
|
||||
|
||||
//drag marker class (draggable, invokes route drawing routines)
|
||||
OSRM.DragMarker = function ( label, style, position ) {
|
||||
OSRM.DragMarker.prototype.base.constructor.apply( this, arguments );
|
||||
this.label = label ? label : "drag_marker";
|
||||
};
|
||||
OSRM.inheritFrom( OSRM.DragMarker, OSRM.RouteMarker );
|
||||
OSRM.extend( OSRM.DragMarker, {
|
||||
onClick: function(e) {
|
||||
if( this.parent != OSRM.G.markers.dragger)
|
||||
this.parent.hide();
|
||||
},
|
||||
onDragStart: function(e) {
|
||||
var new_via_index = OSRM.Via.findViaIndex( e.target.getLatLng() );
|
||||
OSRM.G.markers.route.splice(new_via_index+1,0, this.parent );
|
||||
|
||||
OSRM.RouteMarker.prototype.onDragStart.call(this,e);
|
||||
},
|
||||
onDragEnd: function(e) {
|
||||
OSRM.G.markers.route[OSRM.G.dragid] = new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via'],dragicon:OSRM.G.icons['marker-via-drag']}, e.target.getLatLng() );
|
||||
OSRM.G.markers.route[OSRM.G.dragid].show();
|
||||
|
||||
OSRM.RouteMarker.prototype.onDragEnd.call(this,e);
|
||||
this.parent.hide();
|
||||
},
|
||||
toString: function() {
|
||||
return "OSRM.DragMarker: \""+this.label+"\", "+this.position+")";
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// marker management class (all route markers should only be set and deleted with these routines!)
|
||||
// [this holds the vital information of the route]
|
||||
OSRM.Markers = function() {
|
||||
this.route = new Array();
|
||||
this.highlight = new OSRM.HighlightMarker("highlight", {draggable:false,icon:OSRM.icons['marker-highlight']});;
|
||||
this.highlight = new OSRM.DragMarker("highlight", {draggable:true,icon:OSRM.G.icons['marker-highlight'],dragicon:OSRM.G.icons['marker-highlight-drag']});;
|
||||
this.dragger = new OSRM.DragMarker("drag", {draggable:true,icon:OSRM.G.icons['marker-drag'],dragicon:OSRM.G.icons['marker-drag']});;
|
||||
};
|
||||
OSRM.extend( OSRM.Markers,{
|
||||
removeAll: function() {
|
||||
for(var i=0; i<this.route.length;i++)
|
||||
this.route[i].hide();
|
||||
this.route.splice(0, this.route.length);
|
||||
document.getElementById('gui-delete-source').style.visibility = "hidden";
|
||||
document.getElementById('gui-delete-target').style.visibility = "hidden";
|
||||
},
|
||||
removeVias: function() {
|
||||
// assert correct route array s - v - t
|
||||
@@ -168,7 +192,8 @@ setSource: function(position) {
|
||||
if( this.route[0] && this.route[0].label == OSRM.C.SOURCE_LABEL )
|
||||
this.route[0].setPosition(position);
|
||||
else
|
||||
this.route.splice(0,0, new OSRM.RouteMarker(OSRM.C.SOURCE_LABEL, {draggable:true,icon:OSRM.icons['marker-source']}, position));
|
||||
this.route.splice(0,0, new OSRM.RouteMarker(OSRM.C.SOURCE_LABEL, {draggable:true,icon:OSRM.G.icons['marker-source'],dragicon:OSRM.G.icons['marker-source-drag']}, position));
|
||||
document.getElementById('gui-delete-source').style.visibility = "visible";
|
||||
return 0;
|
||||
},
|
||||
setTarget: function(position) {
|
||||
@@ -176,7 +201,8 @@ setTarget: function(position) {
|
||||
if( this.route[this.route.length-1] && this.route[ this.route.length-1 ].label == OSRM.C.TARGET_LABEL )
|
||||
this.route[this.route.length-1].setPosition(position);
|
||||
else
|
||||
this.route.splice( this.route.length,0, new OSRM.RouteMarker(OSRM.C.TARGET_LABEL, {draggable:true,icon:OSRM.icons['marker-target']}, position));
|
||||
this.route.splice( this.route.length,0, new OSRM.RouteMarker(OSRM.C.TARGET_LABEL, {draggable:true,icon:OSRM.G.icons['marker-target'],dragicon:OSRM.G.icons['marker-target-drag']}, position));
|
||||
document.getElementById('gui-delete-target').style.visibility = "visible";
|
||||
return this.route.length-1;
|
||||
},
|
||||
setVia: function(id, position) {
|
||||
@@ -184,7 +210,7 @@ setVia: function(id, position) {
|
||||
if( this.route.length<2 || id > this.route.length-2 )
|
||||
return -1;
|
||||
|
||||
this.route.splice(id+1,0, new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.icons['marker-via']}, position));
|
||||
this.route.splice(id+1,0, new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via'],dragicon:OSRM.G.icons['marker-via-drag']}, position));
|
||||
return id+1;
|
||||
},
|
||||
removeMarker: function(id) {
|
||||
@@ -194,11 +220,17 @@ removeMarker: function(id) {
|
||||
// also remove vias if source or target are removed
|
||||
if( id==0 && this.route[0].label == OSRM.C.SOURCE_LABEL ) {
|
||||
this.removeVias();
|
||||
document.getElementById('input-source-name').value = "";
|
||||
document.getElementById('gui-input-source').value = "";
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
document.getElementById('gui-delete-source').style.visibility = "hidden";
|
||||
} else if( id == this.route.length-1 && this.route[ this.route.length-1 ].label == OSRM.C.TARGET_LABEL ) {
|
||||
this.removeVias();
|
||||
id = this.route.length-1;
|
||||
document.getElementById('input-target-name').value = "";
|
||||
document.getElementById('gui-input-target').value = "";
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
document.getElementById('gui-delete-target').style.visibility = "hidden";
|
||||
}
|
||||
|
||||
this.route[id].hide();
|
||||
|
||||
@@ -27,8 +27,6 @@ OSRM.SimpleRoute = function (label, style) {
|
||||
if(style) this.route.setStyle( style );
|
||||
|
||||
this.shown = false;
|
||||
|
||||
this.route.on('click', this.onClick);
|
||||
};
|
||||
OSRM.extend( OSRM.SimpleRoute,{
|
||||
show: function() {
|
||||
@@ -42,9 +40,12 @@ hide: function() {
|
||||
isShown: function() {
|
||||
return this.shown;
|
||||
},
|
||||
getPoints: function() {
|
||||
return this.route._originalPoints;
|
||||
},
|
||||
getPositions: function() {
|
||||
return this.route.getLatLngs();
|
||||
},
|
||||
},
|
||||
setPositions: function(positions) {
|
||||
this.route.setLatLngs( positions );
|
||||
},
|
||||
@@ -53,11 +54,7 @@ setStyle: function(style) {
|
||||
},
|
||||
centerView: function() {
|
||||
var bounds = new L.LatLngBounds( this.getPositions() );
|
||||
OSRM.G.map.fitBounds( bounds );
|
||||
},
|
||||
onClick: function(e) {
|
||||
if(OSRM.G.route.isRoute())
|
||||
findViaPosition( e.latlng );
|
||||
OSRM.g.map.fitBoundsUI( bounds );
|
||||
},
|
||||
toString: function() {
|
||||
return "OSRM.Route("+ this.label + ", " + this.route.getLatLngs().length + " points)";
|
||||
@@ -184,6 +181,9 @@ OSRM.extend( OSRM.Route,{
|
||||
getPositions: function() {
|
||||
return this._current_route.getPositions();
|
||||
},
|
||||
getPoints: function() {
|
||||
return this._current_route.getPoints();
|
||||
},
|
||||
fire: function(type,event) {
|
||||
this._current_route.route.fire(type,event);
|
||||
},
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM utility functions
|
||||
// [mixed functions]
|
||||
|
||||
|
||||
OSRM.Utils = {
|
||||
|
||||
// [human readabilty functions]
|
||||
|
||||
// human readable time
|
||||
secondsToTime: function(seconds){
|
||||
seconds = parseInt(seconds);
|
||||
minutes = parseInt(seconds/60);
|
||||
seconds = seconds%60;
|
||||
hours = parseInt(minutes/60);
|
||||
minutes = minutes%60;
|
||||
if(hours==0){
|
||||
return minutes + ' ' + 'min';
|
||||
}
|
||||
else{
|
||||
return hours + ' ' + 'h' + ' ' + minutes + ' ' + 'min';
|
||||
}
|
||||
},
|
||||
//human readable distance
|
||||
metersToDistance: function(distance){
|
||||
distance = parseInt(distance);
|
||||
|
||||
if(distance >= 100000){ return (parseInt(distance/1000))+' ' + 'km'; }
|
||||
else if(distance >= 10000){ return (parseInt(distance/1000).toFixed(1))+' ' + 'km'; }
|
||||
else if(distance >= 1000){ return (parseFloat(distance/1000).toFixed(2))+' ' + 'km'; }
|
||||
else{ return distance+' ' + 'm'; }
|
||||
},
|
||||
|
||||
|
||||
// [verification routines]
|
||||
|
||||
// verify angles
|
||||
isLatitude: function(value) {
|
||||
if( value >=-90 && value <=90)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
isLongitude: function(value) {
|
||||
if( value >=-180 && value <=180)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM via marker routines
|
||||
// [find correct position for a via marker]
|
||||
|
||||
// store location of via points returned by server
|
||||
OSRM.GLOBALS.via_points = null;
|
||||
|
||||
|
||||
OSRM.Via = {
|
||||
|
||||
// find route segment of current route geometry that is closest to the new via node (marked by index of its endpoint)
|
||||
_findNearestRouteSegment: function( new_via ) {
|
||||
var min_dist = Number.MAX_VALUE;
|
||||
var min_index = undefined;
|
||||
|
||||
var p = OSRM.G.map.latLngToLayerPoint( new_via );
|
||||
var positions = OSRM.G.route.getPoints();
|
||||
for(var i=1; i<positions.length; i++) {
|
||||
var _sqDist = L.LineUtil._sqClosestPointOnSegment(p, positions[i-1], positions[i], true);
|
||||
if( _sqDist < min_dist) {
|
||||
min_dist = _sqDist;
|
||||
min_index = i;
|
||||
}
|
||||
}
|
||||
|
||||
return min_index;
|
||||
},
|
||||
|
||||
|
||||
// find the correct index among all via nodes to insert the new via node, and insert it
|
||||
findViaIndex: function( new_via_position ) {
|
||||
// find route segment that is closest to click position (marked by last index)
|
||||
var nearest_index = OSRM.Via._findNearestRouteSegment( new_via_position );
|
||||
|
||||
// find correct index to insert new via node
|
||||
var new_via_index = OSRM.G.via_points.length;
|
||||
var via_index = Array();
|
||||
for(var i=0; i<OSRM.G.via_points.length; i++) {
|
||||
via_index[i] = OSRM.Via._findNearestRouteSegment( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||
if(via_index[i] > nearest_index) {
|
||||
new_via_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// add via node
|
||||
return new_via_index;
|
||||
},
|
||||
|
||||
|
||||
//function that draws a drag marker
|
||||
dragTimer: new Date(),
|
||||
|
||||
drawDragMarker: function(event) {
|
||||
if( OSRM.G.route.isShown() == false)
|
||||
return;
|
||||
if( OSRM.G.dragging == true )
|
||||
return;
|
||||
|
||||
// throttle computation
|
||||
if( (new Date() - OSRM.Via.dragTimer) < 25 )
|
||||
return;
|
||||
OSRM.Via.dragTimer = new Date();
|
||||
|
||||
// get distance to route
|
||||
var minpoint = OSRM.G.route._current_route.route.closestLayerPoint( event.layerPoint );
|
||||
var min_dist = minpoint ? minpoint._sqDist : 1000;
|
||||
|
||||
// get distance to markers
|
||||
var mouse = event.latlng;
|
||||
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++) {
|
||||
if(OSRM.G.markers.route[i].label=='drag')
|
||||
continue;
|
||||
var position = OSRM.G.markers.route[i].getPosition();
|
||||
var dist = OSRM.G.map.project(mouse).distanceTo(OSRM.G.map.project(position));
|
||||
if( dist < 20 )
|
||||
min_dist = 1000;
|
||||
}
|
||||
|
||||
// check whether mouse is over another marker
|
||||
var pos = OSRM.G.map.layerPointToContainerPoint(event.layerPoint);
|
||||
var obj = document.elementFromPoint(pos.x,pos.y);
|
||||
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++) {
|
||||
if(OSRM.G.markers.route[i].label=='drag')
|
||||
continue;
|
||||
if( obj == OSRM.G.markers.route[i].marker._icon)
|
||||
min_dist = 1000;
|
||||
}
|
||||
|
||||
// special care for highlight marker
|
||||
if( OSRM.G.markers.highlight.isShown() ) {
|
||||
if( OSRM.G.map.project(mouse).distanceTo(OSRM.G.map.project( OSRM.G.markers.highlight.getPosition() ) ) < 20 )
|
||||
min_dist = 1000;
|
||||
else if( obj == OSRM.G.markers.highlight.marker._icon)
|
||||
min_dist = 1000;
|
||||
}
|
||||
|
||||
if( min_dist < 400) {
|
||||
OSRM.G.markers.dragger.setPosition( OSRM.G.map.layerPointToLatLng(minpoint) );
|
||||
OSRM.G.markers.dragger.show();
|
||||
} else
|
||||
OSRM.G.markers.dragger.hide();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -19,8 +19,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
// [has to be loaded before all other OSRM classes]
|
||||
|
||||
var OSRM = {};
|
||||
OSRM.VERSION = '0.1.2';
|
||||
OSRM.DATE = '120319';
|
||||
OSRM.VERSION = '0.1.4';
|
||||
OSRM.DATE = '120416';
|
||||
OSRM.CONSTANTS = {};
|
||||
OSRM.DEFAULTS = {};
|
||||
OSRM.GLOBALS = {};
|
||||
@@ -28,17 +28,20 @@ OSRM.G = OSRM.GLOBALS; // abbreviations
|
||||
OSRM.C = OSRM.CONSTANTS;
|
||||
|
||||
|
||||
// [convenience function] declare one class to be a subclass of another class
|
||||
OSRM._inheritFromHelper = function() {};
|
||||
// declare one class to be a subclass of another class
|
||||
// (runs anonymous function to prevent local functions cluttering global namespace)
|
||||
(function() {
|
||||
var _inheritFromHelper = function() {};
|
||||
OSRM.inheritFrom = function( sub_class, base_class ) {
|
||||
OSRM._inheritFromHelper.prototype = base_class.prototype;
|
||||
sub_class.prototype = new OSRM._inheritFromHelper();
|
||||
_inheritFromHelper.prototype = base_class.prototype;
|
||||
sub_class.prototype = new _inheritFromHelper();
|
||||
sub_class.prototype.constructor = sub_class;
|
||||
sub_class.prototype.base = base_class.prototype;
|
||||
};
|
||||
}());
|
||||
|
||||
|
||||
// [convenience function] extend prototypes of a class -> used to add member values and functions
|
||||
// extend prototypes of a class -> used to add member values and functions
|
||||
OSRM.extend = function( target_class, properties ) {
|
||||
for( property in properties ) {
|
||||
target_class.prototype[property] = properties[property];
|
||||
|
||||
@@ -24,13 +24,44 @@ OSRM.DEFAULTS = {
|
||||
HOST_GEOCODER_URL: 'http://nominatim.openstreetmap.org/search',
|
||||
HOST_REVERSE_GEOCODER_URL: 'http://nominatim.openstreetmap.org/reverse',
|
||||
WEBSITE_URL: document.URL.replace(/#*(\?.*|$)/i,""), // truncates URL before first ?, and removes tailing #
|
||||
JSONP_TIMEOUT: 5000,
|
||||
JSONP_TIMEOUT: 10000,
|
||||
ZOOM_LEVEL: 14,
|
||||
ONLOAD_LATITUDE: 48.84,
|
||||
ONLOAD_LONGITUDE: 10.10,
|
||||
ONLOAD_SOURCE: "",
|
||||
ONLOAD_TARGET: "",
|
||||
HIGHLIGHT_ZOOM_LEVEL: 16,
|
||||
GEOCODER_BOUNDS: '', // the world is not enough!
|
||||
//GEOCODER_BOUNDS: '&bounded=1&viewbox=-27.0,72.0,46.0,36.0', // bounds for Europe
|
||||
|
||||
LANGUAGE: "en",
|
||||
GEOCODER_BOUNDS: '&bounded=1&viewbox=-27.0,72.0,46.0,36.0'
|
||||
LANGUAGE_FILES_DIRECTORY: "localization/",
|
||||
LANUGAGE_ONDEMAND_RELOADING: true,
|
||||
LANGUAGE_SUPPORTED: [
|
||||
{display_name:"en", encoding:"en"},
|
||||
{display_name:"de", encoding:"de"}
|
||||
],
|
||||
|
||||
TILE_SERVERS: [
|
||||
{ display_name: 'osm.org',
|
||||
url:'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
attribution:'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||
options:{maxZoom: 18}
|
||||
},
|
||||
{ display_name: 'osm.de',
|
||||
url:'http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
|
||||
attribution:'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||
options:{maxZoom: 18}
|
||||
},
|
||||
{ display_name: 'MapQuest',
|
||||
url:'http://otile{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png',
|
||||
attribution:'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 MapQuest',
|
||||
options:{maxZoom: 18, subdomains: '1234'}
|
||||
},
|
||||
{ display_name: 'CloudMade',
|
||||
url:'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png',
|
||||
attribution:'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
|
||||
options:{maxZoom: 18}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
@@ -21,6 +21,16 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
OSRM.debug = {};
|
||||
|
||||
|
||||
// access functions
|
||||
OSRM.debug.log = function(text) {
|
||||
OSRM.debug.content.innerHTML += text + "<hr style='border:none; margin:2px; height:1px; color:#F0F0F0; background:#F0F0F0;'/>";
|
||||
OSRM.debug.content.scrollTop = OSRM.debug.content.scrollHeight;
|
||||
};
|
||||
OSRM.debug.clear = function() {
|
||||
OSRM.debug.content.innerHTML = "";
|
||||
};
|
||||
|
||||
|
||||
// add elements to DOM
|
||||
OSRM.debug.init = function() {
|
||||
//create DOM objects for debug output
|
||||
@@ -50,17 +60,10 @@ OSRM.debug.init = function() {
|
||||
box.appendChild(clear);
|
||||
box.appendChild(OSRM.debug.content);
|
||||
};
|
||||
|
||||
|
||||
// onload event
|
||||
if(document.addEventListener) // FF, CH
|
||||
document.addEventListener("DOMContentLoaded", OSRM.debug.init, false);
|
||||
else // IE
|
||||
OSRM.debug.init();
|
||||
|
||||
|
||||
// working functions
|
||||
OSRM.debug.log = function(text) {
|
||||
OSRM.debug.content.innerHTML += text + "<hr style='border:none; margin:2px; height:1px; color:#F0F0F0; background:#F0F0F0;'/>";
|
||||
OSRM.debug.content.scrollTop = OSRM.debug.content.scrollHeight;
|
||||
};
|
||||
OSRM.debug.clear = function() {
|
||||
OSRM.debug.content.innerHTML = "";
|
||||
};
|
||||
else if(document.attachEvent) // IE
|
||||
document.attachEvent("onreadystatechange", function() { if ( document.readyState === "interactive" ) OSRM.debug.init(); });
|
||||
|
||||
@@ -1,203 +0,0 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM geocoding routines
|
||||
// [geocoder query, management and display of geocoder results]
|
||||
// [TODO: better separation of GUI and geocoding routines, reverse geocoding]
|
||||
|
||||
// some constants
|
||||
OSRM.CONSTANTS.SOURCE_LABEL = "source";
|
||||
OSRM.CONSTANTS.TARGET_LABEL = "target";
|
||||
OSRM.CONSTANTS.VIA_LABEL = "via";
|
||||
OSRM.C.DO_FALLBACK_TO_LAT_LNG = true;
|
||||
|
||||
|
||||
//[normal geocoding]
|
||||
|
||||
// process input request and call geocoder if needed
|
||||
function callGeocoder(marker_id, query) {
|
||||
if(query=="")
|
||||
return;
|
||||
|
||||
//geo coordinates given -> directly draw results
|
||||
if(query.match(/^\s*[-+]?[0-9]*\.?[0-9]+\s*[,;]\s*[-+]?[0-9]*\.?[0-9]+\s*$/)){
|
||||
var coord = query.split(/[,;]/);
|
||||
onclickGeocoderResult(marker_id, coord[0], coord[1]);
|
||||
updateAddress( marker_id );
|
||||
return;
|
||||
}
|
||||
|
||||
//build request for geocoder
|
||||
var call = OSRM.DEFAULTS.HOST_GEOCODER_URL + "?format=json" + OSRM.DEFAULTS.GEOCODER_BOUNDS + "&q=" + query;
|
||||
OSRM.JSONP.call( call, showGeocoderResults, showGeocoderResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "geocoder_"+marker_id, marker_id );
|
||||
}
|
||||
|
||||
|
||||
// helper function for clicks on geocoder search results
|
||||
function onclickGeocoderResult(marker_id, lat, lon) {
|
||||
var index;
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL )
|
||||
index = OSRM.G.markers.setSource( new L.LatLng(lat, lon) );
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL )
|
||||
index = OSRM.G.markers.setTarget( new L.LatLng(lat, lon) );
|
||||
else
|
||||
return;
|
||||
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView();
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
}
|
||||
|
||||
|
||||
// process geocoder response
|
||||
function showGeocoderResults(response, marker_id) {
|
||||
if(!response){
|
||||
showGeocoderResults_Empty(marker_id);
|
||||
return;
|
||||
}
|
||||
|
||||
if(response.length == 0) {
|
||||
showGeocoderResults_Empty(marker_id);
|
||||
return;
|
||||
}
|
||||
|
||||
// show possible results for input
|
||||
var html = "";
|
||||
html += '<table class="results-table">';
|
||||
for(var i=0; i < response.length; i++){
|
||||
var result = response[i];
|
||||
|
||||
//odd or even ?
|
||||
var rowstyle='results-odd';
|
||||
if(i%2==0) { rowstyle='results-even'; }
|
||||
|
||||
html += '<tr class="'+rowstyle+'">';
|
||||
html += '<td class="result-counter"><span">'+(i+1)+'.</span></td>';
|
||||
html += '<td class="result-items">';
|
||||
|
||||
if(result.display_name){
|
||||
html += '<div class="result-item" onclick="onclickGeocoderResult(\''+marker_id+'\', '+result.lat+', '+result.lon+');">'+result.display_name+'</div>';
|
||||
}
|
||||
html += "</td></tr>";
|
||||
}
|
||||
html += '</table>';
|
||||
|
||||
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||
document.getElementById('information-box').innerHTML = html;
|
||||
|
||||
onclickGeocoderResult(marker_id, response[0].lat, response[0].lon);
|
||||
}
|
||||
function showGeocoderResults_Empty(marker_id) {
|
||||
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||
if(marker_id == OSRM.C.SOURCE_LABEL)
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND_SOURCE")+".<p>";
|
||||
else if(marker_id == OSRM.C.TARGET_LABEL)
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND_TARGET")+".<p>";
|
||||
else
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND")+".<p>";
|
||||
}
|
||||
function showGeocoderResults_Timeout() {
|
||||
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("TIMED_OUT")+".<p>";
|
||||
}
|
||||
|
||||
|
||||
// [reverse geocoding]
|
||||
|
||||
//update geo coordinates in input boxes
|
||||
function updateLocation(marker_id) {
|
||||
if (marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||
document.getElementById("input-source-name").value = OSRM.G.markers.route[0].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[0].getPosition().lng.toFixed(6);
|
||||
} else if (marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget()) {
|
||||
document.getElementById("input-target-name").value = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat.toFixed(6) + ", " + OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng.toFixed(6);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// update address in input boxes
|
||||
function updateAddress(marker_id, do_fallback_to_lat_lng) {
|
||||
// build request for reverse geocoder
|
||||
var lat = null;
|
||||
var lng = null;
|
||||
|
||||
if(marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||
lat = OSRM.G.markers.route[0].getPosition().lat;
|
||||
lng = OSRM.G.markers.route[0].getPosition().lng;
|
||||
} else if(marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() ) {
|
||||
lat = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lat;
|
||||
lng = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getPosition().lng;
|
||||
} else
|
||||
return;
|
||||
|
||||
var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&lat=" + lat + "&lon=" + lng;
|
||||
OSRM.JSONP.call( call, showReverseGeocoderResults, showReverseGeocoderResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_"+marker_id, {marker_id:marker_id, do_fallback: do_fallback_to_lat_lng} );
|
||||
}
|
||||
|
||||
|
||||
// processing JSONP response of reverse geocoder
|
||||
function showReverseGeocoderResults(response, parameters) {
|
||||
if(!response) {
|
||||
showReverseGeocoderResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
if(response.address == undefined) {
|
||||
showReverseGeocoderResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
// build reverse geocoding address
|
||||
var used_address_data = 0;
|
||||
var address = "";
|
||||
if( response.address.road) {
|
||||
address += response.address.road;
|
||||
used_address_data++;
|
||||
}
|
||||
if( response.address.city ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.city;
|
||||
used_address_data++;
|
||||
} else if( response.address.village ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.village;
|
||||
used_address_data++;
|
||||
}
|
||||
if( used_address_data < 2 && response.address.country ) {
|
||||
if( used_address_data > 0 )
|
||||
address += ", ";
|
||||
address += response.address.country;
|
||||
used_address_data++;
|
||||
}
|
||||
if( used_address_data == 0 ) {
|
||||
showReverseGeocoderResults_Timeout(response, parameters);
|
||||
return;
|
||||
}
|
||||
|
||||
// add result to DOM
|
||||
if(parameters.marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||
document.getElementById("input-source-name").value = address;
|
||||
else if(parameters.marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||
document.getElementById("input-target-name").value = address;
|
||||
}
|
||||
function showReverseGeocoderResults_Timeout(response, parameters) {
|
||||
if(!parameters.do_fallback)
|
||||
return;
|
||||
|
||||
updateLocation(parameters.marker_id);
|
||||
}
|
||||
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 347 B |
|
After Width: | Height: | Size: 349 B |
|
After Width: | Height: | Size: 350 B |
|
After Width: | Height: | Size: 322 B |
|
After Width: | Height: | Size: 446 B |
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM localization
|
||||
// [German language support]
|
||||
|
||||
|
||||
OSRM.Localization["de"] = {
|
||||
//gui
|
||||
"OPEN_JOSM": "JOSM",
|
||||
"OPEN_OSMBUGS": "OSM Bugs",
|
||||
"GUI_START": "Start",
|
||||
"GUI_END": "Ziel",
|
||||
"GUI_RESET": "Reset",
|
||||
"GUI_SEARCH": "Zeigen",
|
||||
"GUI_REVERSE": "Umdrehen",
|
||||
"GUI_OPTIONS": "Kartenwerkzeuge",
|
||||
"GUI_HIGHLIGHT_UNNAMED_ROADS": "Unbenannte Straßen hervorheben",
|
||||
"GUI_START_TOOLTIP": "Startposition eingeben",
|
||||
"GUI_END_TOOLTIP": "Zielposition eingeben",
|
||||
"GUI_LEGAL_NOTICE": "GUI2 v"+OSRM.VERSION+" "+OSRM.DATE+" - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a>",
|
||||
// geocoder
|
||||
"SEARCH_RESULTS": "Suchergebnisse",
|
||||
"FOUND_X_RESULTS": "%i Ergebnisse gefunden",
|
||||
"TIMED_OUT": "Zeitüberschreitung",
|
||||
"NO_RESULTS_FOUND": "Keine Ergebnisse gefunden",
|
||||
"NO_RESULTS_FOUND_SOURCE": "Keine Ergebnisse gefunden für Start",
|
||||
"NO_RESULTS_FOUND_TARGET": "Keine Ergebnisse gefunden für Ziel",
|
||||
// routing
|
||||
"ROUTE_DESCRIPTION": "Routenbeschreibung",
|
||||
"GET_LINK_TO_ROUTE": "Generiere Link",
|
||||
"GENERATE_LINK_TO_ROUTE": "Warte auf Antwort",
|
||||
"LINK_TO_ROUTE_TIMEOUT": "nicht möglich",
|
||||
"GPX_FILE": "GPX Datei",
|
||||
"DISTANCE": "Distanz",
|
||||
"DURATION": "Dauer",
|
||||
"YOUR_ROUTE_IS_BEING_COMPUTED": "Ihre Route wird berechnet",
|
||||
"NO_ROUTE_FOUND": "Keine Route hierher möglich",
|
||||
// directions
|
||||
"N": "Norden",
|
||||
"E": "Ost",
|
||||
"S": "Süden",
|
||||
"W": "Westen",
|
||||
"NE": "Nordost",
|
||||
"SE": "Südost",
|
||||
"SW": "Südwest",
|
||||
"NW": "Nordwest",
|
||||
// driving directions
|
||||
"DIRECTION_0":"Unbekannte Anweisung[ auf <b>%s</b>]",
|
||||
"DIRECTION_1":"Geradeaus weiterfahren[ auf <b>%s</b>]",
|
||||
"DIRECTION_2":"Leicht rechts abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_3":"Rechts abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_4":"Scharf rechts abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_5":"Wenden[ auf <b>%s</b>]",
|
||||
"DIRECTION_6":"Leicht links abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_7":"Links abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_8":"Scharf links abbiegen[ auf <b>%s</b>]",
|
||||
"DIRECTION_10":"Fahren Sie Richtung <b>%s</b>",
|
||||
"DIRECTION_11-1":"In den Kreisverkehr einfahren und bei erster Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-2":"In den Kreisverkehr einfahren und bei zweiter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-3":"In den Kreisverkehr einfahren und bei dritter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-4":"In den Kreisverkehr einfahren und bei vierter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-5":"In den Kreisverkehr einfahren und bei fünfter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-6":"In den Kreisverkehr einfahren und bei sechster Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-7":"In den Kreisverkehr einfahren und bei siebter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-8":"In den Kreisverkehr einfahren und bei achter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-9":"In den Kreisverkehr einfahren und bei neunter Möglichkeit[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_11-x":"In den Kreisverkehr einfahren und bei einer der vielen Möglichkeiten[ in Richtung <b>%s</b>] verlassen",
|
||||
"DIRECTION_15":"Sie haben Ihr Ziel erreicht"
|
||||
};
|
||||
|
||||
// set GUI language on load
|
||||
if( OSRM.DEFAULTS.LANUGAGE_ONDEMAND_RELOADING==true )
|
||||
OSRM.Localization.setLanguage("de");
|
||||
@@ -16,82 +16,26 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM localization
|
||||
// [basic localization options]
|
||||
// [English language support]
|
||||
|
||||
|
||||
OSRM.Localization = {
|
||||
|
||||
// if existing, return localized string -> English string -> input string
|
||||
translate: function(text) {
|
||||
if( OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text] )
|
||||
return OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text];
|
||||
else if( OSRM.Localization["en"][text] )
|
||||
return OSRM.Localization["en"][text];
|
||||
else
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
// shorter call to translate function
|
||||
OSRM.loc = OSRM.Localization.translate;
|
||||
|
||||
|
||||
// German language support
|
||||
OSRM.Localization["de"] = {
|
||||
//gui
|
||||
"GUI_START": "Start",
|
||||
"GUI_END": "Ziel",
|
||||
"GUI_RESET": "Reset",
|
||||
"GUI_SEARCH": "Zeigen",
|
||||
"GUI_REVERSE": "Umdrehen",
|
||||
"GUI_OPTIONS": "Optionen",
|
||||
"GUI_HIGHLIGHT_UNNAMED_ROADS": "Unbenannte Straßen hervorheben",
|
||||
"GUI_START_TOOLTIP": "Startposition eingeben",
|
||||
"GUI_END_TOOLTIP": "Zielposition eingeben",
|
||||
"GUI_LEGAL_NOTICE": "GUI2 v"+OSRM.VERSION+" "+OSRM.DATE+" - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a>",
|
||||
// geocoder
|
||||
"SEARCH_RESULTS": "Suchergebnisse",
|
||||
"TIMED_OUT": "Zeitüberschreitung",
|
||||
"NO_RESULTS_FOUND": "Keine Ergebnisse gefunden",
|
||||
"NO_RESULTS_FOUND_SOURCE": "Keine Ergebnisse gefunden für Start",
|
||||
"NO_RESULTS_FOUND_TARGET": "Keine Ergebnisse gefunden für Ziel",
|
||||
// routing
|
||||
"ROUTE_DESCRIPTION": "Routenbeschreibung",
|
||||
"GET_LINK_TO_ROUTE": "Generiere Link",
|
||||
"GENERATE_LINK_TO_ROUTE": "Warte auf Antwort",
|
||||
"LINK_TO_ROUTE_TIMEOUT": "nicht möglich",
|
||||
"GPX_FILE": "GPX Datei",
|
||||
"DISTANCE": "Distanz",
|
||||
"DURATION": "Dauer",
|
||||
"YOUR_ROUTE_IS_BEING_COMPUTED": "Ihre Route wird berechnet",
|
||||
"NO_ROUTE_FOUND": "Keine Route hierher möglich",
|
||||
// directions
|
||||
"N": "Norden",
|
||||
"O": "Ost",
|
||||
"S": "Süden",
|
||||
"W": "Westen",
|
||||
"NO": "Nordost",
|
||||
"SO": "Südost",
|
||||
"SW": "Südwest",
|
||||
"NW": "Nordwest"
|
||||
};
|
||||
|
||||
|
||||
// English language support
|
||||
OSRM.Localization["en"] = {
|
||||
//gui
|
||||
"OPEN_JOSM": "JOSM",
|
||||
"OPEN_OSMBUGS": "OSM Bugs",
|
||||
"GUI_START": "Start",
|
||||
"GUI_END": "End",
|
||||
"GUI_RESET": " Reset ",
|
||||
"GUI_SEARCH": " Show ",
|
||||
"GUI_REVERSE": "Reverse",
|
||||
"GUI_OPTIONS": "Options",
|
||||
"GUI_OPTIONS": "Mapping Tools",
|
||||
"GUI_HIGHLIGHT_UNNAMED_ROADS": "Highlight unnamed streets",
|
||||
"GUI_START_TOOLTIP": "Enter start",
|
||||
"GUI_END_TOOLTIP": "Enter destination",
|
||||
"GUI_LEGAL_NOTICE": "GUI2 v"+OSRM.VERSION+" "+OSRM.DATE+" - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a>",
|
||||
// geocoder
|
||||
"SEARCH_RESULTS": "Search Results",
|
||||
"FOUND_X_RESULTS": "found %i results",
|
||||
"TIMED_OUT": "Timed Out",
|
||||
"NO_RESULTS_FOUND": "No results found",
|
||||
"NO_RESULTS_FOUND_SOURCE": "No results found for start",
|
||||
@@ -114,5 +58,31 @@ OSRM.Localization["en"] = {
|
||||
"NE": "northeast",
|
||||
"SE": "southeast",
|
||||
"SW": "southwest",
|
||||
"NW": "northwest"
|
||||
};
|
||||
"NW": "northwest",
|
||||
// driving directions
|
||||
"DIRECTION_0":"Unknown instruction[ on <b>%s</b>]",
|
||||
"DIRECTION_1":"Continue[ on <b>%s</b>]",
|
||||
"DIRECTION_2":"Turn slight right[ on <b>%s</b>]",
|
||||
"DIRECTION_3":"Turn right[ on <b>%s</b>]",
|
||||
"DIRECTION_4":"Turn sharp right[ on <b>%s</b>]",
|
||||
"DIRECTION_5":"U-Turn[ on <b>%s</b>]",
|
||||
"DIRECTION_6":"Turn slight left[ on <b>%s</b>]",
|
||||
"DIRECTION_7":"Turn left[ on <b>%s</b>]",
|
||||
"DIRECTION_8":"Turn sharp left[ on <b>%s</b>]",
|
||||
"DIRECTION_10":"Head <b>%s</b>",
|
||||
"DIRECTION_11-1":"Enter roundabout and leave at first exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-2":"Enter roundabout and leave at second exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-3":"Enter roundabout and leave at third exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-4":"Enter roundabout and leave at fourth exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-5":"Enter roundabout and leave at fifth exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-6":"Enter roundabout and leave at sixth exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-7":"Enter roundabout and leave at seventh exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-8":"Enter roundabout and leave at eighth exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-9":"Enter roundabout and leave at nineth exit[ on <b>%s</b>]",
|
||||
"DIRECTION_11-x":"Enter roundabout and leave at one of the too many exits[ on <b>%s</b>]",
|
||||
"DIRECTION_15":"You have reached your destination"
|
||||
};
|
||||
|
||||
//set GUI language on load
|
||||
if( OSRM.DEFAULTS.LANUGAGE_ONDEMAND_RELOADING == true )
|
||||
OSRM.Localization.setLanguage("en");
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM localization
|
||||
// [basic localization options]
|
||||
|
||||
|
||||
OSRM.Localization = {
|
||||
|
||||
current_language: OSRM.DEFAULTS.LANGUAGE,
|
||||
|
||||
// initialize localization
|
||||
init: function() {
|
||||
// create dropdown menu
|
||||
var select = document.createElement('select');
|
||||
select.id = "gui-language-toggle";
|
||||
select.className = "top-left-button";
|
||||
select.onchange = function() { OSRM.Localization.setLanguage(this.value); };
|
||||
|
||||
// fill dropdown menu
|
||||
var supported_languages = OSRM.DEFAULTS.LANGUAGE_SUPPORTED;
|
||||
for(var i=0, size=supported_languages.length; i<size; i++) {
|
||||
var option=document.createElement("option");
|
||||
option.innerHTML = supported_languages[i].display_name;
|
||||
option.value = supported_languages[i].encoding;
|
||||
select.appendChild(option);
|
||||
}
|
||||
select.value = OSRM.DEFAULTS.LANGUAGE;
|
||||
|
||||
// add element to DOM
|
||||
var input_mask_header = document.getElementById('input-mask-header');
|
||||
input_mask_header.insertBefore(select,input_mask_header.firstChild);
|
||||
|
||||
// create visible dropdown menu
|
||||
var textnode = document.createTextNode(OSRM.DEFAULTS.LANGUAGE);
|
||||
var myspan = document.createElement("span");
|
||||
myspan.className = "styled-select";
|
||||
myspan.id = "styled-select" + select.id;
|
||||
myspan.appendChild(textnode);
|
||||
select.parentNode.insertBefore(myspan, select);
|
||||
myspan.style.width = (select.clientWidth-2)+"px";
|
||||
myspan.style.height = (select.clientHeight)+"px";
|
||||
},
|
||||
|
||||
// perform language change
|
||||
setLanguage: function(language) {
|
||||
if( OSRM.Localization[language]) {
|
||||
OSRM.Localization.current_language = language;
|
||||
// update selector
|
||||
if( select = document.getElementById('gui-language-toggle') ) { // yes, = not == !
|
||||
var option = select.getElementsByTagName("option");
|
||||
select.value = language;
|
||||
for(var i = 0; i < option.length; i++)
|
||||
if(option[i].selected == true) {
|
||||
document.getElementById("styled-select" + select.id).childNodes[0].nodeValue = option[i].childNodes[0].nodeValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// change gui language
|
||||
OSRM.GUI.setLabels();
|
||||
// requery data
|
||||
if( OSRM.G.markers == null )
|
||||
return;
|
||||
if( OSRM.G.markers.route.length > 1)
|
||||
OSRM.Routing.getRoute();
|
||||
else if(OSRM.G.markers.route.length > 0 && document.getElementById('information-box').innerHTML != "" ) {
|
||||
OSRM.Geocoder.call( OSRM.C.SOURCE_LABEL, document.getElementById("gui-input-source").value );
|
||||
OSRM.Geocoder.call( OSRM.C.TARGET_LABEL, document.getElementById("gui-input-target").value );
|
||||
} else {
|
||||
OSRM.Geocoder.updateAddress(OSRM.C.SOURCE_LABEL, false);
|
||||
OSRM.Geocoder.updateAddress(OSRM.C.TARGET_LABEL, false);
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
}
|
||||
} else if(OSRM.DEFAULTS.LANUGAGE_ONDEMAND_RELOADING==true) {
|
||||
var supported_languages = OSRM.DEFAULTS.LANGUAGE_SUPPORTED;
|
||||
for(var i=0, size=supported_languages.length; i<size; i++) {
|
||||
if( supported_languages[i].encoding == language) {
|
||||
var script = document.createElement('script');
|
||||
script.type = 'text/javascript';
|
||||
script.src = OSRM.DEFAULTS.LANGUAGE_FILES_DIRECTORY + "OSRM.Locale."+language+".js";
|
||||
document.head.appendChild(script);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// if existing, return localized string -> English string -> input string
|
||||
translate: function(text) {
|
||||
if( OSRM.Localization[OSRM.Localization.current_language] && OSRM.Localization[OSRM.Localization.current_language][text] )
|
||||
return OSRM.Localization[OSRM.Localization.current_language][text];
|
||||
else if( OSRM.Localization[OSRM.DEFAULTS.LANGUAGE] && OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text] )
|
||||
return OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text];
|
||||
else
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
// shorter call to translate function
|
||||
OSRM.loc = OSRM.Localization.translate;
|
||||
@@ -18,25 +18,19 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
/* OSRM CSS styles */
|
||||
|
||||
|
||||
/* map -> fullscreen */
|
||||
body {
|
||||
/* fullscreen map */
|
||||
html, body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
html, body, #map {
|
||||
height: 100%;
|
||||
}
|
||||
#map {
|
||||
height: 100%;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
|
||||
/* styles for gui */
|
||||
.vquad
|
||||
{
|
||||
height:10px;
|
||||
}
|
||||
|
||||
/* general styles for gui boxes */
|
||||
.gui-wrapper
|
||||
{
|
||||
position:absolute;
|
||||
@@ -63,11 +57,13 @@ html, body, #map {
|
||||
padding:5px;
|
||||
}
|
||||
|
||||
|
||||
/* styles for specific gui boxes */
|
||||
#main-wrapper
|
||||
{
|
||||
width:410px;
|
||||
height:95%;
|
||||
top:5px;
|
||||
bottom:25px;
|
||||
left:5px;
|
||||
}
|
||||
#main-input
|
||||
@@ -78,10 +74,9 @@ html, body, #map {
|
||||
#main-output
|
||||
{
|
||||
width:390px;
|
||||
top:220px;
|
||||
top:220px; /* main-input.height+2*gui-box.margin+2*gui-box.padding */
|
||||
bottom:0px;
|
||||
}
|
||||
|
||||
#blob-wrapper
|
||||
{
|
||||
left:-5px;
|
||||
@@ -96,66 +91,102 @@ html, body, #map {
|
||||
-webkit-border-bottom-left-radius:0px;
|
||||
visibility:hidden;
|
||||
}
|
||||
#blob-input
|
||||
#blob-content
|
||||
{
|
||||
width:26px;
|
||||
height:26px;
|
||||
width:16px;
|
||||
height:16px;
|
||||
border-top-left-radius:0px;
|
||||
border-bottom-left-radius:0px;
|
||||
-moz-border-radius-topleft:0px;
|
||||
-moz-border-radius-bottomleft:0px;
|
||||
-webkit-border-top-left-radius:0px;
|
||||
-webkit-border-bottom-left-radius:0px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
.main-toggle-out
|
||||
|
||||
/* styles for main-input areas */
|
||||
#input-mask-header
|
||||
{
|
||||
cursor:pointer;
|
||||
position:absolute;
|
||||
right:5px;
|
||||
top:5px;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-image:url("images/cancel.png");
|
||||
left:0px;
|
||||
right:0px;
|
||||
top:0px;
|
||||
height:50px;
|
||||
background-repeat:no-repeat;
|
||||
background-position:center;
|
||||
background-image:url("images/osrm-logo.png");
|
||||
}
|
||||
.main-toggle-out:hover
|
||||
#input-mask
|
||||
{
|
||||
background-image:url("images/cancel_hover.png");
|
||||
margin:3px;
|
||||
}
|
||||
.main-toggle-out:active
|
||||
#input-mask-options
|
||||
{
|
||||
background-image:url("images/cancel_active.png");
|
||||
}
|
||||
.main-toggle-in
|
||||
{
|
||||
cursor:pointer;
|
||||
position:absolute;
|
||||
right:5px;
|
||||
top:5px;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-image:url("images/restore.png");
|
||||
}
|
||||
.main-toggle-in:hover
|
||||
{
|
||||
background-image:url("images/restore_hover.png");
|
||||
}
|
||||
.main-toggle-in:active
|
||||
{
|
||||
background-image:url("images/restore_active.png");
|
||||
margin:3px;
|
||||
}
|
||||
|
||||
.main-options
|
||||
|
||||
/* styles for main-input input-mask-header */
|
||||
#gui-language-toggle
|
||||
{
|
||||
font-size:10px;
|
||||
position:absolute;
|
||||
border: 0px;
|
||||
text-decoration:none;
|
||||
opacity: 0;
|
||||
filter: alpha(opacity=0);
|
||||
z-index: 5;
|
||||
}
|
||||
#options-toggle
|
||||
|
||||
.styled-select
|
||||
{
|
||||
position:absolute;
|
||||
background: url("images/selector.png");
|
||||
background-repeat:no-repeat;
|
||||
background-position: top right;
|
||||
padding: 1px 1px 1px 1px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.top-left-button
|
||||
{
|
||||
float:left;
|
||||
}
|
||||
.top-right-button
|
||||
{
|
||||
float:right;
|
||||
}
|
||||
|
||||
|
||||
/* styles for main-input input-mask */
|
||||
.input-marker
|
||||
{
|
||||
display:table-row;
|
||||
}
|
||||
.input-marker > div
|
||||
{
|
||||
padding-bottom:4px;
|
||||
}
|
||||
.input-label
|
||||
{
|
||||
margin:0px 2px 0px 0px;
|
||||
}
|
||||
.input-delete
|
||||
{
|
||||
margin:0px 15px 0px 8px;
|
||||
visibility:hidden;
|
||||
}
|
||||
.input-box
|
||||
{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* styles for main-input input-mask-options */
|
||||
#gui-options-toggle
|
||||
{
|
||||
cursor:pointer;
|
||||
color:#0000ff
|
||||
}
|
||||
#options-toggle:hover
|
||||
#gui-options-toggle:hover
|
||||
{
|
||||
color:#ff0000
|
||||
}
|
||||
@@ -164,111 +195,92 @@ html, body, #map {
|
||||
visibility:hidden;
|
||||
}
|
||||
|
||||
#osrm-logo
|
||||
{
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
text-align:center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.input-box
|
||||
/* styles for main-output areas */
|
||||
#information-box-header
|
||||
{
|
||||
width: 250px;
|
||||
margin:5px;
|
||||
height:60px;
|
||||
}
|
||||
|
||||
|
||||
.full
|
||||
{
|
||||
width:100%;
|
||||
}
|
||||
.right
|
||||
{
|
||||
text-align:right;
|
||||
}
|
||||
.center
|
||||
{
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
#information-box
|
||||
{
|
||||
position:absolute;
|
||||
bottom:15px;
|
||||
top:60px;
|
||||
bottom:20px;
|
||||
top:65px;
|
||||
width:380px;
|
||||
font-size:12px;
|
||||
overflow:auto;
|
||||
margin:5px;
|
||||
}
|
||||
|
||||
.route-summary
|
||||
#legal-notice
|
||||
{
|
||||
font-size: 12px;
|
||||
position:absolute;
|
||||
right:0px;
|
||||
bottom:0px;
|
||||
margin:5px;
|
||||
}
|
||||
#gpx-link
|
||||
|
||||
|
||||
/* styles for information-box-header */
|
||||
.header-title
|
||||
{
|
||||
font-weight:bold;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.header-content
|
||||
{
|
||||
font-weight:normal;
|
||||
}
|
||||
.result-link
|
||||
{
|
||||
color:#0000ff;
|
||||
text-decoration:none;
|
||||
cursor:pointer;
|
||||
}
|
||||
#gpx-link:hover
|
||||
.result-link:hover
|
||||
{
|
||||
color:#ff0000;
|
||||
}
|
||||
|
||||
|
||||
/* style for information-box table (search results, driving directions) */
|
||||
.results-table
|
||||
{
|
||||
border-spacing:0px;
|
||||
width:100%;
|
||||
}
|
||||
.results-odd
|
||||
{
|
||||
background-color: #FAF3E9; //#ffffff;
|
||||
background-color: #FFFDE3;
|
||||
}
|
||||
.results-even
|
||||
{
|
||||
background-color: #F2DE9C; //#ffffe0;
|
||||
background-color: #FFF9BB;
|
||||
}
|
||||
.result-counter
|
||||
{
|
||||
text-align:right;
|
||||
vertical-align: top;
|
||||
width:30px;
|
||||
vertical-align:top;
|
||||
font-weight:bold;
|
||||
padding-left:5px;
|
||||
padding-right:5px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
padding:1px 5px 1px 5px;
|
||||
}
|
||||
.result-items
|
||||
{
|
||||
text-align:left;
|
||||
vertical-align: middle;
|
||||
width:100%;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
padding:1px;
|
||||
}
|
||||
.result-direction
|
||||
.result-directions
|
||||
{
|
||||
width:30px;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
text-align:left;
|
||||
vertical-align: middle;
|
||||
padding:1px 5px 1px 5px;
|
||||
}
|
||||
.result-distance
|
||||
{
|
||||
text-align:right;
|
||||
vertical-align: middle;
|
||||
width:30px;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
vertical-align: middle;
|
||||
padding:1px 1px 1px 5px;
|
||||
}
|
||||
.result-item
|
||||
{
|
||||
@@ -279,18 +291,134 @@ html, body, #map {
|
||||
{
|
||||
color:#ff0000
|
||||
}
|
||||
|
||||
#legal-notice
|
||||
.no-results
|
||||
{
|
||||
position:absolute;
|
||||
right:0px;
|
||||
bottom:0px;
|
||||
padding:5px;
|
||||
font-size:10px;
|
||||
text-align:center;
|
||||
margin:28px;
|
||||
}
|
||||
|
||||
|
||||
/* buttons */
|
||||
.button
|
||||
{
|
||||
cursor:pointer;
|
||||
padding:2px 10px 2px 10px;
|
||||
border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
background-color:#EEEEEE;
|
||||
border:1px solid #999999;
|
||||
color:#333333;
|
||||
text-decoration:none;
|
||||
font-size:9px;
|
||||
outline-style:none;
|
||||
vertical-align:1px;
|
||||
}
|
||||
.button:hover
|
||||
{
|
||||
background-color:#F9F9F9;
|
||||
color:#000000;
|
||||
}
|
||||
.button:active
|
||||
{
|
||||
background-color:#F4F4F4;
|
||||
color:#FF0000;
|
||||
}
|
||||
|
||||
|
||||
/* iconic buttons */
|
||||
.iconic-button
|
||||
{
|
||||
cursor:pointer;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-repeat:no-repeat;
|
||||
background-position:center;
|
||||
}
|
||||
|
||||
#gui-toggle-out
|
||||
{
|
||||
background-image:url("images/cancel.png");
|
||||
}
|
||||
#gui-toggle-out:hover
|
||||
{
|
||||
background-image:url("images/cancel_hover.png");
|
||||
}
|
||||
#gui-toggle-out:active
|
||||
{
|
||||
background-image:url("images/cancel_active.png");
|
||||
}
|
||||
|
||||
#gui-toggle-in
|
||||
{
|
||||
background-image:url("images/restore.png");
|
||||
}
|
||||
#gui-toggle-in:hover
|
||||
{
|
||||
background-image:url("images/restore_hover.png");
|
||||
}
|
||||
#gui-toggle-in:active
|
||||
{
|
||||
background-image:url("images/restore_active.png");
|
||||
}
|
||||
|
||||
#gui-printer
|
||||
{
|
||||
background-image:url("images/printer.png");
|
||||
}
|
||||
#gui-printer:hover
|
||||
{
|
||||
background-image:url("images/printer_hover.png");
|
||||
}
|
||||
#gui-printer:active
|
||||
{
|
||||
background-image:url("images/printer_active.png");
|
||||
}
|
||||
|
||||
.delete-marker
|
||||
{
|
||||
background-image:url("images/cancel.png");
|
||||
}
|
||||
.delete-marker:hover
|
||||
{
|
||||
background-image:url("images/cancel_hover.png");
|
||||
}
|
||||
.delete-marker:active
|
||||
{
|
||||
background-image:url("images/cancel_active.png");
|
||||
}
|
||||
|
||||
|
||||
/* fonts */
|
||||
.base-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.big-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.medium-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 10.5px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.small-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 9px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
|
||||
/* utility styles (defined above buttons, so that buttons retain cursor:pointer)*/
|
||||
.quad
|
||||
{
|
||||
min-width:10px;
|
||||
min-height:10px;
|
||||
}
|
||||
|
||||
.not-selectable
|
||||
{
|
||||
cursor:default;
|
||||
@@ -309,28 +437,31 @@ html, body, #map {
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
.checkbox-label
|
||||
{
|
||||
vertical-align:2px;
|
||||
}
|
||||
|
||||
/* buttons */
|
||||
.button
|
||||
.full
|
||||
{
|
||||
cursor:pointer;
|
||||
padding:2px 10px 2px 10px;
|
||||
border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
background-color:#EEEEEE;
|
||||
border:1px solid #999999;
|
||||
color:#333333;
|
||||
text-decoration:none;
|
||||
font-size:11px;
|
||||
outline-style:none;
|
||||
display:table;
|
||||
width:100%;
|
||||
}
|
||||
.button:hover
|
||||
.left
|
||||
{
|
||||
background-color:#F9F9F9;
|
||||
color:#000000;
|
||||
display:table-cell;
|
||||
text-align:left;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.button:active
|
||||
.right
|
||||
{
|
||||
background-color:#F4F4F4;
|
||||
color:#FF0000;
|
||||
display:table-cell;
|
||||
text-align:right;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.center
|
||||
{
|
||||
display:table-cell;
|
||||
text-align:center;
|
||||
vertical-align:middle;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
|
||||
<!--
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@@ -17,7 +17,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
|
||||
<!-- head -->
|
||||
@@ -30,7 +30,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
<meta name="author" content="Dennis Schieferdecker" />
|
||||
|
||||
<!-- favicon -->
|
||||
<link rel="shortcut icon" href="images/osrm-favicon.ico" type="image/x-icon" />
|
||||
<link rel="shortcut icon" href="" type="image/x-icon" id="favicon"/>
|
||||
|
||||
<!-- stylesheets -->
|
||||
<link rel="stylesheet" href="leaflet/leaflet.css" type="text/css"/>
|
||||
@@ -39,88 +39,115 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
|
||||
<!-- scripts -->
|
||||
<script src="leaflet/leaflet-src.js" type="text/javascript"></script>
|
||||
<script src="L.Bugfixes.js" type="text/javascript"></script>
|
||||
<script src="L.DashedPolyline.js" type="text/javascript"></script>
|
||||
<script src="L.MouseMarker.js" type="text/javascript"></script>
|
||||
<script src="L.SwitchableIcon.js" type="text/javascript"></script>
|
||||
|
||||
<script src="OSRM.base.js" type="text/javascript"></script>
|
||||
<script src="OSRM.config.js" type="text/javascript"></script>
|
||||
<!-- <script defer="defer" src="OSRM.debug.js" type="text/javascript"></script> -->
|
||||
<script src="main.js" type="text/javascript"></script>
|
||||
|
||||
<script src="OSRM.Browser.js" type="text/javascript"></script>
|
||||
<script src="OSRM.GUI.js" type="text/javascript"></script>
|
||||
<script src="OSRM.JSONP.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Markers.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Route.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Localization.js" type="text/javascript"></script>
|
||||
|
||||
<script src="main.js" type="text/javascript"></script>
|
||||
<script src="routing.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Map.js" type="text/javascript"></script>
|
||||
<script src="OSRM.GUI.js" type="text/javascript"></script>
|
||||
<script src="routing/OSRM.Routing.js" type="text/javascript"></script>
|
||||
<script src="routing/OSRM.RoutingDescription.js" type="text/javascript"></script>
|
||||
<script src="routing/OSRM.RoutingGeometry.js" type="text/javascript"></script>
|
||||
<script src="routing/OSRM.RoutingGUI.js" type="text/javascript"></script>
|
||||
<script src="routing/OSRM.RoutingNoNames.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Via.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Geocoder.js" type="text/javascript"></script>
|
||||
|
||||
<script src="geocoder.js" type="text/javascript"></script>
|
||||
<script src="via.js" type="text/javascript"></script>
|
||||
|
||||
<script src="utils.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Browser.js" type="text/javascript"></script>
|
||||
<script src="OSRM.JSONP.js" type="text/javascript"></script>
|
||||
<script src="localization/OSRM.Localization.js" type="text/javascript"></script>
|
||||
<script src="printing/OSRM.Printing.js" type="text/javascript"></script>
|
||||
<script src="OSRM.Utils.js" type="text/javascript"></script>
|
||||
</head>
|
||||
|
||||
|
||||
<!-- body -->
|
||||
<body onload="init();">
|
||||
<body class="base-font not-selectable">
|
||||
|
||||
<!--map-->
|
||||
<div id="map"></div>
|
||||
|
||||
<!-- show ui blob -->
|
||||
<div id="blob-wrapper" class="gui-wrapper">
|
||||
<div id="blob-input" class="gui-box">
|
||||
<div class="main-toggle-in" onclick="OSRM.GUI.toggleMain()"></div>
|
||||
<div id="blob-content" class="gui-box">
|
||||
<div id="gui-toggle-in" class="iconic-button"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- show main gui -->
|
||||
<div id="main-wrapper" class="gui-wrapper">
|
||||
<div id="main-wrapper" class="gui-wrapper not-selectable">
|
||||
|
||||
<!-- input box -->
|
||||
<div class="gui-box not-selectable" id="main-input">
|
||||
<div class="main-toggle-out" onclick="OSRM.GUI.toggleMain()"></div>
|
||||
<img id="osrm-logo" alt="OSRM Logo" src="images/osrm-logo.png" />
|
||||
|
||||
<div id="main-input" class="gui-box">
|
||||
<!-- header -->
|
||||
<div id="input-mask-header">
|
||||
<div id="gui-toggle-out" class="iconic-button top-right-button"></div>
|
||||
</div>
|
||||
|
||||
<!-- input mask -->
|
||||
<div id="input-mask">
|
||||
|
||||
<!-- source/target input -->
|
||||
<table class="full">
|
||||
<tr>
|
||||
<td id="gui-search-source-label">Start:</td>
|
||||
<td><input id="input-source-name" class="input-box" type="text" maxlength="200" value="" title="Startposition eingeben" onchange="inputChanged(OSRM.C.SOURCE_LABEL);" /></td>
|
||||
<td class="right"><a class="button not-selectable" id="gui-search-source" onclick="showMarker('source')">Zeigen</a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td id="gui-search-target-label">Ende:</td>
|
||||
<td><input id="input-target-name" class="input-box" type="text" maxlength="200" value="" title="Zielposition eingeben" onchange="inputChanged(OSRM.C.TARGET_LABEL);" /></td>
|
||||
<td class="right"><a class="button not-selectable" id="gui-search-target" onclick="showMarker('target');">Zeigen</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="full">
|
||||
<div id="input-source" class="input-marker">
|
||||
<div class="left"><span id="gui-search-source-label" class="input-label">Start:</span></div>
|
||||
<div class="center input-box"><input id="gui-input-source" class="input-box" type="text" maxlength="200" value="" title="Startposition eingeben" /></div>
|
||||
<div class="left"><div id="gui-delete-source" class="iconic-button delete-marker input-delete"></div></div>
|
||||
<div class="right"><a class="button" id="gui-search-source">Zeigen</a></div>
|
||||
</div>
|
||||
<div id="input-target" class="input-marker">
|
||||
<div class="left"><span id="gui-search-target-label" class="input-label">Ende:</span></div>
|
||||
<div class="center input-box"><input id="gui-input-target" class="input-box" type="text" maxlength="200" value="" title="Zielposition eingeben" /></div>
|
||||
<div class="left"><div id="gui-delete-target" class="iconic-button delete-marker input-delete"></div></div>
|
||||
<div class="right"><a class="button" id="gui-search-target">Zeigen</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="quad"></div>
|
||||
|
||||
<!-- action buttons -->
|
||||
<div class="vquad"></div>
|
||||
<table style="width:100%">
|
||||
<tr>
|
||||
<td> <a class="button not-selectable" id="gui-reset" onclick="resetRouting();">Reset</a></td>
|
||||
<td class="right"> <a class="button not-selectable" id="gui-reverse" onclick="reverseRouting();">Umdrehen</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- options -->
|
||||
<div class="vquad"></div>
|
||||
<div class="main-options not-selectable" id="options-toggle" onclick="OSRM.GUI.toggleOptions()">Options</div>
|
||||
<div class="main-options not-selectable" id="options-box">
|
||||
<input type="checkbox" id="option-highlight-nonames" name="main-options" value="highlight-nonames" onclick="getRoute(OSRM.C.FULL_DESCRIPTION)" /><span id="gui-option-highlight-nonames-label">Unbenannte Straßen hervorheben</span>
|
||||
<div class="full">
|
||||
<div class="left"><a class="button" id="gui-reset">Reset</a></div>
|
||||
<div class="right"><a class="button" id="gui-reverse">Umdrehen</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="quad"></div>
|
||||
|
||||
<!-- options -->
|
||||
<div id="input-mask-options">
|
||||
|
||||
<!-- option toggle -->
|
||||
<span id="gui-options-toggle" class="small-font">Kartenwerkzeuge</span>
|
||||
|
||||
<!-- actual options -->
|
||||
<div id="options-box" class="full">
|
||||
<div class="left">
|
||||
<input type="checkbox" id="option-highlight-nonames" value="highlight-nonames" />
|
||||
<span id="gui-option-highlight-nonames-label" class="checkbox-label small-font">Unbenannte Straßen hervorheben</span>
|
||||
</div>
|
||||
<div class="right">
|
||||
<a class="button" id="open-josm">JOSM</a>
|
||||
<a class="button" id="open-osmbugs">OSM Bugs</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- output box -->
|
||||
<div class="gui-box not-selectable" id="main-output">
|
||||
<div id="information-box-headline"></div>
|
||||
<div id="main-output" class="gui-box">
|
||||
<div id="information-box-header"></div>
|
||||
<div id="information-box"></div>
|
||||
<div id="legal-notice">GUI2 v0.1.1 120316 - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a></div>
|
||||
<div id="legal-notice" class="small-font">GUI2 - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -16,166 +16,99 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM initialization
|
||||
// [initialization of maps, local strings, image prefetching]
|
||||
|
||||
// will hold the Leaflet map object
|
||||
OSRM.GLOBALS.map = null;
|
||||
// [initialization, image prefetching]
|
||||
|
||||
|
||||
// onload initialization routine
|
||||
function init() {
|
||||
prefetchImages();
|
||||
prefetchIcons();
|
||||
OSRM.init = function() {
|
||||
OSRM.prefetchImages();
|
||||
OSRM.prefetchIcons();
|
||||
|
||||
initLocale();
|
||||
initMap();
|
||||
initRouting();
|
||||
|
||||
// check if the URL contains some GET parameter, e.g. for the route
|
||||
checkURL();
|
||||
}
|
||||
OSRM.Localization.init();
|
||||
OSRM.GUI.init();
|
||||
OSRM.Map.init();
|
||||
//OSRM.Printing.init();
|
||||
OSRM.Routing.init();
|
||||
|
||||
// check if the URL contains some GET parameter, e.g. for showing a route
|
||||
OSRM.parseParameters();
|
||||
};
|
||||
|
||||
|
||||
// prefetch images
|
||||
OSRM.images = Array();
|
||||
function prefetchImages() {
|
||||
var images = [ 'images/marker-source.png',
|
||||
'images/marker-target.png',
|
||||
'images/marker-via.png',
|
||||
'images/marker-highlight.png',
|
||||
'images/cancel.png',
|
||||
'images/cancel_active.png',
|
||||
'images/cancel_hover.png',
|
||||
'images/restore.png',
|
||||
'images/restore_active.png',
|
||||
'images/restore_hover.png'
|
||||
];
|
||||
|
||||
for(var i=0; i<images.length; i++) {
|
||||
OSRM.images[i] = new Image();
|
||||
OSRM.images[i].src = images[i];
|
||||
OSRM.GLOBALS.images = {};
|
||||
OSRM.prefetchImages = function() {
|
||||
var image_list = [ {id:'marker-shadow', url:L.ROOT_URL + 'images/marker-shadow.png'},
|
||||
{id:'marker-source', url:'images/marker-source.png'},
|
||||
{id:'marker-target', url:'images/marker-target.png'},
|
||||
{id:'marker-via', url:'images/marker-via.png'},
|
||||
{id:'marker-highlight', url:'images/marker-highlight.png'},
|
||||
{id:'marker-source-drag', url:'images/marker-source-drag.png'},
|
||||
{id:'marker-target-drag', url:'images/marker-target-drag.png'},
|
||||
{id:'marker-via-drag', url:'images/marker-via-drag.png'},
|
||||
{id:'marker-highlight-drag', url:'images/marker-highlight-drag.png'},
|
||||
{id:'marker-drag', url:'images/marker-drag.png'},
|
||||
{id:'cancel', url:'images/cancel.png'},
|
||||
{id:'cancel_active', url:'images/cancel_active.png'},
|
||||
{id:'cancel_hover', url:'images/cancel_hover.png'},
|
||||
{id:'restore', url:'images/restore.png'},
|
||||
{id:'restore_active', url:'images/restore_active.png'},
|
||||
{id:'restore_hover', url:'images/restore_hover.png'},
|
||||
{id:'printer', url:'images/printer.png'},
|
||||
{id:'printer_active', url:'images/printer_active.png'},
|
||||
{id:'printer_hover', url:'images/printer_hover.png'},
|
||||
{id:'printer_inactive', url:'images/printer_inactive.png'},
|
||||
{id:'direction_0', url:'images/default.png'},
|
||||
{id:'direction_1', url:'images/continue.png'},
|
||||
{id:'direction_2', url:'images/slight-right.png'},
|
||||
{id:'direction_3', url:'images/turn-right.png'},
|
||||
{id:'direction_4', url:'images/sharp-right.png'},
|
||||
{id:'direction_5', url:'images/u-turn.png'},
|
||||
{id:'direction_6', url:'images/slight-left.png'},
|
||||
{id:'direction_7', url:'images/turn-left.png'},
|
||||
{id:'direction_8', url:'images/sharp-left.png'},
|
||||
{id:'direction_11', url:'images/round-about.png'},
|
||||
{id:'direction_15', url:'images/target.png'},
|
||||
{id:'favicon', url:'images/osrm-favicon.ico'}
|
||||
];
|
||||
|
||||
for(var i=0; i<image_list.length; i++) {
|
||||
OSRM.G.images[image_list[i].id] = new Image();
|
||||
OSRM.G.images[image_list[i].id].src = image_list[i].url;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// prefetch icons
|
||||
OSRM.icons = Array();
|
||||
function prefetchIcons() {
|
||||
var images = [ 'marker-source',
|
||||
'marker-target',
|
||||
'marker-via',
|
||||
'marker-highlight',
|
||||
OSRM.GLOBALS.icons = {};
|
||||
OSRM.prefetchIcons = function() {
|
||||
var icon_list = [ {id:'marker-source', image_id:'marker-source'},
|
||||
{id:'marker-target', image_id:'marker-target'},
|
||||
{id:'marker-via', image_id:'marker-via'},
|
||||
{id:'marker-highlight', image_id:'marker-highlight'},
|
||||
{id:'marker-source-drag', image_id:'marker-source-drag'},
|
||||
{id:'marker-target-drag', image_id:'marker-target-drag'},
|
||||
{id:'marker-via-drag', image_id:'marker-via-drag'},
|
||||
{id:'marker-highlight-drag', image_id:'marker-highlight-drag'}
|
||||
//{id:'marker-drag', image_id:'marker-drag'} // special treatment because of size
|
||||
];
|
||||
|
||||
for(var i=0; i<images.length; i++)
|
||||
OSRM.icons[images[i]] = new L.Icon('images/'+images[i]+'.png');
|
||||
}
|
||||
|
||||
|
||||
// init localization
|
||||
function initLocale() {
|
||||
document.getElementById("gui-reset").innerHTML = OSRM.loc("GUI_RESET");
|
||||
document.getElementById("gui-reverse").innerHTML = OSRM.loc("GUI_REVERSE");
|
||||
document.getElementById("gui-option-highlight-nonames-label").innerHTML = OSRM.loc("GUI_HIGHLIGHT_UNNAMED_ROADS");
|
||||
document.getElementById("options-toggle").innerHTML = OSRM.loc("GUI_OPTIONS");
|
||||
document.getElementById("gui-search-source").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||
document.getElementById("gui-search-target").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||
document.getElementById("gui-search-source-label").innerHTML = OSRM.loc("GUI_START")+":";
|
||||
document.getElementById("gui-search-target-label").innerHTML = OSRM.loc("GUI_END")+":";
|
||||
document.getElementById("input-source-name").title = OSRM.loc("GUI_START_TOOLTIP");
|
||||
document.getElementById("input-target-name").title = OSRM.loc("GUI_END_TOOLTIP");
|
||||
document.getElementById("legal-notice").innerHTML = OSRM.loc("GUI_LEGAL_NOTICE");
|
||||
for(var i=0; i<icon_list.length; i++) {
|
||||
var icon = {
|
||||
iconUrl: OSRM.G.images[icon_list[i].image_id].src, iconSize: new L.Point(25, 41), iconAnchor: new L.Point(13, 41),
|
||||
shadowUrl: OSRM.G.images["marker-shadow"].src, shadowSize: new L.Point(41, 41),
|
||||
popupAnchor: new L.Point(0, -33)
|
||||
};
|
||||
OSRM.G.icons[icon_list[i].id] = new L.SwitchableIcon(icon);
|
||||
}
|
||||
|
||||
document.getElementById('input-source-name').value = OSRM.DEFAULTS.ONLOAD_SOURCE;
|
||||
document.getElementById('input-target-name').value = OSRM.DEFAULTS.ONLOAD_TARGET;
|
||||
}
|
||||
// special values for drag marker
|
||||
OSRM.G.icons['marker-drag'] = new L.SwitchableIcon( {iconUrl: OSRM.G.images["marker-drag"].src, iconSize: new L.Point(18, 18) } );
|
||||
};
|
||||
|
||||
|
||||
// centering on geolocation
|
||||
function callbak_centerOnGeolocation( position ) {
|
||||
OSRM.G.map.setView( new L.LatLng( position.coords.latitude, position.coords.longitude), OSRM.DEFAULTS.ZOOM_LEVEL);
|
||||
}
|
||||
function centerOnGeolocation() {
|
||||
if (navigator.geolocation)
|
||||
navigator.geolocation.getCurrentPosition( callbak_centerOnGeolocation );
|
||||
}
|
||||
|
||||
|
||||
// init map
|
||||
function initMap() {
|
||||
// setup tile servers
|
||||
var osmorgURL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
osmorgAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||
osmorgOptions = {maxZoom: 18, attribution: osmorgAttribution};
|
||||
|
||||
var osmdeURL = 'http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
|
||||
osmdeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||
osmdeOptions = {maxZoom: 18, attribution: osmdeAttribution};
|
||||
|
||||
var mapquestURL = 'http://otile{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png',
|
||||
mapquestAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 MapQuest',
|
||||
mapquestOptions = {maxZoom: 18, attribution: mapquestAttribution, subdomains: '1234'};
|
||||
|
||||
var cloudmadeURL = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png',
|
||||
cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
|
||||
cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution};
|
||||
|
||||
var osmorg = new L.TileLayer(osmorgURL, osmorgOptions),
|
||||
osmde = new L.TileLayer(osmdeURL, osmdeOptions),
|
||||
mapquest = new L.TileLayer(mapquestURL, mapquestOptions),
|
||||
cloudmade = new L.TileLayer(cloudmadeURL, cloudmadeOptions);
|
||||
|
||||
// setup map
|
||||
OSRM.G.map = new L.Map('map', {
|
||||
center: new L.LatLng(51.505, -0.09),
|
||||
zoom: 13,
|
||||
zoomAnimation: false, // false: removes animations and hiding of routes during zoom
|
||||
fadeAnimation: false,
|
||||
layers: [osmorg]
|
||||
});
|
||||
|
||||
// add tileservers
|
||||
var baseMaps = {
|
||||
"osm.org": osmorg,
|
||||
"osm.de": osmde,
|
||||
"MapQuest": mapquest,
|
||||
"CloudMade": cloudmade
|
||||
};
|
||||
|
||||
var overlayMaps = {};
|
||||
var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
|
||||
OSRM.G.map.addControl(layersControl);
|
||||
|
||||
// move zoom markers
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left="420px";
|
||||
getElementsByClassName(document,'leaflet-control-zoom')[0].style.top="5px";
|
||||
|
||||
// initial map position and zoom
|
||||
OSRM.G.map.setView( new L.LatLng( OSRM.DEFAULTS.ONLOAD_LATITUDE, OSRM.DEFAULTS.ONLOAD_LONGITUDE), OSRM.DEFAULTS.ZOOM_LEVEL);
|
||||
OSRM.G.map.on('zoomend', function(e) { getRoute(OSRM.C.FULL_DESCRIPTION); });
|
||||
OSRM.G.map.on('contextmenu', function(e) {});
|
||||
|
||||
// click on map to set source and target nodes
|
||||
OSRM.G.map.on('click', function(e) {
|
||||
if( !OSRM.G.markers.hasSource() ) {
|
||||
var index = OSRM.G.markers.setSource( e.latlng );
|
||||
updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||
getRoute( OSRM.C.FULL_DESCRIPTION );
|
||||
} else if( !OSRM.G.markers.hasTarget() ) {
|
||||
var index = OSRM.G.markers.setTarget( e.latlng );
|
||||
updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||
getRoute( OSRM.C.FULL_DESCRIPTION );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
|
||||
// parse URL GET parameters if any exist
|
||||
function checkURL(){
|
||||
//parse URL GET parameters
|
||||
OSRM.parseParameters = function(){
|
||||
var called_url = document.location.search.substr(1,document.location.search.length);
|
||||
|
||||
// reject messages that are clearly too long or too small
|
||||
@@ -183,11 +116,7 @@ function checkURL(){
|
||||
return;
|
||||
|
||||
// storage for parameter values
|
||||
var positions = [];
|
||||
var zoom = null;
|
||||
var center = null;
|
||||
var destination = null;
|
||||
var destination_name = null;
|
||||
var params = {};
|
||||
|
||||
// parse input
|
||||
var splitted_url = called_url.split('&');
|
||||
@@ -195,72 +124,87 @@ function checkURL(){
|
||||
var name_val = splitted_url[i].split('=');
|
||||
if(name_val.length!=2)
|
||||
continue;
|
||||
|
||||
if(name_val[0] == 'loc') {
|
||||
|
||||
if(name_val[0] == 'hl') {
|
||||
OSRM.Localization.setLanguage(name_val[1]);
|
||||
}
|
||||
else if(name_val[0] == 'loc') {
|
||||
var coordinates = unescape(name_val[1]).split(',');
|
||||
if(coordinates.length!=2 || !isLatitude(coordinates[0]) || !isLongitude(coordinates[1]) )
|
||||
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||
return;
|
||||
positions.push ( new L.LatLng( coordinates[0], coordinates[1]) );
|
||||
params.positions = params.positions || [];
|
||||
params.positions.push ( new L.LatLng( coordinates[0], coordinates[1]) );
|
||||
}
|
||||
else if(name_val[0] == 'dest') {
|
||||
var coordinates = unescape(name_val[1]).split(',');
|
||||
if(coordinates.length!=2 || !isLatitude(coordinates[0]) || !isLongitude(coordinates[1]) )
|
||||
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||
return;
|
||||
destination = new L.LatLng( coordinates[0], coordinates[1]);
|
||||
params.destination = new L.LatLng( coordinates[0], coordinates[1]);
|
||||
}
|
||||
else if(name_val[0] == 'destname') {
|
||||
destination_name = decodeURI(name_val[1]).replace(/<\/?[^>]+(>|$)/g ,""); // discard tags
|
||||
params.destination_name = decodeURI(name_val[1]).replace(/<\/?[^>]+(>|$)/g ,""); // discard tags
|
||||
}
|
||||
else if(name_val[0] == 'z') {
|
||||
zoom = name_val[1];
|
||||
if( zoom<0 || zoom > 18)
|
||||
var zoom_level = Number(name_val[1]);
|
||||
if( zoom_level<0 || zoom_level > 18)
|
||||
return;
|
||||
params.zoom = zoom;
|
||||
}
|
||||
else if(name_val[0] == 'center') {
|
||||
var coordinates = unescape(name_val[1]).split(',');
|
||||
if(coordinates.length!=2 || !isLatitude(coordinates[0]) || !isLongitude(coordinates[1]) )
|
||||
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||
return;
|
||||
center = new L.LatLng( coordinates[0], coordinates[1]);
|
||||
params.center = new L.LatLng( coordinates[0], coordinates[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// case 1: destination given
|
||||
if( destination != undefined ) {
|
||||
var index = OSRM.G.markers.setTarget( e.latlng );
|
||||
if( destination_name == null )
|
||||
updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
if( params.destination ) {
|
||||
var index = OSRM.G.markers.setTarget( params.destination.latlng );
|
||||
if( params.destination_name )
|
||||
document.getElementById("gui-input-target").value = params.destination_name;
|
||||
else
|
||||
document.getElementById("input-target-name").value = destination_name;
|
||||
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
OSRM.G.markers.route[index].show();
|
||||
OSRM.G.markers.route[index].centerView();
|
||||
return;
|
||||
}
|
||||
|
||||
// case 2: locations given
|
||||
if( positions != []) {
|
||||
if( params.positions ) {
|
||||
// draw via points
|
||||
if( positions.length > 0) {
|
||||
OSRM.G.markers.setSource( positions[0] );
|
||||
updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
if( params.positions.length > 0 ) {
|
||||
OSRM.G.markers.setSource( params.positions[0] );
|
||||
OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
}
|
||||
if(positions.length > 1) {
|
||||
OSRM.G.markers.setTarget( positions[positions.length-1] );
|
||||
updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
if( params.positions.length > 1 ) {
|
||||
OSRM.G.markers.setTarget( params.positions[params.positions.length-1] );
|
||||
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||
}
|
||||
for(var i=1; i<positions.length-1;i++)
|
||||
OSRM.G.markers.setVia( i-1, positions[i] );
|
||||
for(var i=1; i<params.positions.length-1;i++)
|
||||
OSRM.G.markers.setVia( i-1, params.positions[i] );
|
||||
for(var i=0; i<OSRM.G.markers.route.length;i++)
|
||||
OSRM.G.markers.route[i].show();
|
||||
|
||||
// center on route (support for old links) / move to given view (new behaviour)
|
||||
if(zoom == null || center == null) {
|
||||
var bounds = new L.LatLngBounds( positions );
|
||||
OSRM.G.map.fitBounds( bounds );
|
||||
if( params.zoom == null || params.center == null ) {
|
||||
var bounds = new L.LatLngBounds( params.positions );
|
||||
OSRM.G.map.fitBoundsUI( bounds );
|
||||
} else {
|
||||
OSRM.G.map.setView(center, zoom);
|
||||
OSRM.G.map.setView(params.center, params.zoom);
|
||||
}
|
||||
|
||||
// compute route
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
OSRM.Routing.getRoute();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// default case: do nothing
|
||||
};
|
||||
|
||||
|
||||
// onload event
|
||||
if(document.addEventListener) // FF, CH
|
||||
document.addEventListener("DOMContentLoaded", OSRM.init, false);
|
||||
else if(document.attachEvent)
|
||||
document.attachEvent("onreadystatechange", function() { if ( document.readyState === "interactive" ) OSRM.init(); });
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM printer
|
||||
// [printing support]
|
||||
|
||||
OSRM.Printing = {
|
||||
|
||||
init: function() {
|
||||
var icon = document.createElement('div');
|
||||
icon.id = "gui-printer";
|
||||
icon.className = "iconic-button top-right-button";
|
||||
|
||||
var spacer = document.createElement('div');
|
||||
spacer.className = "quad top-right-button";
|
||||
|
||||
var input_mask_header = document.getElementById('input-mask-header');
|
||||
input_mask_header.appendChild(spacer,input_mask_header.lastChild);
|
||||
input_mask_header.appendChild(icon,input_mask_header.lastChild);
|
||||
|
||||
document.getElementById("gui-printer").onclick = OSRM.Printing.print;
|
||||
},
|
||||
|
||||
windowLoaded: function(){
|
||||
OSRM.Printing.show( OSRM.G.response );
|
||||
OSRM.printwindow.focus();
|
||||
},
|
||||
|
||||
show: function(response) {
|
||||
// create header
|
||||
header =
|
||||
'<div class="full">' +
|
||||
'<div class="left">' +
|
||||
'<div class="header-title base-font">' + OSRM.loc("ROUTE_DESCRIPTION") + '</div>' +
|
||||
'<div class="header-content">' + OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance) + '</div>' +
|
||||
'<div class="header-content">' + OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time) + '</div>' +
|
||||
'</div>' +
|
||||
'<div class="right">' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
|
||||
// create route description
|
||||
var route_desc = '';
|
||||
route_desc += '<table id="thetable" class="results-table medium-font">';
|
||||
route_desc += '<thead style="display:table-header-group;"><tr><td colspan="3">'+header+'</td></tr></thead>';
|
||||
route_desc += '</thead>';
|
||||
route_desc += '<tbody stlye="display:table-row-group">';
|
||||
|
||||
for(var i=0; i < response.route_instructions.length; i++){
|
||||
//odd or even ?
|
||||
var rowstyle='results-odd';
|
||||
if(i%2==0) { rowstyle='results-even'; }
|
||||
|
||||
route_desc += '<tr class="'+rowstyle+'">';
|
||||
|
||||
route_desc += '<td class="result-directions">';
|
||||
route_desc += '<img width="18px" src="'+OSRM.RoutingDescription.getDrivingInstructionIcon(response.route_instructions[i][0])+'" alt="" />';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-items">';
|
||||
route_desc += '<div class="result-item">';
|
||||
|
||||
// build route description
|
||||
if( i == 0 )
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"$1").replace(/%s/, OSRM.loc(response.route_instructions[i][6]) );
|
||||
else if( response.route_instructions[i][1] != "" )
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"$1").replace(/%s/, response.route_instructions[i][1]);
|
||||
else
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"");
|
||||
|
||||
route_desc += '</div>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-distance">';
|
||||
if( i != response.route_instructions.length-1 )
|
||||
route_desc += '<b>'+OSRM.Utils.metersToDistance(response.route_instructions[i][2])+'</b>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += "</tr>";
|
||||
}
|
||||
route_desc += '</tbody>';
|
||||
route_desc += '</table>';
|
||||
|
||||
// put everything in DOM
|
||||
OSRM.printwindow.document.getElementById('description').innerHTML = route_desc;
|
||||
|
||||
// init map
|
||||
var map = OSRM.printwindow.initialize();
|
||||
var markers = OSRM.G.markers.route;
|
||||
map.addLayer( new L.MouseMarker( markers[0].getPosition(), {draggable:false,clickable:false,icon:OSRM.G.icons['marker-source']} ) );
|
||||
for(var i=1, size=markers.length-1; i<size; i++)
|
||||
map.addLayer( new L.MouseMarker( markers[i].getPosition(), {draggable:false,clickable:false,icon:OSRM.G.icons['marker-via']} ) );
|
||||
map.addLayer( new L.MouseMarker( markers[markers.length-1].getPosition(), {draggable:false,clickable:false,icon:OSRM.G.icons['marker-target']} ));
|
||||
var route = new L.DashedPolyline();
|
||||
route.setLatLngs( OSRM.G.route.getPositions() );
|
||||
route.setStyle( {dashed:false,clickable:false,color:'#0033FF', weight:5} );
|
||||
map.addLayer( route );
|
||||
var bounds = new L.LatLngBounds( OSRM.G.route.getPositions() );
|
||||
map.fitBounds( bounds );
|
||||
},
|
||||
|
||||
// react to click
|
||||
print: function() {
|
||||
OSRM.printwindow = window.open("printing/printing.html","","width=540,height=500,left=100,top=100,dependent=yes,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes");
|
||||
OSRM.printwindow.addEventListener("DOMContentLoaded", OSRM.Printing.windowLoaded, false);
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
/* OSRM CSS styles for printing*/
|
||||
|
||||
/* page setup */
|
||||
body
|
||||
{
|
||||
margin: 8px;
|
||||
}
|
||||
|
||||
|
||||
/* route description box */
|
||||
#description
|
||||
{
|
||||
width:500px;
|
||||
margin:5px;
|
||||
}
|
||||
|
||||
|
||||
/* route map box */
|
||||
#map
|
||||
{
|
||||
width:500px;
|
||||
height:500px;
|
||||
margin:5px;
|
||||
}
|
||||
|
||||
|
||||
/* styles for information-box-header */
|
||||
div.header-title
|
||||
{
|
||||
font-weight:bold;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.header-content
|
||||
{
|
||||
font-weight:normal;
|
||||
}
|
||||
.result-link
|
||||
{
|
||||
color:#0000ff;
|
||||
text-decoration:none;
|
||||
cursor:pointer;
|
||||
}
|
||||
.result-link:hover
|
||||
{
|
||||
color:#ff0000;
|
||||
}
|
||||
|
||||
|
||||
/* style for information-box table (search results, driving directions) */
|
||||
.results-table
|
||||
{
|
||||
border-spacing:0px;
|
||||
width:100%;
|
||||
}
|
||||
.results-odd
|
||||
{
|
||||
background-color: #FFFDE3;
|
||||
}
|
||||
.results-even
|
||||
{
|
||||
background-color: #FFF9BB;
|
||||
}
|
||||
.result-counter
|
||||
{
|
||||
text-align:right;
|
||||
vertical-align:top;
|
||||
font-weight:bold;
|
||||
padding:1px 5px 1px 5px;
|
||||
}
|
||||
.result-items
|
||||
{
|
||||
text-align:left;
|
||||
vertical-align: middle;
|
||||
width:100%;
|
||||
padding:1px;
|
||||
}
|
||||
.result-directions
|
||||
{
|
||||
text-align:left;
|
||||
vertical-align: middle;
|
||||
padding:1px 5px 1px 5px;
|
||||
}
|
||||
.result-distance
|
||||
{
|
||||
text-align:right;
|
||||
vertical-align: middle;
|
||||
padding:1px 1px 1px 5px;
|
||||
}
|
||||
.result-item
|
||||
{
|
||||
cursor:pointer;
|
||||
color:#000000
|
||||
}
|
||||
.no-results
|
||||
{
|
||||
text-align:center;
|
||||
margin:28px;
|
||||
}
|
||||
|
||||
|
||||
/* header area */
|
||||
#printing-header
|
||||
{
|
||||
left:0px;
|
||||
right:0px;
|
||||
top:0px;
|
||||
height:20px;
|
||||
}
|
||||
.top-left-button
|
||||
{
|
||||
float:left;
|
||||
}
|
||||
.top-right-button
|
||||
{
|
||||
float:right;
|
||||
}
|
||||
|
||||
|
||||
/* utility styles */
|
||||
@media print {
|
||||
.quad
|
||||
{
|
||||
page-break-before:always;
|
||||
}
|
||||
}
|
||||
@media screen {
|
||||
.quad
|
||||
{
|
||||
min-width:10px;
|
||||
min-height:10px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* iconic buttons */
|
||||
.iconic-button
|
||||
{
|
||||
cursor:pointer;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-repeat:no-repeat;
|
||||
background-position:center;
|
||||
}
|
||||
|
||||
#gui-printer
|
||||
{
|
||||
background-image:url("../images/printer.png");
|
||||
}
|
||||
#gui-printer:hover
|
||||
{
|
||||
background-image:url("../images/printer_hover.png");
|
||||
}
|
||||
#gui-printer:active
|
||||
{
|
||||
background-image:url("../images/printer_active.png");
|
||||
}
|
||||
|
||||
|
||||
/* fonts */
|
||||
@media print {
|
||||
|
||||
.base-font {
|
||||
font-family: Times New Roman, Times, serif;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.big-font {
|
||||
font-family: Times New Roman, Times, serif;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.medium-font {
|
||||
font-family: Times New Roman, Times, serif;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.small-font {
|
||||
font-family: Times New Roman, Times, serif;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen {
|
||||
.base-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.big-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.medium-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 10.5px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.small-font {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 9px;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
|
||||
<!--
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
-->
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
|
||||
<!-- head -->
|
||||
<head>
|
||||
|
||||
<!-- metatags -->
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>OSRM Website</title>
|
||||
<meta name="description" content="OSRM Website"/>
|
||||
<meta name="author" content="Dennis Schieferdecker" />
|
||||
|
||||
<!-- favicon -->
|
||||
<link rel="shortcut icon" href="../images/osrm-favicon.ico" type="image/x-icon" />
|
||||
|
||||
<!-- stylesheets -->
|
||||
<link rel="stylesheet" href="../leaflet/leaflet.css" type="text/css"/>
|
||||
<!--[if lte IE 8]><link rel="stylesheet" href="../leaflet/leaflet.ie.css" type="text/css"/><![endif]-->
|
||||
<link rel="stylesheet" href="printing.css" type="text/css"/>
|
||||
|
||||
<!-- scripts -->
|
||||
<script src="../leaflet/leaflet-src.js" type="text/javascript"></script>
|
||||
|
||||
<script>
|
||||
function initialize() {
|
||||
// setup events
|
||||
document.getElementById('gui-printer').onclick= printsite;
|
||||
|
||||
// setup map
|
||||
var osmorgURL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
osmorgOptions = {maxZoom: 18};
|
||||
var osmorg = new L.TileLayer(osmorgURL, osmorgOptions);
|
||||
var temp1 = new L.Map("map", {
|
||||
center: new L.LatLng(51.505, -0.09),
|
||||
zoom: 13,
|
||||
zoomAnimation: false,
|
||||
fadeAnimation: false,
|
||||
layers: [osmorg],
|
||||
attributionControl: false,
|
||||
zoomControl: false,
|
||||
dragging:false,
|
||||
scrollWheelZoom:false,
|
||||
touchZoom:false,
|
||||
doubleClickZoom:false
|
||||
});
|
||||
return temp1;
|
||||
}
|
||||
|
||||
function printsite() {
|
||||
window.print();
|
||||
}
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<!-- body -->
|
||||
<body class="base-font">
|
||||
|
||||
<!-- header -->
|
||||
<div id="printing-header">
|
||||
<div id="gui-printer" class="iconic-button top-right-button"></div>
|
||||
</div>
|
||||
|
||||
<!--description-->
|
||||
<div id="description"></div>
|
||||
|
||||
<!--map-->
|
||||
<div class="quad"></div>
|
||||
<div class="header-title">Übersichtskarte</div>
|
||||
<div id="map"></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
/* OSRM CSS styles for printing*/
|
||||
|
||||
|
||||
/* printer button */
|
||||
.printer-inactive
|
||||
{
|
||||
cursor:pointer;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-image:url("../images/printer_inactive.png");
|
||||
}
|
||||
.printer
|
||||
{
|
||||
cursor:pointer;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background-image:url("../images/printer.png");
|
||||
}
|
||||
.printer:hover
|
||||
{
|
||||
background-image:url("../images/printer_hover.png");
|
||||
}
|
||||
.printer:active
|
||||
{
|
||||
background-image:url("../images/printer_active.png");
|
||||
}
|
||||
|
||||
/* route summary */
|
||||
.route-summary
|
||||
{
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* route description box */
|
||||
#description
|
||||
{
|
||||
position:absolute;
|
||||
bottom:15px;
|
||||
top:60px;
|
||||
width:380px;
|
||||
font-size:12px;
|
||||
margin:5px;
|
||||
}
|
||||
.results-table
|
||||
{
|
||||
border-spacing:0px;
|
||||
}
|
||||
.results-odd
|
||||
{
|
||||
background-color: #FAF3E9; //#ffffff;
|
||||
}
|
||||
.results-even
|
||||
{
|
||||
background-color: #F2DE9C; //#ffffe0;
|
||||
}
|
||||
.result-items
|
||||
{
|
||||
text-align:left;
|
||||
vertical-align: middle;
|
||||
width:100%;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
}
|
||||
.result-direction
|
||||
{
|
||||
width:30px;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
}
|
||||
.result-distance
|
||||
{
|
||||
text-align:right;
|
||||
vertical-align: middle;
|
||||
width:30px;
|
||||
padding-left:1px;
|
||||
padding-right:1px;
|
||||
padding-top:1px;
|
||||
padding-bottom:1px;
|
||||
}
|
||||
.result-item
|
||||
{
|
||||
cursor:pointer;
|
||||
color:#000000
|
||||
}
|
||||
@@ -1,490 +0,0 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing routines
|
||||
// [management of routing/direction requests and processing of responses]
|
||||
// [TODO: major refactoring scheduled]
|
||||
|
||||
// some variables
|
||||
OSRM.GLOBALS.route = null;
|
||||
OSRM.GLOBALS.markers = null;
|
||||
|
||||
OSRM.CONSTANTS.NO_DESCRIPTION = 0;
|
||||
OSRM.CONSTANTS.FULL_DESCRIPTION = 1;
|
||||
|
||||
OSRM.G.dragging = null;
|
||||
OSRM.GLOBALS.dragid = null;
|
||||
OSRM.GLOBALS.pending = false;
|
||||
OSRM.GLOBALS.pendingTimer = null;
|
||||
|
||||
|
||||
// init routing data structures
|
||||
function initRouting() {
|
||||
OSRM.G.route = new OSRM.Route();
|
||||
OSRM.G.markers = new OSRM.Markers();
|
||||
}
|
||||
|
||||
|
||||
// -- JSONP processing --
|
||||
|
||||
// process JSONP response of routing server
|
||||
function timeoutRouteSimple() {
|
||||
showNoRouteGeometry();
|
||||
showNoRouteDescription();
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("TIMED_OUT")+".<p>";
|
||||
}
|
||||
function timeoutRoute() {
|
||||
showNoRouteGeometry();
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
showNoRouteDescription();
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("TIMED_OUT")+".<p>";
|
||||
}
|
||||
function showRouteSimple(response) {
|
||||
if(!response)
|
||||
return;
|
||||
|
||||
if( !OSRM.G.dragging ) // prevent simple routing when no longer dragging
|
||||
return;
|
||||
|
||||
if( response.status == 207) {
|
||||
showNoRouteGeometry();
|
||||
showNoRouteDescription();
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".<p>";
|
||||
} else {
|
||||
showRouteGeometry(response);
|
||||
showRouteDescriptionSimple(response);
|
||||
}
|
||||
updateHints(response);
|
||||
|
||||
// // TODO: hack to process final drag event, if it was fenced, but we are still dragging (alternative approach)
|
||||
// if(OSRM.G.pending) {
|
||||
// clearTimeout(OSRM.G.pendingTimer);
|
||||
// OSRM.G.pendingTimer = setTimeout(timeoutDrag,100);
|
||||
// }
|
||||
}
|
||||
function showRoute(response) {
|
||||
if(!response)
|
||||
return;
|
||||
|
||||
if(response.status == 207) {
|
||||
showNoRouteGeometry();
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
showNoRouteDescription();
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_ROUTE_FOUND")+".<p>";
|
||||
} else {
|
||||
showRouteGeometry(response);
|
||||
showRouteNonames(response);
|
||||
showRouteDescription(response);
|
||||
snapRoute();
|
||||
}
|
||||
updateHints(response);
|
||||
}
|
||||
|
||||
|
||||
// show route geometry
|
||||
function showNoRouteGeometry() {
|
||||
var positions = [];
|
||||
for(var i=0; i<OSRM.G.markers.route.length;i++)
|
||||
positions.push( OSRM.G.markers.route[i].getPosition() );
|
||||
|
||||
OSRM.G.route.showRoute(positions, OSRM.Route.NOROUTE);
|
||||
}
|
||||
function showRouteGeometry(response) {
|
||||
OSRM.G.via_points = response.via_points.slice(0);
|
||||
|
||||
var geometry = decodeRouteGeometry(response.route_geometry, 5);
|
||||
|
||||
var points = [];
|
||||
for( var i=0; i < geometry.length; i++) {
|
||||
points.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
}
|
||||
OSRM.G.route.showRoute(points, OSRM.Route.ROUTE);
|
||||
}
|
||||
|
||||
|
||||
// route description display (and helper functions)
|
||||
function onClickRouteDescription(geometry_index) {
|
||||
var positions = OSRM.G.route.getPositions();
|
||||
|
||||
OSRM.G.markers.highlight.setPosition( positions[geometry_index] );
|
||||
OSRM.G.markers.highlight.show();
|
||||
OSRM.G.markers.highlight.centerView(OSRM.DEFAULTS.HIGHLIGHT_ZOOM_LEVEL);
|
||||
}
|
||||
function onClickCreateShortcut(src){
|
||||
src += '&z='+ OSRM.G.map.getZoom() + '¢er=' + OSRM.G.map.getCenter().lat + ',' + OSRM.G.map.getCenter().lng;
|
||||
OSRM.JSONP.call(OSRM.DEFAULTS.HOST_SHORTENER_URL+src, showRouteLink, showRouteLink_TimeOut, 2000, 'shortener');
|
||||
document.getElementById('route-prelink').innerHTML = '['+OSRM.loc("GENERATE_LINK_TO_ROUTE")+']';
|
||||
}
|
||||
function showRouteLink(response){
|
||||
document.getElementById('route-prelink').innerHTML = '[<a id="gpx-link" class = "text-selectable" href="' +response.ShortURL+ '">'+response.ShortURL+'</a>]';
|
||||
}
|
||||
function showRouteLink_TimeOut(){
|
||||
document.getElementById('route-prelink').innerHTML = '['+OSRM.loc("LINK_TO_ROUTE_TIMEOUT")+']';
|
||||
}
|
||||
function showRouteDescription(response) {
|
||||
// compute query string
|
||||
var query_string = '?rebuild=1';
|
||||
for(var i=0; i<OSRM.G.markers.route.length; i++)
|
||||
query_string += '&loc=' + OSRM.G.markers.route[i].getLat() + ',' + OSRM.G.markers.route[i].getLng();
|
||||
|
||||
// create link to the route
|
||||
var route_link ='<span class="route-summary" id="route-prelink">[<a id="gpx-link" onclick="onClickCreateShortcut(\'' + OSRM.DEFAULTS.WEBSITE_URL + query_string + '\')">'+OSRM.loc("GET_LINK_TO_ROUTE")+'</a>]</span>';
|
||||
|
||||
// create GPX link
|
||||
var gpx_link = '<span class="route-summary">[<a id="gpx-link" onClick="document.location.href=\'' + OSRM.DEFAULTS.HOST_ROUTING_URL + query_string + '&output=gpx\';">'+OSRM.loc("GPX_FILE")+'</a>]</span>';
|
||||
|
||||
// create route description
|
||||
var route_desc = "";
|
||||
route_desc += '<table class="results-table">';
|
||||
|
||||
for(var i=0; i < response.route_instructions.length; i++){
|
||||
//odd or even ?
|
||||
var rowstyle='results-odd';
|
||||
if(i%2==0) { rowstyle='results-even'; }
|
||||
|
||||
route_desc += '<tr class="'+rowstyle+'">';
|
||||
|
||||
route_desc += '<td class="result-directions">';
|
||||
route_desc += '<img width="18px" src="images/'+getDirectionIcon(response.route_instructions[i][0])+'"/>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-items">';
|
||||
route_desc += '<span class="result-item" onclick="onClickRouteDescription('+response.route_instructions[i][3]+')">';
|
||||
route_desc += response.route_instructions[i][0];
|
||||
if( i == 0 )
|
||||
route_desc += ' ' + OSRM.loc( response.route_instructions[i][6] );
|
||||
if( response.route_instructions[i][1] != "" ) {
|
||||
route_desc += ' on ';
|
||||
route_desc += '<b>' + response.route_instructions[i][1] + '</b>';
|
||||
}
|
||||
//route_desc += ' for ';
|
||||
route_desc += '</span>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-distance">';
|
||||
if( i != response.route_instructions.length-1 )
|
||||
route_desc += '<b>'+getDistanceWithUnit(response.route_instructions[i][2])+'</b>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += "</tr>";
|
||||
}
|
||||
|
||||
route_desc += '</table>';
|
||||
headline = "";
|
||||
headline += OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||
headline += '<div style="float:left;width:40%">';
|
||||
headline += "<span class='route-summary'>"
|
||||
+ OSRM.loc("DISTANCE")+": " + getDistanceWithUnit(response.route_summary.total_distance)
|
||||
+ "<br>"
|
||||
+ OSRM.loc("DURATION")+": " + secondsToTime(response.route_summary.total_time)
|
||||
+ "</span>";
|
||||
headline += '</div>';
|
||||
headline += '<div style="float:left;text-align:right;width:60%;">'+route_link+'<br>'+gpx_link+'</div>';
|
||||
|
||||
var output = "";
|
||||
output += route_desc;
|
||||
|
||||
document.getElementById('information-box-headline').innerHTML = headline;
|
||||
document.getElementById('information-box').innerHTML = output;
|
||||
}
|
||||
function showRouteDescriptionSimple(response) {
|
||||
headline = OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||
headline += "<span class='route-summary'>"
|
||||
+ OSRM.loc("DISTANCE")+": " + getDistanceWithUnit(response.route_summary.total_distance)
|
||||
+ "<br>"
|
||||
+ OSRM.loc("DURATION")+": " + secondsToTime(response.route_summary.total_time)
|
||||
+ "</span>";
|
||||
headline += '<br><br>';
|
||||
|
||||
document.getElementById('information-box-headline').innerHTML = headline;
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".<p>";
|
||||
}
|
||||
function showNoRouteDescription() {
|
||||
headline = OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||
headline += "<span class='route-summary'>"
|
||||
+ OSRM.loc("DISTANCE")+": N/A"
|
||||
+ "<br>"
|
||||
+ OSRM.loc("DURATION")+": N/A"
|
||||
+ "</span>";
|
||||
headline += '<br><br>';
|
||||
|
||||
document.getElementById('information-box-headline').innerHTML = headline;
|
||||
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".<p>";
|
||||
}
|
||||
|
||||
|
||||
// unnamed streets display
|
||||
function showRouteNonames(response) {
|
||||
// do not display unnamed streets?
|
||||
if( document.getElementById('option-highlight-nonames').checked == false) {
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
return;
|
||||
}
|
||||
|
||||
// mark geometry positions where unnamed/named streets switch
|
||||
var named = [];
|
||||
for (var i = 0; i < response.route_instructions.length; i++) {
|
||||
if( response.route_instructions[i][1] == '' )
|
||||
named[ response.route_instructions[i][3] ] = false; // no street name
|
||||
else
|
||||
named[ response.route_instructions[i][3] ] = true; // yes street name
|
||||
}
|
||||
|
||||
// aggregate geometry for unnamed streets
|
||||
var geometry = decodeRouteGeometry(response.route_geometry, 5);
|
||||
var is_named = true;
|
||||
var current_positions = [];
|
||||
var all_positions = [];
|
||||
for( var i=0; i < geometry.length; i++) {
|
||||
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
|
||||
// still named/unnamed?
|
||||
if( (named[i] == is_named || named[i] == undefined) && i != geometry.length-1 )
|
||||
continue;
|
||||
|
||||
// switch between named/unnamed!
|
||||
if(is_named == false)
|
||||
all_positions.push( current_positions );
|
||||
current_positions = [];
|
||||
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
is_named = named[i];
|
||||
}
|
||||
|
||||
// display unnamed streets
|
||||
OSRM.G.route.showUnnamedRoute(all_positions);
|
||||
}
|
||||
|
||||
|
||||
//-- main function --
|
||||
|
||||
// generate server calls to query routes
|
||||
function getRoute(do_description) {
|
||||
|
||||
// if source or target are not set -> hide route
|
||||
if( OSRM.G.markers.route.length < 2 ) {
|
||||
OSRM.G.route.hideRoute();
|
||||
return;
|
||||
}
|
||||
|
||||
// prepare JSONP call
|
||||
var type = null;
|
||||
var callback = null;
|
||||
var timeout = null;
|
||||
|
||||
var source = OSRM.DEFAULTS.HOST_ROUTING_URL;
|
||||
source += '?z=' + OSRM.G.map.getZoom() + '&output=json' + '&geomformat=cmp';
|
||||
if(OSRM.G.markers.checksum)
|
||||
source += '&checksum=' + OSRM.G.markers.checksum;
|
||||
for(var i=0; i<OSRM.G.markers.route.length; i++) {
|
||||
source += '&loc=' + OSRM.G.markers.route[i].getLat() + ',' + OSRM.G.markers.route[i].getLng();
|
||||
if( OSRM.G.markers.route[i].hint)
|
||||
source += '&hint=' + OSRM.G.markers.route[i].hint;
|
||||
}
|
||||
|
||||
// decide whether it is a dragging call or a normal one
|
||||
if (do_description) {
|
||||
callback = showRoute;
|
||||
timeout = timeoutRoute;
|
||||
source +='&instructions=true';
|
||||
type = 'route';
|
||||
} else {
|
||||
callback = showRouteSimple;
|
||||
timeout = timeoutRouteSimple;
|
||||
source +='&instructions=false';
|
||||
type = 'dragging';
|
||||
}
|
||||
|
||||
// do call
|
||||
var called = OSRM.JSONP.call(source, callback, timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, type);
|
||||
|
||||
// TODO: hack to process final drag event, if it was fenced, but we are still dragging
|
||||
if(called == false && !do_description) {
|
||||
clearTimeout(OSRM.G.pendingTimer);
|
||||
OSRM.G.pendingTimer = setTimeout(timeoutDrag,OSRM.DEFAULTS.JSONP_TIMEOUT);
|
||||
}
|
||||
else {
|
||||
clearTimeout(OSRM.G.pendingTimer);
|
||||
}
|
||||
// // TODO: hack to process final drag event, if it was fenced, but we are still dragging (alternative approach)
|
||||
// if(called == false && !do_description) {
|
||||
// OSRM.G.pending = true;
|
||||
// } else {
|
||||
// clearTimeout(OSRM.G.pendingTimer);
|
||||
// OSRM.G.pending = false;
|
||||
// }
|
||||
}
|
||||
function timeoutDrag() {
|
||||
OSRM.G.markers.route[OSRM.G.dragid].hint = null;
|
||||
getRoute(OSRM.C.NO_DESCRIPTION);
|
||||
}
|
||||
|
||||
|
||||
//-- helper functions --
|
||||
|
||||
//decode compressed route geometry
|
||||
function decodeRouteGeometry(encoded, precision) {
|
||||
precision = Math.pow(10, -precision);
|
||||
var len = encoded.length, index=0, lat=0, lng = 0, array = [];
|
||||
while (index < len) {
|
||||
var b, shift = 0, result = 0;
|
||||
do {
|
||||
b = encoded.charCodeAt(index++) - 63;
|
||||
result |= (b & 0x1f) << shift;
|
||||
shift += 5;
|
||||
} while (b >= 0x20);
|
||||
var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||
lat += dlat;
|
||||
shift = 0;
|
||||
result = 0;
|
||||
do {
|
||||
b = encoded.charCodeAt(index++) - 63;
|
||||
result |= (b & 0x1f) << shift;
|
||||
shift += 5;
|
||||
} while (b >= 0x20);
|
||||
var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||
lng += dlng;
|
||||
array.push([lat * precision, lng * precision]);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
// update hints of all markers
|
||||
function updateHints(response) {
|
||||
var hint_locations = response.hint_data.locations;
|
||||
OSRM.G.markers.checksum = response.hint_data.checksum;
|
||||
for(var i=0; i<hint_locations.length; i++)
|
||||
OSRM.G.markers.route[i].hint = hint_locations[i];
|
||||
}
|
||||
|
||||
// snap all markers to the received route
|
||||
function snapRoute() {
|
||||
var positions = OSRM.G.route.getPositions();
|
||||
|
||||
OSRM.G.markers.route[0].setPosition( positions[0] );
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].setPosition( positions[positions.length-1] );
|
||||
for(var i=0; i<OSRM.G.via_points.length; i++)
|
||||
OSRM.G.markers.route[i+1].setPosition( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||
|
||||
updateAddress(OSRM.C.SOURCE_LABEL);
|
||||
updateAddress(OSRM.C.TARGET_LABEL);
|
||||
}
|
||||
|
||||
// map driving instructions to icons
|
||||
// [TODO: better implementation, language-safe]
|
||||
function getDirectionIcon(name) {
|
||||
var directions = {
|
||||
"Turn left":"turn-left.png",
|
||||
"Turn right":"turn-right.png",
|
||||
"U-Turn":"u-turn.png",
|
||||
"Head":"continue.png",
|
||||
"Continue":"continue.png",
|
||||
"Turn slight left":"slight-left.png",
|
||||
"Turn slight right":"slight-right.png",
|
||||
"Turn sharp left":"sharp-left.png",
|
||||
"Turn sharp right":"sharp-right.png",
|
||||
"Enter roundabout and leave at first exit":"round-about.png",
|
||||
"Enter roundabout and leave at second exit":"round-about.png",
|
||||
"Enter roundabout and leave at third exit":"round-about.png",
|
||||
"Enter roundabout and leave at fourth exit":"round-about.png",
|
||||
"Enter roundabout and leave at fifth exit":"round-about.png",
|
||||
"Enter roundabout and leave at sixth exit":"round-about.png",
|
||||
"Enter roundabout and leave at seventh exit":"round-about.png",
|
||||
"Enter roundabout and leave at eighth exit":"round-about.png",
|
||||
"Enter roundabout and leave at nineth exit":"round-about.png",
|
||||
"Enter roundabout and leave at tenth exit":"round-about.png",
|
||||
"Enter roundabout and leave at one of the too many exit":"round-about.png",
|
||||
"You have reached your destination":"target.png"
|
||||
};
|
||||
|
||||
if( directions[name] )
|
||||
return directions[name];
|
||||
else
|
||||
return "default.png";
|
||||
}
|
||||
|
||||
|
||||
// -- gui functions --
|
||||
|
||||
// click: button "reset"
|
||||
function resetRouting() {
|
||||
document.getElementById('input-source-name').value = "";
|
||||
document.getElementById('input-target-name').value = "";
|
||||
|
||||
OSRM.G.route.hideAll();
|
||||
OSRM.G.markers.removeAll();
|
||||
OSRM.G.markers.highlight.hide();
|
||||
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-headline').innerHTML = "";
|
||||
|
||||
OSRM.JSONP.reset();
|
||||
}
|
||||
|
||||
// click: button "reverse"
|
||||
function reverseRouting() {
|
||||
// invert input boxes
|
||||
var tmp = document.getElementById("input-source-name").value;
|
||||
document.getElementById("input-source-name").value = document.getElementById("input-target-name").value;
|
||||
document.getElementById("input-target-name").value = tmp;
|
||||
|
||||
// invert route
|
||||
OSRM.G.markers.route.reverse();
|
||||
if(OSRM.G.markers.route.length == 1) {
|
||||
if(OSRM.G.markers.route[0].label == OSRM.C.TARGET_LABEL) {
|
||||
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-source.png') );
|
||||
} else if(OSRM.G.markers.route[0].label == OSRM.C.SOURCE_LABEL) {
|
||||
OSRM.G.markers.route[0].label = OSRM.C.TARGET_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-target.png') );
|
||||
}
|
||||
} else if(OSRM.G.markers.route.length > 1){
|
||||
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-source.png') );
|
||||
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].label = OSRM.C.TARGET_LABEL;
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].marker.setIcon( new L.Icon('images/marker-target.png') );
|
||||
}
|
||||
|
||||
// recompute route
|
||||
if( OSRM.G.route.isShown() ) {
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
OSRM.G.markers.highlight.hide();
|
||||
} else {
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-headline').innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
// click: button "show"
|
||||
function showMarker(marker_id) {
|
||||
if( OSRM.JSONP.fences["geocoder_source"] || OSRM.JSONP.fences["geocoder_target"] )
|
||||
return;
|
||||
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||
OSRM.G.markers.route[0].centerView();
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].centerView();
|
||||
}
|
||||
|
||||
|
||||
// changed: any inputbox (is called when return is pressed [after] or focus is lost [before])
|
||||
function inputChanged(marker_id) {
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL)
|
||||
callGeocoder(OSRM.C.SOURCE_LABEL, document.getElementById('input-source-name').value);
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL)
|
||||
callGeocoder(OSRM.C.TARGET_LABEL, document.getElementById('input-target-name').value);
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing
|
||||
// [management of routing requests and processing of responses]
|
||||
|
||||
// some variables
|
||||
OSRM.GLOBALS.route = null;
|
||||
OSRM.GLOBALS.markers = null;
|
||||
|
||||
OSRM.GLOBALS.dragging = null;
|
||||
OSRM.GLOBALS.dragid = null;
|
||||
OSRM.GLOBALS.pending = false;
|
||||
OSRM.GLOBALS.pendingTimer = null;
|
||||
|
||||
|
||||
OSRM.Routing = {
|
||||
|
||||
// init routing data structures
|
||||
init: function() {
|
||||
OSRM.G.route = new OSRM.Route();
|
||||
OSRM.G.markers = new OSRM.Markers();
|
||||
},
|
||||
|
||||
|
||||
// -- JSONP processing --
|
||||
|
||||
// process JSONP response of routing server
|
||||
timeoutRouteSimple: function() {
|
||||
OSRM.RoutingGeometry.showNA();
|
||||
OSRM.RoutingDescription.showNA( OSRM.loc("TIMED_OUT") );
|
||||
},
|
||||
timeoutRoute: function() {
|
||||
OSRM.RoutingGeometry.showNA();
|
||||
OSRM.RoutingNoNames.showNA();
|
||||
OSRM.RoutingDescription.showNA( OSRM.loc("TIMED_OUT") );
|
||||
OSRM.Routing._snapRoute();
|
||||
},
|
||||
showRouteSimple: function(response) {
|
||||
if(!response)
|
||||
return;
|
||||
if( !OSRM.G.dragging ) // prevent simple routing when no longer dragging
|
||||
return;
|
||||
|
||||
if( response.status == 207) {
|
||||
OSRM.RoutingGeometry.showNA();
|
||||
OSRM.RoutingDescription.showNA( OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED") );
|
||||
} else {
|
||||
OSRM.RoutingGeometry.show(response);
|
||||
OSRM.RoutingDescription.showSimple(response);
|
||||
}
|
||||
OSRM.Routing._updateHints(response);
|
||||
|
||||
if(OSRM.G.pending)
|
||||
OSRM.G.pendingTimer = setTimeout(OSRM.Routing.draggingTimeout,1);
|
||||
},
|
||||
showRoute: function(response) {
|
||||
if(!response)
|
||||
return;
|
||||
|
||||
OSRM.G.response = response;
|
||||
OSRM.G.via_points = response.via_points.slice(0);
|
||||
if(response.status == 207) {
|
||||
OSRM.RoutingGeometry.showNA();
|
||||
OSRM.RoutingNoNames.showNA();
|
||||
OSRM.RoutingDescription.showNA( OSRM.loc("NO_ROUTE_FOUND") );
|
||||
OSRM.Routing._snapRoute();
|
||||
} else {
|
||||
OSRM.RoutingGeometry.show(response);
|
||||
OSRM.RoutingNoNames.show(response);
|
||||
OSRM.RoutingDescription.show(response);
|
||||
OSRM.Routing._snapRoute();
|
||||
}
|
||||
OSRM.Routing._updateHints(response);
|
||||
},
|
||||
|
||||
|
||||
|
||||
//-- main function --
|
||||
|
||||
//generate server calls to query routes
|
||||
getRoute: function() {
|
||||
|
||||
// if source or target are not set -> hide route
|
||||
if( OSRM.G.markers.route.length < 2 ) {
|
||||
OSRM.G.route.hideRoute();
|
||||
return;
|
||||
}
|
||||
|
||||
OSRM.JSONP.call(OSRM.Routing._buildCall()+'&instructions=true', OSRM.Routing.showRoute, OSRM.Routing.timeoutRoute, OSRM.DEFAULTS.JSONP_TIMEOUT, 'route');
|
||||
},
|
||||
getDragRoute: function() {
|
||||
OSRM.G.pending = !OSRM.JSONP.call(OSRM.Routing._buildCall()+'&instructions=false', OSRM.Routing.showRouteSimple, OSRM.Routing.timeoutRouteSimple, OSRM.DEFAULTS.JSONP_TIMEOUT, 'dragging');;
|
||||
},
|
||||
draggingTimeout: function() {
|
||||
OSRM.G.markers.route[OSRM.G.dragid].hint = null;
|
||||
OSRM.Routing.getDragRoute();
|
||||
},
|
||||
|
||||
_buildCall: function() {
|
||||
var source = OSRM.DEFAULTS.HOST_ROUTING_URL;
|
||||
source += '?z=' + OSRM.G.map.getZoom() + '&output=json&geomformat=cmp';
|
||||
if(OSRM.G.markers.checksum)
|
||||
source += '&checksum=' + OSRM.G.markers.checksum;
|
||||
for(var i=0,size=OSRM.G.markers.route.length; i<size; i++) {
|
||||
source += '&loc=' + OSRM.G.markers.route[i].getLat() + ',' + OSRM.G.markers.route[i].getLng();
|
||||
if( OSRM.G.markers.route[i].hint)
|
||||
source += '&hint=' + OSRM.G.markers.route[i].hint;
|
||||
}
|
||||
return source;
|
||||
},
|
||||
|
||||
|
||||
//-- helper functions --
|
||||
|
||||
// update hints of all markers
|
||||
_updateHints: function(response) {
|
||||
var hint_locations = response.hint_data.locations;
|
||||
OSRM.G.markers.checksum = response.hint_data.checksum;
|
||||
for(var i=0; i<hint_locations.length; i++)
|
||||
OSRM.G.markers.route[i].hint = hint_locations[i];
|
||||
},
|
||||
|
||||
// snap all markers to the received route
|
||||
_snapRoute: function() {
|
||||
var positions = OSRM.G.route.getPositions();
|
||||
|
||||
OSRM.G.markers.route[0].setPosition( positions[0] );
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].setPosition( positions[positions.length-1] );
|
||||
for(var i=0; i<OSRM.G.via_points.length; i++)
|
||||
OSRM.G.markers.route[i+1].setPosition( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||
|
||||
OSRM.Geocoder.updateAddress(OSRM.C.SOURCE_LABEL);
|
||||
OSRM.Geocoder.updateAddress(OSRM.C.TARGET_LABEL);
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,174 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing description
|
||||
// [renders routing description and manages events]
|
||||
|
||||
|
||||
OSRM.RoutingDescription = {
|
||||
|
||||
// route description events
|
||||
onClickRouteDescription: function(geometry_index) {
|
||||
var positions = OSRM.G.route.getPositions();
|
||||
|
||||
OSRM.G.markers.highlight.setPosition( positions[geometry_index] );
|
||||
OSRM.G.markers.highlight.show();
|
||||
OSRM.G.markers.highlight.centerView(OSRM.DEFAULTS.HIGHLIGHT_ZOOM_LEVEL);
|
||||
},
|
||||
onClickCreateShortcut: function(src){
|
||||
src += '&z='+ OSRM.G.map.getZoom() + '¢er=' + OSRM.G.map.getCenter().lat.toFixed(6) + ',' + OSRM.G.map.getCenter().lng.toFixed(6);
|
||||
OSRM.JSONP.call(OSRM.DEFAULTS.HOST_SHORTENER_URL+src, OSRM.RoutingDescription.showRouteLink, OSRM.RoutingDescription.showRouteLink_TimeOut, OSRM.DEFAULTS.JSONP_TIMEOUT, 'shortener');
|
||||
document.getElementById('route-link').innerHTML = '['+OSRM.loc("GENERATE_LINK_TO_ROUTE")+']';
|
||||
},
|
||||
showRouteLink: function(response){
|
||||
document.getElementById('route-link').innerHTML = '[<a class="result-link text-selectable" href="' +response.ShortURL+ '">'+response.ShortURL+'</a>]';
|
||||
},
|
||||
showRouteLink_TimeOut: function(){
|
||||
document.getElementById('route-link').innerHTML = '['+OSRM.loc("LINK_TO_ROUTE_TIMEOUT")+']';
|
||||
},
|
||||
|
||||
// handling of routing description
|
||||
show: function(response) {
|
||||
// compute query string
|
||||
var query_string = '?rebuild=1';
|
||||
for(var i=0; i<OSRM.G.markers.route.length; i++)
|
||||
query_string += '&loc=' + OSRM.G.markers.route[i].getLat().toFixed(6) + ',' + OSRM.G.markers.route[i].getLng().toFixed(6);
|
||||
|
||||
// create link to the route
|
||||
var route_link ='[<a class="result-link" onclick="OSRM.RoutingDescription.onClickCreateShortcut(\'' + OSRM.DEFAULTS.WEBSITE_URL + query_string + '\')">'+OSRM.loc("GET_LINK_TO_ROUTE")+'</a>]';
|
||||
|
||||
// create GPX link
|
||||
var gpx_link = '[<a class="result-link" onClick="document.location.href=\'' + OSRM.DEFAULTS.HOST_ROUTING_URL + query_string + '&output=gpx\';">'+OSRM.loc("GPX_FILE")+'</a>]';
|
||||
|
||||
// create route description
|
||||
var route_desc = "";
|
||||
route_desc += '<table class="results-table medium-font">';
|
||||
|
||||
for(var i=0; i < response.route_instructions.length; i++){
|
||||
//odd or even ?
|
||||
var rowstyle='results-odd';
|
||||
if(i%2==0) { rowstyle='results-even'; }
|
||||
|
||||
route_desc += '<tr class="'+rowstyle+'">';
|
||||
|
||||
route_desc += '<td class="result-directions">';
|
||||
route_desc += '<img width="18px" src="'+OSRM.RoutingDescription.getDrivingInstructionIcon(response.route_instructions[i][0])+'" alt="" />';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-items">';
|
||||
route_desc += '<div class="result-item" onclick="OSRM.RoutingDescription.onClickRouteDescription('+response.route_instructions[i][3]+')">';
|
||||
|
||||
// build route description
|
||||
if( i == 0 )
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"$1").replace(/%s/, OSRM.loc(response.route_instructions[i][6]) );
|
||||
else if( response.route_instructions[i][1] != "" )
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"$1").replace(/%s/, response.route_instructions[i][1]);
|
||||
else
|
||||
route_desc += OSRM.loc(OSRM.RoutingDescription.getDrivingInstruction(response.route_instructions[i][0])).replace(/\[(.*)\]/,"");
|
||||
|
||||
route_desc += '</div>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += '<td class="result-distance">';
|
||||
if( i != response.route_instructions.length-1 )
|
||||
route_desc += '<b>'+OSRM.Utils.metersToDistance(response.route_instructions[i][2])+'</b>';
|
||||
route_desc += "</td>";
|
||||
|
||||
route_desc += "</tr>";
|
||||
}
|
||||
route_desc += '</table>';
|
||||
|
||||
// create header
|
||||
header =
|
||||
'<div class="header-title">' + OSRM.loc("ROUTE_DESCRIPTION") + '</div>' +
|
||||
'<div class="full">' +
|
||||
'<div class="left">' +
|
||||
'<div class="header-content">' + OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance) + '</div>' +
|
||||
'<div class="header-content">' + OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time) + '</div>' +
|
||||
'</div>' +
|
||||
'<div class="right">' +
|
||||
'<div id="route-link" class="header-content">' + route_link + '</div>' +
|
||||
'<div class="header-content">' + gpx_link + '</div>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
|
||||
// update DOM
|
||||
document.getElementById('information-box-header').innerHTML = header;
|
||||
document.getElementById('information-box').innerHTML = route_desc;
|
||||
},
|
||||
|
||||
// simple description
|
||||
showSimple: function(response) {
|
||||
header =
|
||||
'<div class="header-title">' + OSRM.loc("ROUTE_DESCRIPTION") + '</div>' +
|
||||
'<div class="full">' +
|
||||
'<div class="left">' +
|
||||
'<div class="header-content">' + OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance) + '</div>' +
|
||||
'<div class="header-content">' + OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time) + '</div>' +
|
||||
'</div>' +
|
||||
'<div class="right">' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
|
||||
// update DOM
|
||||
document.getElementById('information-box-header').innerHTML = header;
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+"</div>";
|
||||
},
|
||||
|
||||
// no description
|
||||
showNA: function( display_text ) {
|
||||
header =
|
||||
'<div class="header-title">' + OSRM.loc("ROUTE_DESCRIPTION") + '</div>' +
|
||||
'<div class="full">' +
|
||||
'<div class="left">' +
|
||||
'<div class="header-content">' + OSRM.loc("DISTANCE")+": N/A" + '</div>' +
|
||||
'<div class="header-content">' + OSRM.loc("DURATION")+": N/A" + '</div>' +
|
||||
'</div>' +
|
||||
'<div class="right">' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
|
||||
// update DOM
|
||||
document.getElementById('information-box-header').innerHTML = header;
|
||||
document.getElementById('information-box').innerHTML = "<div class='no-results big-font'>"+display_text+"</div>";
|
||||
},
|
||||
|
||||
// retrieve driving instruction icon from instruction id
|
||||
getDrivingInstructionIcon: function(server_instruction_id) {
|
||||
var local_icon_id = "direction_";
|
||||
server_instruction_id = server_instruction_id.replace(/^11-\d{1,}$/,"11"); // dumb check, if there is a roundabout (all have the same icon)
|
||||
local_icon_id += server_instruction_id;
|
||||
|
||||
if( OSRM.G.images[local_icon_id] )
|
||||
return OSRM.G.images[local_icon_id].src;
|
||||
else
|
||||
return OSRM.G.images["direction_0"].src;
|
||||
},
|
||||
|
||||
// retrieve driving instructions from instruction ids
|
||||
getDrivingInstruction: function(server_instruction_id) {
|
||||
var local_instruction_id = "DIRECTION_";
|
||||
server_instruction_id = server_instruction_id.replace(/^11-\d{2,}$/,"11-x"); // dumb check, if there are 10+ exits on a roundabout (say the same for exit 10+)
|
||||
local_instruction_id += server_instruction_id;
|
||||
|
||||
var description = OSRM.loc( local_instruction_id );
|
||||
if( description == local_instruction_id)
|
||||
return OSRM.loc("DIRECTION_0");
|
||||
return description;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing
|
||||
// [handles GUI events]
|
||||
|
||||
|
||||
OSRM.RoutingGUI = {
|
||||
|
||||
// click: button "reset"
|
||||
resetRouting: function() {
|
||||
document.getElementById('gui-input-source').value = "";
|
||||
document.getElementById('gui-input-target').value = "";
|
||||
|
||||
OSRM.G.route.hideAll();
|
||||
OSRM.G.markers.removeAll();
|
||||
OSRM.G.markers.highlight.hide();
|
||||
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
|
||||
OSRM.JSONP.reset();
|
||||
},
|
||||
|
||||
// click: button "reverse"
|
||||
reverseRouting: function() {
|
||||
// invert input boxes
|
||||
var tmp = document.getElementById("gui-input-source").value;
|
||||
document.getElementById("gui-input-source").value = document.getElementById("gui-input-target").value;
|
||||
document.getElementById("gui-input-target").value = tmp;
|
||||
|
||||
// invert route
|
||||
OSRM.G.markers.route.reverse();
|
||||
if(OSRM.G.markers.route.length == 1) {
|
||||
if(OSRM.G.markers.route[0].label == OSRM.C.TARGET_LABEL) {
|
||||
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( OSRM.G.icons['marker-source'] );
|
||||
} else if(OSRM.G.markers.route[0].label == OSRM.C.SOURCE_LABEL) {
|
||||
OSRM.G.markers.route[0].label = OSRM.C.TARGET_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( OSRM.G.icons['marker-target'] );
|
||||
}
|
||||
} else if(OSRM.G.markers.route.length > 1){
|
||||
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||
OSRM.G.markers.route[0].marker.setIcon( OSRM.G.icons['marker-source'] );
|
||||
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].label = OSRM.C.TARGET_LABEL;
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].marker.setIcon( OSRM.G.icons['marker-target'] );
|
||||
}
|
||||
|
||||
// recompute route
|
||||
if( OSRM.G.route.isShown() ) {
|
||||
OSRM.Routing.getRoute();
|
||||
OSRM.G.markers.highlight.hide();
|
||||
} else {
|
||||
document.getElementById('information-box').innerHTML = "";
|
||||
document.getElementById('information-box-header').innerHTML = "";
|
||||
}
|
||||
},
|
||||
|
||||
// click: button "show"
|
||||
showMarker: function(marker_id) {
|
||||
if( OSRM.JSONP.fences["geocoder_source"] || OSRM.JSONP.fences["geocoder_target"] )
|
||||
return;
|
||||
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||
OSRM.G.markers.route[0].centerView();
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||
OSRM.G.markers.route[OSRM.G.markers.route.length-1].centerView();
|
||||
},
|
||||
|
||||
// changed: any inputbox (is called when enter is pressed [after] or focus is lost [before])
|
||||
inputChanged: function(marker_id) {
|
||||
if( marker_id == OSRM.C.SOURCE_LABEL)
|
||||
OSRM.Geocoder.call(OSRM.C.SOURCE_LABEL, document.getElementById('gui-input-source').value);
|
||||
else if( marker_id == OSRM.C.TARGET_LABEL)
|
||||
OSRM.Geocoder.call(OSRM.C.TARGET_LABEL, document.getElementById('gui-input-target').value);
|
||||
},
|
||||
|
||||
// click: button "open JOSM"
|
||||
openJOSM: function() {
|
||||
var x = OSRM.G.map.getCenterUI();
|
||||
var ydelta = 0.01;
|
||||
var xdelta = ydelta * 2;
|
||||
var p = [ 'left=' + (x.lng - xdelta), 'bottom=' + (x.lat - ydelta), 'right=' + (x.lng + xdelta), 'top=' + (x.lat + ydelta)];
|
||||
var url = 'http://localhost:8111/load_and_zoom?' + p.join('&');
|
||||
|
||||
var frame = L.DomUtil.create('iframe', null, document.body);
|
||||
frame.style.width = frame.style.height = "0px";
|
||||
frame.src = url;
|
||||
frame.onload = function(e) { document.body.removeChild(frame); };
|
||||
},
|
||||
|
||||
//click: button "open OSM Bugs"
|
||||
openOSMBugs: function() {
|
||||
var position = OSRM.G.map.getCenterUI();
|
||||
window.open( "http://osmbugs.org/?lat="+position.lat.toFixed(6)+"&lon="+position.lng.toFixed(6)+"&zoom="+OSRM.G.map.getZoom() );
|
||||
},
|
||||
|
||||
//click: button "delete marker"
|
||||
deleteMarker: function(marker_id) {
|
||||
var id = null;
|
||||
if(marker_id == 'source' && OSRM.G.markers.hasSource() )
|
||||
id = 0;
|
||||
else if(marker_id == 'target' && OSRM.G.markers.hasTarget() )
|
||||
id = OSRM.G.markers.route.length-1;
|
||||
if( id == null)
|
||||
return;
|
||||
|
||||
OSRM.G.markers.removeMarker( id );
|
||||
OSRM.Routing.getRoute();
|
||||
OSRM.G.markers.highlight.hide();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing geometry
|
||||
// [renders routing geometry]
|
||||
|
||||
|
||||
OSRM.RoutingGeometry = {
|
||||
|
||||
// show route geometry - if there is a route
|
||||
show: function(response) {
|
||||
var geometry = OSRM.RoutingGeometry._decode(response.route_geometry, 5);
|
||||
|
||||
var positions = [];
|
||||
for( var i=0, size=geometry.length; i < size; i++)
|
||||
positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
|
||||
OSRM.G.route.showRoute(positions, OSRM.Route.ROUTE);
|
||||
},
|
||||
|
||||
//show route geometry - if there is no route
|
||||
showNA: function() {
|
||||
var positions = [];
|
||||
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++)
|
||||
positions.push( OSRM.G.markers.route[i].getPosition() );
|
||||
|
||||
OSRM.G.route.showRoute(positions, OSRM.Route.NOROUTE);
|
||||
},
|
||||
|
||||
//decode compressed route geometry
|
||||
_decode: function(encoded, precision) {
|
||||
precision = Math.pow(10, -precision);
|
||||
var len = encoded.length, index=0, lat=0, lng = 0, array = [];
|
||||
while (index < len) {
|
||||
var b, shift = 0, result = 0;
|
||||
do {
|
||||
b = encoded.charCodeAt(index++) - 63;
|
||||
result |= (b & 0x1f) << shift;
|
||||
shift += 5;
|
||||
} while (b >= 0x20);
|
||||
var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||
lat += dlat;
|
||||
shift = 0;
|
||||
result = 0;
|
||||
do {
|
||||
b = encoded.charCodeAt(index++) - 63;
|
||||
result |= (b & 0x1f) << shift;
|
||||
shift += 5;
|
||||
} while (b >= 0x20);
|
||||
var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||
lng += dlng;
|
||||
array.push([lat * precision, lng * precision]);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// OSRM routing
|
||||
// [renders route segments that are unnamed streets]
|
||||
|
||||
|
||||
OSRM.RoutingNoNames = {
|
||||
|
||||
// displays route segments that are unnamed streets
|
||||
show: function(response) {
|
||||
// do not display unnamed streets?
|
||||
if( document.getElementById('option-highlight-nonames').checked == false) {
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
return;
|
||||
}
|
||||
|
||||
// mark geometry positions where unnamed/named streets switch
|
||||
var named = [];
|
||||
for (var i = 0; i < response.route_instructions.length; i++) {
|
||||
if( response.route_instructions[i][1] == '' )
|
||||
named[ response.route_instructions[i][3] ] = false; // no street name
|
||||
else
|
||||
named[ response.route_instructions[i][3] ] = true; // yes street name
|
||||
}
|
||||
|
||||
// aggregate geometry for unnamed streets
|
||||
var geometry = OSRM.RoutingGeometry._decode(response.route_geometry, 5);
|
||||
var is_named = true;
|
||||
var current_positions = [];
|
||||
var all_positions = [];
|
||||
for( var i=0; i < geometry.length; i++) {
|
||||
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
|
||||
// still named/unnamed?
|
||||
if( (named[i] == is_named || named[i] == undefined) && i != geometry.length-1 )
|
||||
continue;
|
||||
|
||||
// switch between named/unnamed!
|
||||
if(is_named == false)
|
||||
all_positions.push( current_positions );
|
||||
current_positions = [];
|
||||
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||
is_named = named[i];
|
||||
}
|
||||
|
||||
// display unnamed streets
|
||||
OSRM.G.route.showUnnamedRoute(all_positions);
|
||||
},
|
||||
|
||||
showNA: function() {
|
||||
OSRM.G.route.hideUnnamedRoute();
|
||||
}
|
||||
};
|
||||
@@ -1,105 +0,0 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// compatibility tools for old browsers
|
||||
function getElementsByClassName(node, classname) {
|
||||
var a = [];
|
||||
var re = new RegExp('(^| )'+classname+'( |$)');
|
||||
var els = node.getElementsByTagName("*");
|
||||
for(var i=0,j=els.length; i<j; i++)
|
||||
if(re.test(els[i].className))a.push(els[i]);
|
||||
return a;
|
||||
}
|
||||
document.head = document.head || document.getElementsByTagName('head')[0];
|
||||
|
||||
// ------------------------------------------------------
|
||||
|
||||
// human readable time
|
||||
function secondsToTime(seconds){
|
||||
seconds = parseInt(seconds);
|
||||
minutes = parseInt(seconds/60);
|
||||
seconds = seconds%60;
|
||||
hours = parseInt(minutes/60);
|
||||
minutes = minutes%60;
|
||||
if(hours==0){
|
||||
return minutes + ' ' + 'min';
|
||||
}
|
||||
else{
|
||||
return hours + ' ' + 'h' + ' ' + minutes + ' ' + 'min';
|
||||
}
|
||||
}
|
||||
|
||||
// human readable distance
|
||||
function getDistanceWithUnit(distance){
|
||||
distance = parseInt(distance);
|
||||
|
||||
if(distance >= 100000){ return (parseInt(distance/1000))+' ' + 'km'; }
|
||||
else if(distance >= 10000){ return (parseInt(distance/1000).toFixed(1))+' ' + 'km'; }
|
||||
else if(distance >= 1000){ return (parseFloat(distance/1000).toFixed(2))+' ' + 'km'; }
|
||||
else{ return distance+' ' + 'm'; }
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
|
||||
// verify angles
|
||||
function isLatitude(value) {
|
||||
if( value >=-90 && value <=90)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
function isLongitude(value) {
|
||||
if( value >=-180 && value <=180)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------
|
||||
|
||||
// distance between two points
|
||||
function distanceBetweenPoint(x1, y1, x2, y2) {
|
||||
var a = x1 - x2;
|
||||
var b = y1 - y2;
|
||||
return Math.sqrt(a*a + b*b);
|
||||
}
|
||||
|
||||
// distance from a point to a line or segment
|
||||
// (x,y) point
|
||||
// (x0,y0) line point A
|
||||
// (x1,y1) line point B
|
||||
// o specifies if the distance should respect the limits of the segment (overLine = true)
|
||||
// or if it should consider the segment as an infinite line (overLine = false);
|
||||
// if false returns the distance from the point to the line,
|
||||
// otherwise the distance from the point to the segment
|
||||
function dotLineLength(x, y, x0, y0, x1, y1, o){
|
||||
function lineLength(x, y, x0, y0){return Math.sqrt((x -= x0) * x + (y -= y0) * y);}
|
||||
|
||||
if(o && !(o = function(x, y, x0, y0, x1, y1){
|
||||
if(!(x1 - x0)) return {x: x0, y: y};
|
||||
else if(!(y1 - y0)) return {x: x, y: y0};
|
||||
var left, tg = -1 / ((y1 - y0) / (x1 - x0));
|
||||
return {x: left = (x1 * (x * tg - y + y0) + x0 * (x * - tg + y - y1)) / (tg * (x1 - x0) + y0 - y1), y: tg * left - tg * x + y};
|
||||
}(x, y, x0, y0, x1, y1) && o.x >= Math.min(x0, x1) && o.x <= Math.max(x0, x1) && o.y >= Math.min(y0, y1) && o.y <= Math.max(y0, y1))){
|
||||
var l1 = lineLength(x, y, x0, y0), l2 = lineLength(x, y, x1, y1);
|
||||
return l1 > l2 ? l2 : l1;
|
||||
}
|
||||
else {
|
||||
var a = y0 - y1, b = x1 - x0, c = x0 * y1 - y0 * x1;
|
||||
return Math.abs(a * x + b * y + c) / Math.sqrt(a * a + b * b);
|
||||
}
|
||||
};
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU AFFERO General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
or see http://www.gnu.org/licenses/agpl.txt.
|
||||
*/
|
||||
|
||||
// store location of via points returned by server
|
||||
OSRM.GLOBALS.via_points = null;
|
||||
|
||||
|
||||
// find route segment of current route geometry that is closest to the new via node (marked by index of its endpoint)
|
||||
function findNearestRouteSegment( new_via ) {
|
||||
var min_dist = Number.MAX_VALUE;
|
||||
var min_index = undefined;
|
||||
|
||||
var positions = OSRM.G.route.getPositions();
|
||||
for(var i=0; i<positions.length-1; i++) {
|
||||
var dist = dotLineLength( new_via.lng, new_via.lat, positions[i].lng, positions[i].lat, positions[i+1].lng, positions[i+1].lat, true);
|
||||
if( dist < min_dist) {
|
||||
min_dist = dist;
|
||||
min_index = i+1;
|
||||
}
|
||||
}
|
||||
|
||||
return min_index;
|
||||
}
|
||||
|
||||
|
||||
// find the correct index among all via nodes to insert the new via node, and insert it
|
||||
function findViaPosition( new_via_position ) {
|
||||
// find route segment that is closest to click position (marked by last index)
|
||||
var nearest_index = findNearestRouteSegment( new_via_position );
|
||||
|
||||
// find correct index to insert new via node
|
||||
var new_via_index = OSRM.G.via_points.length;
|
||||
var via_index = Array();
|
||||
for(var i=0; i<OSRM.G.via_points.length; i++) {
|
||||
via_index[i] = findNearestRouteSegment( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||
if(via_index[i] > nearest_index) {
|
||||
new_via_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// add via node
|
||||
var index = OSRM.G.markers.setVia(new_via_index, new_via_position);
|
||||
OSRM.G.markers.route[index].show();
|
||||
|
||||
getRoute(OSRM.C.FULL_DESCRIPTION);
|
||||
|
||||
return new_via_index;
|
||||
}
|
||||