diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-05 21:49:29 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-05 21:49:29 +0200 | 
| commit | e01b6a270a4c5a790ef70b799e404fe062c1b0de (patch) | |
| tree | 7db3dc478650370bdbbb0f1ae3f05806465e8b8d | |
| parent | 073803dcd5ef341bc1eeada67942adb78a4c253d (diff) | |
| download | Chimère-e01b6a270a4c5a790ef70b799e404fe062c1b0de.tar.bz2 Chimère-e01b6a270a4c5a790ef70b799e404fe062c1b0de.zip | |
Manage different and multiple layers in areas (including default)
| -rw-r--r-- | chimere/default_settings.py | 4 | ||||
| -rw-r--r-- | chimere/fixtures/initial_data.json | 6 | ||||
| -rw-r--r-- | chimere/static/chimere/css/styles.css | 39 | ||||
| -rw-r--r-- | chimere/static/chimere/img/layer-switcher-maximize.png | bin | 480 -> 594 bytes | |||
| -rw-r--r-- | chimere/static/chimere/js/edit_map.js | 149 | ||||
| -rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 5 | ||||
| -rw-r--r-- | chimere/static/chimere/js/main_map.js | 534 | ||||
| -rw-r--r-- | chimere/templates/chimere/blocks/head_chimere.html | 2 | ||||
| -rw-r--r-- | chimere/templates/chimere/blocks/map_params.html | 2 | ||||
| -rw-r--r-- | chimere/templatetags/chimere_tags.py | 5 | ||||
| -rw-r--r-- | chimere/views.py | 6 | ||||
| -rw-r--r-- | chimere/widgets.py | 39 | ||||
| -rw-r--r-- | example_project/settings.py | 8 | 
13 files changed, 92 insertions, 707 deletions
| diff --git a/chimere/default_settings.py b/chimere/default_settings.py index 7b7d1c3..121d912 100644 --- a/chimere/default_settings.py +++ b/chimere/default_settings.py @@ -40,9 +40,7 @@ CHIMERE_DAYS_BEFORE_EVENT = 30  CHIMERE_DEFAULT_CATEGORIES = [1]  # JS definition of the main map cf. OpenLayers documentation for more details -#MAP_LAYER = '''new OpenLayers.Layer.OSM.CycleMap("Cycle map", { -#displayOutsideMaxExtent: true, wrapDateLine: true})''' # OSM cyclemap -CHIMERE_MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map +CHIMERE_DEFAULT_MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map  # display picture inside the description by default or inside a galery?  CHIMERE_MINIATURE_BY_DEFAULT = True diff --git a/chimere/fixtures/initial_data.json b/chimere/fixtures/initial_data.json index 84931f4..553f7d6 100644 --- a/chimere/fixtures/initial_data.json +++ b/chimere/fixtures/initial_data.json @@ -236,7 +236,7 @@          "pk": 1,          "model": "chimere.layer",          "fields": { -            "layer_code": "OpenLayers.Layer.OSM.Mapnik({% trans \"Default\" %},\r\n{attribution:\"\", keyid:\"mapnik\", displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"M\"})", +            "layer_code": "new OpenLayers.Layer.OSM.Mapnik(\"Default\",\r\n{attribution:\"\", keyid:\"mapnik\", displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"M\"})",              "name": "OSM - Mapnik"          }      }, @@ -244,7 +244,7 @@          "pk": 2,          "model": "chimere.layer",          "fields": { -            "layer_code": "OpenLayers.Layer.OSM.CycleMap({% trans \"Cycle map\" %},\r\n{attribution:\"Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>\",\r\nkeyid:\"cyclemap\",displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"C\"})", +            "layer_code": "new OpenLayers.Layer.OSM.CycleMap(\"Cycle map\",\r\n{attribution:\"Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>\",\r\nkeyid:\"cyclemap\",displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"C\"})",              "name": "OSM - CycleMap"          }      }, @@ -252,7 +252,7 @@          "pk": 3,          "model": "chimere.layer",          "fields": { -            "layer_code": "OpenLayers.Layer.OSM.TransportMap({% trans \"Transport map\" %},\r\n{attribution:\"Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>\",\r\nkeyid:\"transportmap\",displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"T\"})", +            "layer_code": "new OpenLayers.Layer.OSM.TransportMap(\"Transport map\",\r\n{attribution:\"Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>\",\r\nkeyid:\"transportmap\",displayOutsideMaxExtent:!0,wrapDateLine:!0,layerCode:\"T\"})",              "name": "OSM - TransportMap"          }      } diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index ee47557..3eb81c1 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -32,6 +32,8 @@ body, h2, h3, th,  .ui-widget-header,  .action li.selected,  #welcome_button, +#content .olControlLayerSwitcher .layersDiv, +#content .olControlLayerSwitcher span,  .olControlPermalink{      background-color:#4ea30d;  } @@ -568,6 +570,43 @@ table.inline-table td input[type=file]{      left:220px;  } +#content .olControlLayerSwitcher .baseLbl, +#content .olControlLayerSwitcher .dataLbl, +#content .olControlLayerSwitcher .dataLayersDiv{ +    display:None; +} + +#content .olControlLayerSwitcher { +   top: 150px !important; +   right: auto !important; +   bottom: auto !important; +   left: 0 !important; +} + + +#content .olControlLayerSwitcher .layersDiv { +    padding-top: 5px; +    padding-left: 5px !important; +    padding-bottom: 5px; +    padding-right: 0px !important; +    width: 100%; +    height: auto !important; +} + +#content .olControlLayerSwitcher .layersDiv .baseLayersDiv, +{ +    padding-left: 15px; +} + +#content .olControlLayerSwitcher .maximizeDiv, +#content .olControlLayerSwitcher .minimizeDiv { +    top: 10px !important; +    right: auto !important; +    position: absolute !important; +    bottom: auto !important; +    left: 0px !important; +} +  .simple .olControlScaleLine {      bottom:50px;      left:10px; diff --git a/chimere/static/chimere/img/layer-switcher-maximize.png b/chimere/static/chimere/img/layer-switcher-maximize.pngBinary files differ index 33368db..f23bef8 100644 --- a/chimere/static/chimere/img/layer-switcher-maximize.png +++ b/chimere/static/chimere/img/layer-switcher-maximize.png diff --git a/chimere/static/chimere/js/edit_map.js b/chimere/static/chimere/js/edit_map.js deleted file mode 100644 index 5000b75..0000000 --- a/chimere/static/chimere/js/edit_map.js +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (C) 2008  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) 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 General Public License -along with this program.  If not, see <http://www.gnu.org/licenses/>. - -See the file COPYING for details. -*/ - -/* map edit */ - -var map; - -/* availaible map layers */ -var layerMarkers = new OpenLayers.Layer.Markers('POIs'); - -/* default size and offset for icon */ -var size = new OpenLayers.Size(21, 25); -var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); -var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png', size, offset); - -/* set a marker with a click on the map */ -var setMarker = function (event){ -    event = event || window.event; -    var lonlat = layerMarkers.getLonLatFromViewPortPx(event.xy); -    putMarker(lonlat, false); -    OpenLayers.Event.stop(event); -} - -/* put the marker on the map and update latitude and longitude fields */ -var putMarker = function (lonlat, zoom){ -    if (marker) { -        layerMarkers.removeMarker(marker); -    } -    var marker = new OpenLayers.Marker(lonlat.clone(), icon); -    layerMarkers.addMarker(marker); -    lonlat = lonlat.clone().transform(map.getProjectionObject(), -                                      epsg_display_projection); -    document.getElementById('id_point').value = 'POINT(' + lonlat.lon + -                                                ' ' + lonlat.lat + ')'; -    document.getElementById('live_latitude').value = lonlat.lat; -    document.getElementById('live_longitude').value = lonlat.lon; -    /*zoom to the point*/ -    if (zoom){ -        var bounds = layerMarkers.getDataExtent(); -        if (bounds) map.zoomToExtent(bounds); -    } -    return; -} - -/* main initialisation function */ -function init(){ -    var options = { -        controls:[new OpenLayers.Control.Navigation(), -                    new OpenLayers.Control.PanPanel(), -                    new OpenLayers.Control.ZoomPanel(), -                    new OpenLayers.Control.Attribution()], -        maxResolution: 156543.0399, -        units: 'm', -        projection: epsg_projection, -        displayProjection: epsg_display_projection -    }; -    if (restricted_extent){ -        restricted_extent.transform(epsg_display_projection, epsg_projection); -        options['restrictedExtent'] = restricted_extent; -    } -    map = new OpenLayers.Map ('map_edit', options); -    layerMarkers.setOpacity(0.5); -    map.addLayers([map_layer, layerMarkers]); -    map.events.register('click', map, setMarker); -    /* zoom to the appropriate extent */ -    if (!zoomToCurrentExtent(map)){ -        map.setCenter(centerLonLat, 12); -    } -} - - -/* code for drag'n drop : delayed for further version of openlayers */ - -/* -function init_b(){ -    init(); - -    marker.events.register('mouseup', marker, releaseMarker); -    marker.events.register('mousedown', marker, catchMarker); -    marker.events.register('mouseover', marker, markerOver); -    marker.events.register('mouseout', marker, markerOut); - -    map.events.register('mousemove', map, onMouseMove); -    map.events.register('moveend', map, onMoveEnd); -} - -var marker_catched = false; - -function catchMarker(event){ -    marker_catched = true; -    event = event || window.event; -    OpenLayers.Event.stop(event); -} - -function releaseMarker(event){ -    event = event || window.event; -    if(marker_catched) { -        marker_catched = false; -        lonlat = layerMarkers.getLonLatFromViewPortPx(marker.icon.px); -        marker.lonlat = lonlat; -        document.getElementById('latitude').value = marker.lonlat.lat; -        document.getElementById('longitude').value = marker.lonlat.lon; -    } -    OpenLayers.Event.stop(event); -} - -function onMouseMove(event) { -    event = event || window.event; -    if (!marker_catched) {return;} -    marker.icon.px = null; -    marker.icon.moveTo(new OpenLayers.Pixel(event.xy.x + delta_x, -                                            event.xy.y + delta_y + 20)); -    defLiveLatLon(); -    lonlat = layerMarkers.getLonLatFromViewPortPx(marker.icon.px).transform(epsg_projection, epsg_display_projection); -    live_longitude.value = lonlat.lon; -    live_latitude.value = lonlat.lat; -    OpenLayers.Event.stop(event); -} - -function onMoveEnd(event) { -    event = event || window.event; -    marker.icon.px = map.getPixelFromLonLat(marker.lonlat); -    OpenLayers.Event.stop(event); -} - -var markerOver = function (evt) { -    document.body.style.cursor='pointer'; -    OpenLayers.Event.stop(evt); -}; -var markerOut = function (evt) { -    document.body.style.cursor='auto'; -    OpenLayers.Event.stop(evt); -}; -*/ diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 4c35fdf..f395333 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -141,7 +141,10 @@ See the file COPYING for details.              }              /* Add Layers */              settings.map.addLayers(settings.map_layers); -            if (settings.map_layers.length > 1) settings.map.addControl(new OpenLayers.Control.LayerSwitcher()); +            if (settings.map_layers.length > 1){ +                settings.map.addControl(new OpenLayers.Control.LayerSwitcher( +                                        {roundedCorner:false})); +            }              /* Vectors layer */              settings.layerVectors = new OpenLayers.Layer.Vector("Vector Layer");              settings.map.addLayer(settings.layerVectors); diff --git a/chimere/static/chimere/js/main_map.js b/chimere/static/chimere/js/main_map.js deleted file mode 100644 index 42c9b28..0000000 --- a/chimere/static/chimere/js/main_map.js +++ /dev/null @@ -1,534 +0,0 @@ -/* Copyright (C) 2008-2011  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) 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 General Public License -along with this program.  If not, see <http://www.gnu.org/licenses/>. - -See the file COPYING for details. -*/ - -/* main map */ - -var current_cat = -1; - -/* open a category section */ -function toggleCategory(item){ -    var id = item.id.split('_').pop(); -    var old; -    if (current_cat != -1){ -        old = document.getElementById('maincategory_' + current_cat); -    } else { -        img = document.getElementById('maincategory_img_' + id); -        if (img.src.split('/').pop() == "minus.png"){ -            current_cat = id; -            old = document.getElementById('maincategory_' + id); -        } -    } -    if(old){ -        old.style.display = 'None'; -        old_img = document.getElementById('maincategory_img_' + current_cat); -        old_img.src = media_path + "icons/plus.png"; -    } -    if (id != current_cat){ -        current_cat = id; -        document.getElementById('maincategory_' + current_cat).style.display = 'block'; -        img = document.getElementById('maincategory_img_' + current_cat); -        img.src = media_path + "icons/minus.png"; -    } else { -        current_cat = 0; -    } -} - -/* reopen the current opened categories when a redraw occurs */ -function reOpenCurrent(){ -    if (current_cat && current_cat != -1){ -        document.getElementById('maincategory_' + current_cat).style.display = 'block'; -        img = document.getElementById('maincategory_img_' + current_cat); -        img.src = media_path + "icons/minus.png"; -    } -} - -function reCheckCategories(){ -    /* recheck categories when a redraw occurs */ -    if (!checked_categories){ -        return; -    } -    var checked_categories_ids = checked_categories.split('_'); -    inputs = window.document.forms["frm_categories"]; -    for (var i = 0; i < inputs.length; i++) { -        input = inputs[i]; -        cat_id = input.name.split('_').pop(); -        if (checked_categories_ids.indexOf(cat_id) != -1){ -            input.checked = true; -        } -        if (input.id == 'display_submited' && display_submited == true){ -            input.checked = true; -        } -    } -} - -/* get available subcategories for a designed category */ -function getSubcategories(category_id){ -    var ul = document.getElementById('maincategory_'+category_id); -    var subcats = new Array(); -    for (i in ul.children){ -        var li = ul.children[i]; -        if (li.id){ -            subcats.push(li.id.split('_').pop()); -        } -    } -    return subcats; -} - -/* check all the categories if clicked, unckeck if unclick */ -function checkAll(item){ -    check = false; -    if(item.checked == true){ -        check = true; -    } -    id = item.id.split('_').pop(); -    var subcats = getSubcategories(id); -    for (i=0;i < subcats.length; i++){ -        var checkbox = document.getElementById('category_'+subcats[i]); -        checkbox.checked = check; -    } -} - -var map; -var permalink; - -/* default size and offset for icon */ -var size = new OpenLayers.Size(21, 25); -var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); - -/* define global variable */ -var markers = new Array(); -var layerMarkers; -var layerVectors; - -var simple = false; -var first = true; - -var currentPopup; -var currentFeature; -var clicked = false; - -/* show a popup */ -function showPop(feature) { -    if (currentPopup != null) { -      currentPopup.hide(); -    } -    if (feature.popup == null) { -        feature.popup = feature.createPopup(); -        map.addPopup(feature.popup); -    } else { -        feature.popup.toggle(); -    } -    currentPopup = feature.popup; -    /* hide on click on the cloud */ -    currentPopup.groupDiv.onclick = hidePopUp; -    permalink.updateLink(); -} - -/* check checked categories */ -var checked_categories; -var display_submited = false; - -function updateCheckedCategories(){ -    /* get checked categories */ -    inputs = window.document.forms["frm_categories"]; -    checked_categories = ''; -    display_submited = false; -    for (var i = 0; i < inputs.length; i++) { -        input = inputs[i]; -        // 'category_'.length : 9 -        if (input.checked -             && input.name.substring(9, 0) == 'category_'){ -            id = input.name.substring(9, input.name.length); -            if(checked_categories) checked_categories += '_'; -            checked_categories += id; -        } -        if (input.checked && input.name == 'display_submited'){ -            display_submited = true; -        } -    } -    permalink.updateLink(); -} - -/* load marker and route layer from a JSON feature string */ -function loadLayersFromJSON(layer_markers, layer_vectors, geo_objects){ -    for (var i = 0; i < geo_objects.features.length; i++) { -        var feature = geo_objects.features[i]; -        if (feature.geometry.type == 'Point'){ -            putMarker(layer_markers, feature); -        } else if (feature.geometry.type == 'LineString') { -            putRoute(layer_vectors, feature); -        } -    } -} - -/* zoom to an area */ -function zoomToArea(left, top, right, bottom){ -    var bounds = new OpenLayers.Bounds(left, bottom, right, top); -    bounds.transform(epsg_display_projection, epsg_projection); -    map.zoomToExtent(bounds, true); -    loadCategories(); -} - -/* zoom to a desired category */ -function zoomToCategory(category_id){ -    var sub_cats = getSubcategories(category_id).join('_'); -    zoomToSubCategory(sub_cats); -} - -/* zoom to desired sub categories */ -function zoomToSubCategory(subcategory_ids){ -    /* 0 stand for all categories */ -    var uri = extra_url + "getGeoObjects/" + subcategory_ids; -    if (display_submited) uri += "/A_S"; -    OpenLayers.loadURL(uri, '', this, zoomToCategoryExtent); -} - -/* zoom to a selected category from an http response GeoJSON */ -function zoomToCategoryExtent(response){ -    if (response.responseText.indexOf('no results') != -1) return; -    var fakeLayerVectors = new OpenLayers.Layer.Vector("Fake vector layer"); -    var fakeLayerMarkers = new OpenLayers.Layer.Markers('Fake POIs layer'); -    var json = new OpenLayers.Format.JSON(); -    var geo_objects = json.read(response.responseText); -    /* load every geo object */ -    loadLayersFromJSON(fakeLayerMarkers, fakeLayerVectors, geo_objects); -    var bounds = fakeLayerMarkers.getDataExtent(); -    if (bounds){ -        bounds.extend(fakeLayerVectors.getDataExtent()); -    } else { -        bounds = fakeLayerVectors.getDataExtent(); -    } -    if(bounds){ -        map.zoomToExtent(bounds); -    } -    fakeLayerMarkers.destroy(); -    fakeLayerVectors.destroy(); -    loadCategories(); -} - -/* update the categories with an AJAX request */ -function loadCategories(){ -    var current_extent = map.getExtent().transform(map.getProjectionObject(), -                                                   epsg_display_projection); -    current_extent = current_extent.toArray().join('_') -    current_extent = current_extent.replace(/\./g, 'D'); -    current_extent = current_extent.replace(/-/g, 'M'); -    var uri = extra_url + "getAvailableCategories/" + current_extent; -    if (display_submited) uri += "/A_S"; -    OpenLayers.loadURL(uri, '', this, updateCategories); -} - -function updateCategories(response){ -    if (response.responseText.indexOf('no results') != -1) { -        return; -    } -    document.getElementById('categories').innerHTML = response.responseText; -    reCheckCategories(); -    reOpenCurrent(); -} - -/* load geo objects with an AJAX request */ -function loadGeoObjects(){ -    if (!first){ updateCheckedCategories(); } -    else if (p_checked_categories){ -        checked_categories = p_checked_categories.join('_'); -    } -    first = false; -    /* 0 stand for all categories */ -    if (!checked_categories) checked_categories = '0'; -    var uri = extra_url + "getGeoObjects/" + checked_categories; -    if (display_submited) uri += "/A_S"; -    OpenLayers.loadURL(uri, '', this, setGeoObjects); -} - -/* update the marker and vector layers from an http response GeoJSON */ -function setGeoObjects(response){ -    if(layerMarkers) layerMarkers.destroy(); -    if(layerVectors) layerVectors.destroy(); -    if (response.responseText.indexOf('no results') == -1) { -        /* clean the marker layer */ -        if (currentPopup) { -            currentPopup.hide(); -            if (!simple){ -                hide('detail'); -            } -        } -        layerVectors = new OpenLayers.Layer.Vector("Vector Layer"); -        map.addLayer(layerVectors); -        layerVectors.setOpacity(0.8); -        layerMarkers = new OpenLayers.Layer.Markers('POIs'); -        map.addLayer(layerMarkers); -        layerMarkers.setOpacity(0.8); - -        var json = new OpenLayers.Format.JSON(); -        var geo_objects = json.read(response.responseText); -        /* load every geo object */ -        loadLayersFromJSON(layerMarkers, layerVectors, geo_objects); -        /* -        var geojson = new OpenLayers.Format.GeoJSON(); -        var markers_pt = geojson.read(response.responseText); -        for (var i = 0; i < markers_pt.length; i++) { -            putMarker2(markers_pt[i]); -        }*/ -    } -} - -/* put a route on the map */ -function putRoute(layer, route) { -    var polyline = route.geometry; -    var point_array = new Array(); -    for (i=0; i<polyline.coordinates.length; i++){ -        var point = new OpenLayers.Geometry.Point(polyline.coordinates[i][0], -                                                  polyline.coordinates[i][1]); -        point_array.push(point); -    } -    var linestring = new OpenLayers.Geometry.LineString(point_array); -    linestring.transform(epsg_display_projection, map.getProjectionObject()); -    currentFeature = new OpenLayers.Feature.Vector(); - -    var style = OpenLayers.Util.extend({}, -                                OpenLayers.Feature.Vector.style['default']); -    style.strokeColor = route.properties.color; -    style.strokeWidth = 3; -    currentFeature.style = style; -    currentFeature.geometry = linestring; -    layer.addFeatures([currentFeature]); -} - - -/* put a marker on the map */ -function putMarker(layer, mark) { -    /* initialise a new marker with appropriate attribute for setting a -    marker */ -    lat = mark.geometry.coordinates[1]; -    lon = mark.geometry.coordinates[0]; -    var size = new OpenLayers.Size(mark.properties.icon_width, -                                   mark.properties.icon_height); -    iconclone = new OpenLayers.Icon(media_path + mark.properties.icon_path, -                                    size, offset); -    var feature = new OpenLayers.Feature(markers, -              new OpenLayers.LonLat(lon, lat).transform(epsg_display_projection, -                                                        epsg_projection), -              {icon:iconclone}); -    /*feature.closeBox = false;*/ -    feature.pk = mark.properties.pk; -    feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud); -    feature.data.popupContentHTML = "<div class='cloud'>"; -    feature.data.popupContentHTML += mark.properties.name; -    feature.data.popupContentHTML += "</div>"; -    feature.data.overflow = 'hidden'; -    var marker = feature.createMarker(); -    /* manage markers events */ -    var markerClick = function (evt) { -        currentFeature = this; -        if (clicked) { -            if (currentPopup == this.popup) { -                this.popup.hide(); -                clicked = false; -                if (!simple){ -                    hide('detail'); -                } -            } else { -                currentPopup.hide(); -                showPop(this); -                updateDetail(this.pk); -            } -        } else { -            showPop(this); -            clicked = true; -            updateDetail(this.pk); -        } -        OpenLayers.Event.stop(evt); -    }; -    var markerOver = function (evt) { -        document.body.style.cursor='pointer'; -        OpenLayers.Event.stop(evt); -    }; -    var markerOut = function (evt) { -        document.body.style.cursor='auto'; -        OpenLayers.Event.stop(evt); -    }; -    marker.events.register('click', feature, markerClick); -    marker.events.register('mouseover', feature, markerOver); -    marker.events.register('mouseout', feature, markerOut); -    layer.addMarker(marker); -    /* show the item when designed in the permalink */ -    if (p_current_feature == feature.pk){ -        p_current_feature = null; -        showPop(feature); -        clicked = true; -        updateDetail(feature.pk); -        map.setCenter(feature.lonlat, 17); -        updateCategories(); -    } -    return feature; -} - -var hidePopUp = function (evt) { -    if (clicked) { -        currentPopup.hide(); -        clicked = false; -        if (!simple){ -            hide('detail'); -        } -    } -} - -var refreshMapItems = function (evt) { -    loadCategories(); -} - -/* update current detail panel with an AJAX request */ -function updateDetail(pk){ -    var uri = extra_url + "getDetail/" + pk; -    if (simple){uri += "/?simple=True"} -    OpenLayers.loadURL(uri, '', this, setDetail); -} - -/* update the detail panel from an http response */ -function setDetail(response){ -    if (response.responseText.indexOf('no results') == -1) { -        if (!simple){ -            document.getElementById('detail').innerHTML = response.responseText; -            show('detail'); -        } else { -            currentPopup.setContentHTML("<div class='cloud'>" + -                                              response.responseText + "</div>"); -        } -    } -} - -/* show the detail of a category */ -function displayCategoryDetail(category_id) { -    var uri = extra_url + "getDescriptionDetail/" + category_id; -    OpenLayers.loadURL(uri, '', this, setCategoryDetail); -} - -/* update the category detail panel from an http response */ -function setCategoryDetail(response){ -    if (response.responseText.indexOf('no results') == -1) { -        document.getElementById('category_detail').innerHTML =  -                                                response.responseText; -        show('category_detail'); -    } -} - -/* new permalink createParams method - update when facilities are given to -personalize the permalink */ -function createParams(center, zoom, layers) { -    center = center || this.map.getCenter(); -    var params = OpenLayers.Util.getParameters(this.base); -    // If there's still no center, map is not initialized yet. -    // Break out of this function, and simply return the params from the -    // base link. -    if (center) { -        center.transform(epsg_projection, epsg_display_projection); -        //zoom -        params.zoom = zoom || this.map.getZoom(); -        //lon,lat -        var lat = center.lat; -        var lon = center.lon; -        params.lat = Math.round(lat*100000)/100000; -        params.lon = Math.round(lon*100000)/100000; -        //layers -        layers = layers || this.map.layers; -        params.layers = ''; -        for (var i=0, len=layers.length; i<len; i++) { -            var layer = layers[i]; - -            if (layer.isBaseLayer) { -                params.layers += (layer == this.map.baseLayer) ? "B" : "0"; -            } else { -                params.layers += (layer.getVisibility()) ? "T" : "F"; -            } -        } -        /* only piece of code added */ -        params.checked_categories = checked_categories; -        params.display_submited = display_submited; -        if(currentFeature){ -            params.current_feature = currentFeature.pk; -        } -    } -    return params; -} - -/* main initialisation function */ -function init(){ -    /* set the main map */ -    var options = { -        controls:[new OpenLayers.Control.Navigation(), -                  new OpenLayers.Control.PanPanel(), -                  new OpenLayers.Control.ZoomPanel(), -                  new OpenLayers.Control.ScaleLine()], -        maxResolution: 156543.0399, -        units: 'm', -        projection: new OpenLayers.Projection('EPSG:4326'), -        theme:null -    }; -    if (restricted_extent){ -        restricted_extent.transform(epsg_display_projection, epsg_projection); -        options['restrictedExtent'] = restricted_extent; -    } -    map = new OpenLayers.Map('map', options); -    permalink = new OpenLayers.Control.Permalink("permalink"); -    permalink.createParams = createParams; -    map.addControl(permalink); -    // update with the translated permalink label -    if(permalink_label && permalink.div && permalink.div.childNodes.length > 0){ -        permalink.div.childNodes[0].textContent = permalink_label; -    } -    map.addLayers([map_layer]); - -    map.events.register('click', map, hidePopUp); -    if (dynamic_categories){ -        map.events.register('moveend', map, refreshMapItems); -    } -    /* if from a permalink */ -    if (p_zoom) { -        var p_centerLonLat = new OpenLayers.LonLat(p_lon, p_lat); -        p_centerLonLat.transform(epsg_display_projection, epsg_projection); -        map.setCenter(p_centerLonLat, p_zoom); -        if (p_display_submited) { -            document.getElementById('display_submited_check').checked = true; -        } -        if (p_checked_categories){ -            /* ckeck selected categories and uncheck others */ -            inputs = window.document.forms["frm_categories"]; -            for (var i = 0; i < inputs.length; i++) { -                input = inputs[i]; -                if (input.name.substring(9, 0) == 'category_'){ -                    id = input.name.substring(9, input.name.length); -                    input.checked = false; -                    for (var cc=0; cc < p_checked_categories.length; cc++){ -                        if (p_checked_categories[cc] == id){ -                            input.checked = true; -                        } -                    } -                } -            } -            checked_categories = p_checked_categories.join('_'); -        } -    } -    /* if not zoom to the extent in cookies */ -    else if (!zoomToCurrentExtent(map)){ -        /* if no extent in cookies zoom to default */ -        map.setCenter(centerLonLat, 13); -    } -    loadCategories(); -    loadGeoObjects(); -} diff --git a/chimere/templates/chimere/blocks/head_chimere.html b/chimere/templates/chimere/blocks/head_chimere.html index 8b92c6c..d24a13a 100644 --- a/chimere/templates/chimere/blocks/head_chimere.html +++ b/chimere/templates/chimere/blocks/head_chimere.html @@ -17,7 +17,7 @@      OpenLayers.ImgPath = '{{ STATIC_URL }}chimere/img/';      var EPSG_PROJECTION = epsg_projection = new OpenLayers.Projection('EPSG:{{ EPSG_PROJECTION }}');      var CENTER_LONLAT = centerLonLat = new OpenLayers.LonLat{{ DEFAULT_CENTER }}.transform(epsg_display_projection, epsg_projection); -    var map_layer = {{ MAP_LAYER|safe }}; +    /*var map_layer = {{ MAP_LAYER|safe }};*/      var restricted_extent;      {% if area_name %}      var area_name = '{{ area_name }}';{% endif %} diff --git a/chimere/templates/chimere/blocks/map_params.html b/chimere/templates/chimere/blocks/map_params.html index 448e206..84b365e 100644 --- a/chimere/templates/chimere/blocks/map_params.html +++ b/chimere/templates/chimere/blocks/map_params.html @@ -1,7 +1,7 @@  {% load i18n %}  <script type="text/javascript">      var chimere_init_options = {}; -    chimere_init_options["map_layers"] = [new OpenLayers.Layer.OSM.Mapnik('Mapnik')]; +    chimere_init_options["map_layers"] = [{{map_layers|safe|escape}}];      chimere_init_options['permalink_label'] = '{%trans "Permalink"%}';      {% if dynamic_categories %}chimere_init_options['dynamic_categories'] = 1;{% endif %}      {% if default_area %} diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index e2f7cc9..14d58ec 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -8,6 +8,7 @@ from django.conf import settings  from django.core.urlresolvers import reverse  from chimere.models import Marker, Area, News +from chimere.widgets import get_map_layers  log = getLogger(__name__) @@ -81,7 +82,7 @@ def head_chimere(context):              "DEFAULT_CENTER": settings.CHIMERE_DEFAULT_CENTER,              "DEFAULT_ZOOM": settings.CHIMERE_DEFAULT_ZOOM,              "RESTRICTED_EXTENT": settings.CHIMERE_RESTRICTED_EXTENT, -            "MAP_LAYER": settings.CHIMERE_MAP_LAYER, +            "MAP_LAYER": settings.CHIMERE_DEFAULT_MAP_LAYER,              "OSM_CSS_URLS": settings.OSM_CSS_URLS,              "OSM_JS_URLS": settings.OSM_JS_URLS,               } @@ -98,6 +99,8 @@ def map_params(context):      context_data['icon_offset_y'] = settings.CHIMERE_ICON_OFFSET_Y      context_data['icon_width'] = settings.CHIMERE_ICON_WIDTH      context_data['icon_height'] = settings.CHIMERE_ICON_HEIGHT +    area_name = context['area_name'] if 'area_name' in context else 'area_name' +    context_data['map_layers'] = ", ".join(get_map_layers(area_name))      if 'request' not in context:          return context_data      request = context['request'] diff --git a/chimere/views.py b/chimere/views.py index 7dc6669..489d235 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -91,7 +91,7 @@ def index(request, area_name=None, default_area=None, simple=False):                           'error_message':'', 'default_area':default_area,                           'news_visible': news_visible,                           'areas_visible': settings.CHIMERE_DISPLAY_AREAS, -                         'map_layer':settings.CHIMERE_MAP_LAYER, +                         'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,                           'dynamic_categories':settings.CHIMERE_DYNAMIC_CATEGORIES,                          })      tpl = 'chimere/main_map.html' @@ -199,7 +199,7 @@ def edit(request, area_name="", item_id=None, submited=False):      response_dct.update({          'actions':actions,          'action_selected':('contribute', 'edit'), -        'map_layer':settings.CHIMERE_MAP_LAYER, +        'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,          'form':form,          'formset_multi':formset_multi,          'formset_picture':formset_picture, @@ -300,7 +300,7 @@ def editRoute(request, area_name="", item_id=None, submited=False):          'actions':actions,          'action_selected':('contribute', 'edit-route'),          'error_message':'', -        'map_layer':settings.CHIMERE_MAP_LAYER, +        'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,          'form':form,          'formset_multi':formset_multi,          'formset_picture':formset_picture, diff --git a/chimere/widgets.py b/chimere/widgets.py index 328605f..2637145 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -22,6 +22,7 @@ Extra widgets and fields  """  from django import conf  from django import forms +from django.core.exceptions import ObjectDoesNotExist  from django.conf import settings  from django.contrib.gis.db import models  from django.contrib.gis.geos import fromstr @@ -42,7 +43,7 @@ def getMapJS(area_name=''):                                                 settings.CHIMERE_DEFAULT_CENTER      js += u"var media_path = '%s';\n" % settings.MEDIA_URL      js += u"var static_path = '%s';\n" % settings.STATIC_URL -    js += u"var map_layer = %s;\n" % settings.CHIMERE_MAP_LAYER +    js += u"var map_layer = %s;\n" % settings.CHIMERE_DEFAULT_MAP_LAYER      js += u"var restricted_extent;\n"      if area_name: @@ -56,6 +57,28 @@ def getMapJS(area_name=''):           u"%s// !--></script>\n" % js      return js +def get_map_layers(area_name=''): +    from chimere.models import Area +    area = None +    if area_name: +        try: +            area = Area.objects.get(name=area_name) +        except ObjectDoesNotExist: +            pass +    else: +        try: +            area = Area.objects.get(default=True) +        except ObjectDoesNotExist: +            pass +    map_layers = [] +    if area and area.layers.count(): +        map_layers = [layer.layer_code for layer in area.layers.all()] +    elif settings.CHIMERE_DEFAULT_MAP_LAYER: +        map_layers = [settings.CHIMERE_DEFAULT_MAP_LAYER] +    else: +        map_layers = ["new OpenLayers.Layer.OSM.Mapnik('Mapnik')"] +    return map_layers +  class ChosenSelectWidget(forms.Select):      """      Chosen select widget. @@ -126,21 +149,21 @@ class PointChooserWidget(forms.TextInput):                      value = None              else:                  value = None +        map_layers = get_map_layers(area_name)          js = """          var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s');          var EPSG_PROJECTION = epsg_projection = new OpenLayers.Projection('EPSG:%s');          var chimere_init_options = {}; -        chimere_init_options["map_layers"] = [new OpenLayers.Layer.OSM.Mapnik('Mapnik')]; +        chimere_init_options["map_layers"] = [%s];          chimere_init_options['dynamic_categories'] = false;          chimere_init_options['edition'] = true;          chimere_init_options["checked_categories"] = [];          """ % (settings.CHIMERE_EPSG_DISPLAY_PROJECTION, -               settings.CHIMERE_EPSG_PROJECTION) +               settings.CHIMERE_EPSG_PROJECTION, +               ", ".join(map_layers))          #TODO: manage area          tpl = u"<script type='text/javascript'><!--\n"\                u"%s// !--></script>\n" % js -        #tpl += u'<script src="%schimere/js/edit_map.js"></script>\n' % \ -        #                                             settings.STATIC_URL          tpl += u"<div id='map_edit'></div>"\                 u"<div id='live_lonlat'>"\                 u"    <p><label for='live_latitude'>%s</label>"\ @@ -197,17 +220,19 @@ class RouteChooserWidget(forms.TextInput):          Render a map and latitude, longitude information field          '''          tpl = getMapJS(area_name) +        map_layers = get_map_layers(area_name)          js = """          var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s');          var EPSG_PROJECTION = epsg_projection = new OpenLayers.Projection('EPSG:%s');          var chimere_init_options = {}; -        chimere_init_options["map_layers"] = [new OpenLayers.Layer.OSM.Mapnik('Mapnik')]; +        chimere_init_options["map_layers"] = [%s];          chimere_init_options['dynamic_categories'] = false;          chimere_init_options['edition'] = true;          chimere_init_options['edition_type_is_route'] = true;          chimere_init_options["checked_categories"] = [];          """ % (settings.CHIMERE_EPSG_DISPLAY_PROJECTION, -               settings.CHIMERE_EPSG_PROJECTION) +               settings.CHIMERE_EPSG_PROJECTION, +               ", ".join(map_layers))          tpl = u"<script type='text/javascript'><!--\n"\                u"%s// !--></script>\n" % js          #TODO: manage area diff --git a/example_project/settings.py b/example_project/settings.py index b0d4188..332198e 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -71,10 +71,10 @@ CHIMERE_DEFAULT_CATEGORIES = [1]  # display picture inside the description by default or inside a galery?  CHIMERE_MINIATURE_BY_DEFAULT = False -# JS definition of the main map cf. OpenLayers documentation for more details -#MAP_LAYER = '''new OpenLayers.Layer.OSM.CycleMap("Cycle map", { -#displayOutsideMaxExtent: true, wrapDateLine: true})''' # OSM cyclemap -CHIMERE_MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map +# JS definition of the default map (for admin and when no map are defined in +# the application) +# cf. OpenLayers documentation for more details +CHIMERE_DEFAULT_MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map  CHIMERE_XAPI_URL = 'http://open.mapquestapi.com/xapi/api/0.6/'  CHIMERE_OSM_API_URL = 'api06.dev.openstreetmap.org' # test URL | 
