From 3b485f1426407fc892f4c93ea89443b476ea125c Mon Sep 17 00:00:00 2001 From: DennisSchiefer Date: Sun, 1 Apr 2012 19:13:54 +0200 Subject: [PATCH] finished dragging of routes, moved corrected bugs in Leaflet to their own file (drag after dragend, distance to path), open osmbugs in new window --- WebContent/L.Bugfixes.js | 80 ++++ WebContent/OSRM.Localization.js | 8 +- WebContent/OSRM.Markers.js | 33 +- WebContent/OSRM.Route.js | 10 - WebContent/OSRM.Routing.js | 513 -------------------------- WebContent/OSRM.Via.js | 30 +- WebContent/leaflet/leaflet-src.js | 9 +- WebContent/main.html | 7 +- WebContent/routing/OSRM.RoutingGUI.js | 3 +- 9 files changed, 110 insertions(+), 583 deletions(-) create mode 100644 WebContent/L.Bugfixes.js delete mode 100644 WebContent/OSRM.Routing.js diff --git a/WebContent/L.Bugfixes.js b/WebContent/L.Bugfixes.js new file mode 100644 index 000000000..e1979df15 --- /dev/null +++ b/WebContent/L.Bugfixes.js @@ -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); + } + }; +}()); diff --git a/WebContent/OSRM.Localization.js b/WebContent/OSRM.Localization.js index 6d377f38a..ffe7ec9ec 100644 --- a/WebContent/OSRM.Localization.js +++ b/WebContent/OSRM.Localization.js @@ -39,8 +39,8 @@ OSRM.loc = OSRM.Localization.translate; // German language support OSRM.Localization["de"] = { //gui -"OPEN_JOSM": "JOSM Öffnen", -"OPEN_OSMBUGS": "OSM Bugs Öffnen", +"OPEN_JOSM": "JOSM", +"OPEN_OSMBUGS": "OSM Bugs", "GUI_START": "Start", "GUI_END": "Ziel", "GUI_RESET": "Reset", @@ -82,8 +82,8 @@ OSRM.Localization["de"] = { // English language support OSRM.Localization["en"] = { //gui -"OPEN_JOSM": "Open JOSM", -"OPEN_OSMBUGS": "Open OSM Bugs", +"OPEN_JOSM": "JOSM", +"OPEN_OSMBUGS": "OSM Bugs", "GUI_START": "Start", "GUI_END": "End", "GUI_RESET": "  Reset  ", diff --git a/WebContent/OSRM.Markers.js b/WebContent/OSRM.Markers.js index 4d2dab54c..4b7d153c2 100644 --- a/WebContent/OSRM.Markers.js +++ b/WebContent/OSRM.Markers.js @@ -67,24 +67,6 @@ 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 ) { OSRM.RouteMarker.prototype.base.constructor.apply( this, arguments ); @@ -94,8 +76,6 @@ OSRM.RouteMarker = function ( label, style, position ) { this.marker.on( 'drag', this.onDrag ); this.marker.on( 'dragstart', this.onDragStart ); this.marker.on( 'dragend', this.onDragEnd ); -// this.marker.on( 'mouseover', this.onMouseOver ); -// this.marker.on( 'mouseout', this.onMouseOut ); }; OSRM.inheritFrom( OSRM.RouteMarker, OSRM.Marker ); OSRM.extend( OSRM.RouteMarker, { @@ -126,7 +106,8 @@ onDragStart: function(e) { break; } - //OSRM.G.markers.highlight.hide(); + if( this.parent != OSRM.G.markers.highlight) + OSRM.G.markers.highlight.hide(); if (OSRM.G.route.isShown()) OSRM.G.route.showOldRoute(); }, @@ -142,12 +123,6 @@ onDragEnd: function(e) { if(OSRM.G.route.isShown()==false) OSRM.Geocoder.updateAddress(this.parent.label); }, -onMouseOver: function(e) { - OSRM.G.onmouse = true; -}, -onMouseOut: function(e) { - OSRM.G.onmouse = false; -}, toString: function() { return "OSRM.RouteMarker: \""+this.label+"\", "+this.position+")"; } @@ -171,11 +146,11 @@ onDragStart: function(e) { OSRM.RouteMarker.prototype.onDragStart.call(this,e); }, onDragEnd: function(e) { - OSRM.G.markers.route[OSRM.G.dragid].hide(); OSRM.G.markers.route[OSRM.G.dragid] = new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via']}, e.target.getLatLng() ); OSRM.G.markers.route[OSRM.G.dragid].show(); - OSRM.RouteMarker.prototype.onDragEnd.call(this,e); + OSRM.RouteMarker.prototype.onDragEnd.call(this,e); + this.parent.hide(); }, toString: function() { return "OSRM.DragMarker: \""+this.label+"\", "+this.position+")"; diff --git a/WebContent/OSRM.Route.js b/WebContent/OSRM.Route.js index 71e88a110..54a1097e8 100644 --- a/WebContent/OSRM.Route.js +++ b/WebContent/OSRM.Route.js @@ -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() { @@ -58,14 +56,6 @@ centerView: function() { var bounds = new L.LatLngBounds( this.getPositions() ); OSRM.g.map.fitBoundsUI( bounds ); }, -onClick: function(e) { - if(OSRM.G.route.isRoute()) { - var via_index = OSRM.Via.findViaIndex( e.latlng ); - var marker_index = OSRM.G.markers.setVia(via_index, e.latlng); - OSRM.G.markers.route[marker_index].show(); - OSRM.Routing.getRoute(); - } -}, toString: function() { return "OSRM.Route("+ this.label + ", " + this.route.getLatLngs().length + " points)"; } diff --git a/WebContent/OSRM.Routing.js b/WebContent/OSRM.Routing.js deleted file mode 100644 index 9ef99968c..000000000 --- a/WebContent/OSRM.Routing.js +++ /dev/null @@ -1,513 +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; - - -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.Routing.showNoRouteGeometry(); - OSRM.Routing.showNoRouteDescription(); - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("TIMED_OUT")+".

"; -}, -timeoutRoute: function() { - OSRM.Routing.showNoRouteGeometry(); - OSRM.G.route.hideUnnamedRoute(); - OSRM.Routing.showNoRouteDescription(); - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("TIMED_OUT")+".

"; -}, -showRouteSimple: function(response) { - if(!response) - return; - - if( !OSRM.G.dragging ) // prevent simple routing when no longer dragging - return; - - if( response.status == 207) { - OSRM.Routing.showNoRouteGeometry(); - OSRM.Routing.showNoRouteDescription(); - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".

"; - } else { - OSRM.Routing.showRouteGeometry(response); - OSRM.Routing.showRouteDescriptionSimple(response); - } - OSRM.Routing._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(OSRM.Routing.draggingTimeout,1); - } -}, -showRoute: function(response) { - if(!response) - return; - - if(response.status == 207) { - OSRM.Routing.showNoRouteGeometry(); - OSRM.G.route.hideUnnamedRoute(); - OSRM.Routing.showNoRouteDescription(); - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("NO_ROUTE_FOUND")+".

"; - } else { - OSRM.Routing.showRouteGeometry(response); - OSRM.Routing.showRouteNonames(response); - OSRM.Routing.showRouteDescription(response); - OSRM.Routing._snapRoute(); - } - OSRM.Routing._updateHints(response); -}, - - -// show route geometry -showNoRouteGeometry: function() { - var positions = []; - for(var i=0, size=OSRM.G.markers.route.length; i'+response.ShortURL+']'; -}, -showRouteLink_TimeOut: function(){ - document.getElementById('route-prelink').innerHTML = '['+OSRM.loc("LINK_TO_ROUTE_TIMEOUT")+']'; -}, -showRouteDescription: function(response) { - // compute query string - var query_string = '?rebuild=1'; - for(var i=0; i'+OSRM.loc("GET_LINK_TO_ROUTE")+']'; - - // create GPX link - var gpx_link = '['+OSRM.loc("GPX_FILE")+']'; - - // create route description - var route_desc = ""; - route_desc += ''; - - 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 += ''; - - route_desc += '"; - - route_desc += '"; - - route_desc += '"; - - route_desc += ""; - } - - route_desc += '
'; - route_desc += ''; - route_desc += "'; - route_desc += ''; - 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 += '' + response.route_instructions[i][1] + ''; - } - //route_desc += ' for '; - route_desc += ''; - route_desc += "'; - if( i != response.route_instructions.length-1 ) - route_desc += ''+OSRM.Utils.metersToDistance(response.route_instructions[i][2])+''; - route_desc += "
'; - headline = ""; - headline += OSRM.loc("ROUTE_DESCRIPTION")+":
"; - headline += '

'; - headline += "" - + OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance) - + "
" - + OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time) - + "
"; - headline += '
'; - headline += '
'+route_link+'
'+gpx_link+'
'; - - var output = ""; - output += route_desc; - - document.getElementById('information-box-headline').innerHTML = headline; - document.getElementById('information-box').innerHTML = output; -}, -showRouteDescriptionSimple: function(response) { - headline = OSRM.loc("ROUTE_DESCRIPTION")+":
"; - headline += "" - + OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance) - + "
" - + OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time) - + "
"; - headline += '

'; - - document.getElementById('information-box-headline').innerHTML = headline; - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".

"; -}, -showNoRouteDescription: function() { - headline = OSRM.loc("ROUTE_DESCRIPTION")+":
"; - headline += "" - + OSRM.loc("DISTANCE")+": N/A" - + "
" - + OSRM.loc("DURATION")+": N/A" - + "
"; - headline += '

'; - - document.getElementById('information-box-headline').innerHTML = headline; - document.getElementById('information-box').innerHTML = "

"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".

"; -}, - - -// unnamed streets display -showRouteNonames: 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.Routing.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 -getDragRoute: function() { - // prepare JSONP call - var source = OSRM.DEFAULTS.HOST_ROUTING_URL; - source += '?z=' + OSRM.G.map.getZoom() + '&output=json&geomformat=cmp&instructions=false'; - if(OSRM.G.markers.checksum) - source += '&checksum=' + OSRM.G.markers.checksum; - for(var i=0, size=OSRM.G.markers.route.length; i 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= 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 -_updateHints: function(response) { - var hint_locations = response.hint_data.locations; - OSRM.G.markers.checksum = response.hint_data.checksum; - for(var i=0; i 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() ) { - OSRM.Routing.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" -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 return 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('input-source-name').value); - else if( marker_id == OSRM.C.TARGET_LABEL) - OSRM.Geocoder.call(OSRM.C.TARGET_LABEL, document.getElementById('input-target-name').value); -} - -}; \ No newline at end of file diff --git a/WebContent/OSRM.Via.js b/WebContent/OSRM.Via.js index 429703789..4471b4b56 100644 --- a/WebContent/OSRM.Via.js +++ b/WebContent/OSRM.Via.js @@ -68,30 +68,32 @@ findViaIndex: function( new_via_position ) { dragTimer: new Date(), drawDragMarker: function(event) { - if( OSRM.G.route.isShown() == false ) + if( OSRM.G.route.isShown() == false) return; if( OSRM.G.dragging == true ) return; + + // throttle computation if( (new Date() - OSRM.Via.dragTimer) < 25 ) return; - if( OSRM.G.onmouse ) { - OSRM.G.markers.dragger.hide(); - return; - } OSRM.Via.dragTimer = new Date(); -// var mouse = event.latlng; -// for(var i=0, size=OSRM.G.markers.route.length; i + @@ -116,11 +117,11 @@ or see http://www.gnu.org/licenses/agpl.txt. Kartenwerkzeuge

- Unbenannte Straßen hervorheben + Unbenannte Straßen hervorheben - JOSM Öffnen - OSM Bugs Öffnen + JOSM + OSM Bugs
diff --git a/WebContent/routing/OSRM.RoutingGUI.js b/WebContent/routing/OSRM.RoutingGUI.js index bb2da16ad..4d23a0e54 100644 --- a/WebContent/routing/OSRM.RoutingGUI.js +++ b/WebContent/routing/OSRM.RoutingGUI.js @@ -108,8 +108,7 @@ openJOSM: function() { //click: button "open OSM Bugs" openOSMBugs: function() { var position = OSRM.G.map.getCenterUI(); - document.location.href = "http://osmbugs.org/?lat="+position.lat.toFixed(6)+"&lon="+position.lng.toFixed(6)+"&zoom="+OSRM.G.map.getZoom(); - //window.open( "http://osmbugs.org/?lat="+position.lat.toFixed(6)+"&lon="+position.lng.toFixed(6)+"&zoom="+OSRM.G.map.getZoom() ); + window.open( "http://osmbugs.org/?lat="+position.lat.toFixed(6)+"&lon="+position.lng.toFixed(6)+"&zoom="+OSRM.G.map.getZoom() ); } }; \ No newline at end of file