diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-08-15 20:10:57 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-08-22 02:04:25 +0200 |
commit | c107a69ca98f5be7893cbe2a03e84cfaae1b9ca9 (patch) | |
tree | d5de22ae39e2dce2bb0067450aecdb8f3df6f302 | |
parent | d1834d853739383585f2ad0a99afb606c1f16978 (diff) | |
download | Chimère-c107a69ca98f5be7893cbe2a03e84cfaae1b9ca9.tar.bz2 Chimère-c107a69ca98f5be7893cbe2a03e84cfaae1b9ca9.zip |
Improve routing: manage steps
* Manage steps in routing core
* Add extra parameters for steps in urls.py
* Modify the view to parse steps and send them to the routing core
* Manage steps in JS (add many step flags and send a correct request to
the view)
* Manage a clear itinerary action in JS
* Add a new flag image for steps
* CSS improvement
-rw-r--r-- | chimere/route.py | 12 | ||||
-rw-r--r-- | chimere/static/chimere/css/styles.css | 21 | ||||
-rw-r--r-- | chimere/static/chimere/img/flag-step.png | bin | 0 -> 1256 bytes | |||
-rw-r--r-- | chimere/static/chimere/img/images_licences | 7 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 62 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/map_menu.html | 2 | ||||
-rw-r--r-- | chimere/urls.py | 1 | ||||
-rw-r--r-- | chimere/views.py | 10 |
8 files changed, 93 insertions, 22 deletions
diff --git a/chimere/route.py b/chimere/route.py index 207232b..bc08a39 100644 --- a/chimere/route.py +++ b/chimere/route.py @@ -39,7 +39,7 @@ class Router: class RoutinoRouter(Router): re_desc = [re.compile("<tr class='n'>"), re.compile("<tr class='s'>"), re.compile("<tr class='t'>")] - def route(self, lon1, lat1, lon2, lat2, session_id='', transport='foot'): + def route(self, lon1, lat1, lon2, lat2, steps=[], transport='foot'): ''' Get a list of geojson polylines and route description ''' @@ -53,9 +53,15 @@ class RoutinoRouter(Router): "--output-gpx-track", "--lat1=%0.15f" % lat1, "--lon1=%0.15f" % lon1, - "--lat2=%0.15f" % lat2, - "--lon2=%0.15f" % lon2 ] + lonlat_index = 1 + for lon, lat in steps: + lonlat_index += 1 + args += ["--lat%d=%0.15f" % (lonlat_index, lat), + "--lon%d=%0.15f" % (lonlat_index, lon)] + lonlat_index += 1 + args += ["--lat%d=%0.15f" % (lonlat_index, lat2), + "--lon%d=%0.15f" % (lonlat_index, lon2)] tmp_dir = tempfile.mkdtemp(prefix='chimere_') + os.sep p = Popen(args, stdout=PIPE, cwd=tmp_dir) p.communicate() diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 5fd9cd7..9133001 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -417,11 +417,24 @@ ul#share li{ padding-top:0; } +#chimere_itinerary table +{ + border-collapse:collapse; +} + +#chimere_itinerary td{ + border:8px solid #fff; +} + #chimere_itinerary td.l{ padding:5px; width:60px; } +#chimere_itinerary td.r{ + font-size:0.8em; +} + #chimere_itinerary span.j{ font-style:italic; } @@ -444,6 +457,14 @@ ul#share li{ border-radius: 0 8px 8px 8px; } +#map_menu_clear{ + display:none; +} + +#map_menu_zoomin{ + border-top:1px solid #999; +} + #chimere_map_menu ul, #chimere_map_menu li{ padding:0.2em; margin:0; diff --git a/chimere/static/chimere/img/flag-step.png b/chimere/static/chimere/img/flag-step.png Binary files differnew file mode 100644 index 0000000..5556c94 --- /dev/null +++ b/chimere/static/chimere/img/flag-step.png diff --git a/chimere/static/chimere/img/images_licences b/chimere/static/chimere/img/images_licences index 000fdf0..03d63dc 100644 --- a/chimere/static/chimere/img/images_licences +++ b/chimere/static/chimere/img/images_licences @@ -31,9 +31,10 @@ Author: Sbrools Licence: Public domain Url: https://commons.wikimedia.org/wiki/File:8thNote.svg -* Flags image credit (flag-start.png, flag-finish.png) +* Flags image credit (flag-start.png, flag-step.png, flag-finish.png) Author: FatCow Web Hosting Licence: Creative Commons Attribution 3.0 United States license -Url: https://upload.wikimedia.org/wikipedia/commons/6/64/Farm-Fresh_flag_finish.png - https://upload.wikimedia.org/wikipedia/commons/c/cb/Farm-Fresh_flag_1.png +Url: https://upload.wikimedia.org/wikipedia/commons/c/cb/Farm-Fresh_flag_1.png + https://upload.wikimedia.org/wikipedia/commons/8/81/Farm-Fresh_flag_blue.png + https://upload.wikimedia.org/wikipedia/commons/6/64/Farm-Fresh_flag_finish.png diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 4639a09..7676517 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -231,17 +231,24 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { $('#map_menu_center').bind("click", methods.mapCenter); if (settings.routing){ settings.routing_start = null; + settings.routing_steps = new Array(); settings.routing_end = null; settings.icon_start = new OpenLayers.Icon( STATIC_URL + "chimere/img/flag-start.png", new OpenLayers.Size(32, 32), new OpenLayers.Pixel(0, -32)); + settings.icon_step = new OpenLayers.Icon( + STATIC_URL + "chimere/img/flag-step.png", + new OpenLayers.Size(32, 32), + new OpenLayers.Pixel(0, -32)); settings.icon_end = new OpenLayers.Icon( STATIC_URL + "chimere/img/flag-finish.png", new OpenLayers.Size(32, 32), new OpenLayers.Pixel(0, -32)); $('#map_menu_from').bind("click", methods.routingFrom); + $('#map_menu_step').bind("click", methods.routingAddStep); $('#map_menu_to').bind("click", methods.routingTo); + $('#map_menu_clear').bind("click", methods.routingClear); settings.layerRoute = new OpenLayers.Layer.Vector("Route Layer"); settings.map.addLayer(settings.layerRoute); settings.layerRoute.setOpacity(0.8); @@ -516,7 +523,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { // set the start point for routing routingFrom: function(){ $('#chimere_map_menu').hide(); - //$('#chimere_itinerary_panel').hide(); + $('#map_menu_clear').show(); $('#chimere_itinerary_panel').dialog('close'); settings.routing_start = new OpenLayers.Marker( settings.current_position.clone(), @@ -525,10 +532,23 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { if (settings.routing_end) methods.route(); }, + // add a step point for routing + routingAddStep: function(){ + $('#chimere_map_menu').hide(); + $('#map_menu_clear').show(); + $('#chimere_itinerary_panel').dialog('close'); + settings.routing_steps.push(new OpenLayers.Marker( + settings.current_position.clone(), + settings.icon_step.clone())); + settings.layerRouteMarker.addMarker( + settings.routing_steps[settings.routing_steps.length-1]); + if (settings.routing_end && settings.routing_start) methods.route(); + }, + // set the finish point for routing routingTo: function(){ $('#chimere_map_menu').hide(); - //$('#chimere_itinerary_panel').hide(); + $('#map_menu_clear').show(); $('#chimere_itinerary_panel').dialog('close'); settings.routing_end = new OpenLayers.Marker( settings.current_position.clone(), @@ -537,22 +557,39 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { if (settings.routing_start) methods.route(); }, + // clear the current itinerary + routingClear: function(){ + $('#chimere_map_menu').hide(); + $('#map_menu_clear').hide(); + $('#chimere_itinerary_panel').dialog('close'); + settings.layerRoute.removeAllFeatures(); + settings.layerRouteMarker.clearMarkers(); + settings.routing_start = null; + settings.routing_end = null; + settings.routing_steps = new Array(); + }, + // display a route route: function(){ if (!settings.routing_start || !settings.routing_end){ return; } - var start = settings.routing_start.lonlat.clone().transform( - settings.map.getProjectionObject(), - EPSG_DISPLAY_PROJECTION); - var end = settings.routing_end.lonlat.clone().transform( + var steps = [settings.routing_start.lonlat.clone()] + for (var i = 0; i < settings.routing_steps.length; i++) { + steps.push(settings.routing_steps[i].lonlat.clone()); + } + steps.push(settings.routing_end.lonlat.clone()); + // create the appropriate URL + var uri = extra_url + "route/" + for (var i = 0; i < steps.length; i++) { + var step = steps[i].transform( settings.map.getProjectionObject(), EPSG_DISPLAY_PROJECTION); - var uri = extra_url + "route/" - + start.lon + '_' - + start.lat + '_' - + end.lon + '_' - + end.lat; + if (i > 0){ + uri += '_'; + } + uri += step.lon + '_' + step.lat; + } $.ajax({url: uri, dataType: "json", success: function (data) { @@ -562,8 +599,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } $('#chimere_itinerary').html( data.properties.description); - //$('#chimere_itinerary_panel').show(); - $('#chimere_itinerary_panel').dialog('open'); + $('#chimere_itinerary_panel').dialog('open'); }, error: function (data) { settings.layerRoute.removeAllFeatures(); diff --git a/chimere/templates/chimere/blocks/map_menu.html b/chimere/templates/chimere/blocks/map_menu.html index 52a4107..e541c1e 100644 --- a/chimere/templates/chimere/blocks/map_menu.html +++ b/chimere/templates/chimere/blocks/map_menu.html @@ -3,7 +3,9 @@ <ul> {% if routing %} <li id='map_menu_from' class='routing_item'>{% trans "From" context "routing" %}</li> + <li id='map_menu_step' class='routing_item'>{% trans "Add a step" context "routing" %}</li> <li id='map_menu_to' class='routing_item'>{% trans "To" context "routing" %}</li> + <li id='map_menu_clear' class='routing_item'>{% trans "Clear the itinerary" context "routing" %}</li> {% endif%} <li id='map_menu_zoomin'>{% trans "Zoom in" %}</li> <li id='map_menu_zoomout'>{% trans "Zoom out" %}</li> diff --git a/chimere/urls.py b/chimere/urls.py index ad88e32..aec82fb 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -55,6 +55,7 @@ if settings.CHIMERE_ENABLE_ROUTING: urlpatterns += patterns('chimere.views', url(r'^(?P<area_name>[a-zA-Z0-9_-]*/)?route/'\ r'(?P<lon1>[-]?[0-9]+[.]?[0-9]*)_(?P<lat1>[-]?[0-9]+[.]?[0-9]*)_'\ + r'(?P<lonlat_steps>([-]?[0-9]+[.]?[0-9]*_[-]?[0-9]+[.]?[0-9]*_)*)'\ r'(?P<lon2>[-]?[0-9]+[.]?[0-9]*)_(?P<lat2>[-]?[0-9]+[.]?[0-9]*)$', 'route', name="route"), ) diff --git a/chimere/views.py b/chimere/views.py index ad4b0ca..df403e0 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -638,17 +638,21 @@ def redirectFromTinyURN(request, area_name='', tiny_urn=''): return redir return HttpResponseRedirect(response_dct['extra_url'] + parameters) -def route(request, area_name, lon1, lat1, lon2, lat2, transport='foot'): +def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, + transport='foot'): ''' Get the JSON for a route ''' try: lon1, lat1 = float(lon1), float(lat1) lon2, lat2 = float(lon2), float(lat2) + steps = [float(lonlat) for lonlat in lonlat_steps.split('_') if lonlat] + # regroup by 2 + steps = [(steps[i*2], steps[i*2+1]) for i in range(len(steps)/2)] except ValueError: return HttpResponse('no results') - jsons, desc = router.route(lon1, lat1, lon2, lat2, transport=transport, - session_id=request.session.session_key) + jsons, desc = router.route(lon1, lat1, lon2, lat2, steps=steps, + transport=transport) if not jsons: return HttpResponse('no results') jsonencoder = simplejson.JSONEncoder() |