/* 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(); } };