diff --git a/main/atlasAPI.py b/main/atlasAPI.py index 360c0ccda..fcd2c36a7 100644 --- a/main/atlasAPI.py +++ b/main/atlasAPI.py @@ -39,6 +39,12 @@ def getObservationsMailleAPI(cd_ref): connection.close() return Response(json.dumps(observations), mimetype='application/json') +@api.route('/observationsMailleLastObs/',methods=['GET']) +def getObservationsMailleLastObsAPI(cd_ref): + connection = utils.engine.connect() + observations = vmObservationsMaillesRepository.getObservationsMaillesLastObsChilds(connection, cd_ref) + connection.close() + return Response(json.dumps(observations), mimetype='application/json') @api.route('/observationsPoint/', methods=['GET']) def getObservationsPointAPI(cd_ref): diff --git a/main/atlasRoutes.py b/main/atlasRoutes.py index 3b41b7406..aa8aed406 100644 --- a/main/atlasRoutes.py +++ b/main/atlasRoutes.py @@ -160,6 +160,7 @@ def ficheEspece(cd_ref): 'PROTECTION': config.PROTECTION, 'GLOSSAIRE': config.GLOSSAIRE, 'AFFICHAGE_MAILLE': config.AFFICHAGE_MAILLE, + 'TYPE_MAILLE': config.TYPE_MAILLE, 'ZOOM_LEVEL_POINT': config.ZOOM_LEVEL_POINT, 'LIMIT_CLUSTER_POINT': config.LIMIT_CLUSTER_POINT, 'FICHE_ESPECE': True, diff --git a/main/configuration/config.py.sample b/main/configuration/config.py.sample index 0a0ef2a64..68939fc92 100644 --- a/main/configuration/config.py.sample +++ b/main/configuration/config.py.sample @@ -64,6 +64,9 @@ MAP = { # True = maille / False = point AFFICHAGE_MAILLE = False +#Couleur selon la dernière obs (<5 ans, 5 à 10 ans, +10 ans) "last obs" ou le nombre d'obs "nb obs" +TYPE_MAILLE = 'nb obs' + # Niveau de zoom à partir duquel on passe à l'affichage en point (si AFFICHAGE_MAILLE = False) ZOOM_LEVEL_POINT = 11 diff --git a/main/modeles/repositories/vmObservationsMaillesRepository.py b/main/modeles/repositories/vmObservationsMaillesRepository.py index 3301ca73a..042337779 100644 --- a/main/modeles/repositories/vmObservationsMaillesRepository.py +++ b/main/modeles/repositories/vmObservationsMaillesRepository.py @@ -32,6 +32,38 @@ def getObservationsMaillesChilds(connection, cd_ref): tabObs.append(temp) return tabObs +#Maille avec date de derniere obs seulement +def getObservationsMaillesLastObsChilds(connection, cd_ref): + sql = """ + SELECT + obs.id_maille, + obs.geojson_maille, + max(date_part('year', o.dateobs)) as lastyear, + count(*) as nb_obs + FROM atlas.vm_observations_mailles obs + JOIN atlas.vm_observations o ON o.id_observation = obs.id_observation + WHERE obs.cd_ref in ( + SELECT * FROM atlas.find_all_taxons_childs(:thiscdref) + ) + OR obs.cd_ref = :thiscdref + GROUP BY obs.id_maille, obs.geojson_maille + ORDER BY id_maille""" + observations = connection.execute(text(sql), thiscdref=cd_ref) + tabObs = list() + for o in observations: + temp = { + 'properties':{ + 'id_maille': o.id_maille, + 'nb_observations': o.nb_obs, + 'lastyear': o.lastyear + }, + 'geometry': ast.literal_eval(o.geojson_maille), + 'type' : "Feature" + } + tabObs.append(temp) + outGeoJson={'type':"FeatureCollection", 'features':tabObs} + return outGeoJson + # last observation for index.html def lastObservationsMailles(connection, mylimit, idPhoto): diff --git a/static/mapGenerator.js b/static/mapGenerator.js index cbddecc33..d560dda40 100644 --- a/static/mapGenerator.js +++ b/static/mapGenerator.js @@ -593,7 +593,7 @@ function generateSliderOnMap(){ }, onAdd: function (map) { - var sliderContainer = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-slider-control'); + sliderContainer = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-slider-control'); sliderContainer.style.backgroundColor = 'white'; sliderContainer.style.width = '300px'; diff --git a/static/mapMaillesLastObs.js b/static/mapMaillesLastObs.js new file mode 100644 index 000000000..9207a6d69 --- /dev/null +++ b/static/mapMaillesLastObs.js @@ -0,0 +1,151 @@ +var map = generateMap(); +generateSliderOnMap(); +var legend = L.control({position: 'bottomright'}); + +// Legende + +htmlLegend = "       Limite du "+ configuration.STRUCTURE; +generateLegende(htmlLegend); + + +// Current observation Layer: leaflet layer type +var currentLayer; + +// Current observation geoJson: type object +var myGeoJson; + +var compteurLegend = 0; // compteur pour ne pas rajouter la légende à chaque fois + +function styleMailleAtlas(feature) { + var fillColor ; + var currentYear = new Date().getFullYear() ; + var obsyear = feature.properties.lastyear ; + if(feature.properties.lastyear <= currentYear - 10){ + fillColor='red' ; + }else if(feature.properties.lastyear <= currentYear - 5) { + fillColor='yellow'; + }else{ + fillColor='green'; + } + + return { + fillColor: fillColor, + weight: 0.5, + color: 'white', + fillOpacity: 0.8 + }; +} + +L.DomUtil.remove(sliderContainer); //Remove slider created in mapGenerator.js + +$.ajax({ + url: configuration.URL_APPLICATION+'/api/observationsMailleLastObs/'+cd_ref, + dataType: "json", + beforeSend: function(){ + $('#loadingGif').attr('src', configuration.URL_APPLICATION+'/static/images/loading.svg') + } + }).done(function(observations) { + $('#loadingGif').hide(); + + currentLayer = L.geoJson(observations, { + onEachFeature : function (feature, layer){ + popupContent = "Nombre d'observations "+feature.properties.nb_observations+"
Dernière d'observations "+feature.properties.lastyear ; + + layer.bindPopup(popupContent) + }, + style: styleMailleAtlas, + }).addTo(map); + currentLayer.bringToFront(); + /* + // affichage des mailles + displayMailleLayerFicheEspece(observations, taxonYearMin, YEARMAX); + + //display nb observations + $("#nbObsLateral").html(""+observations.length+"
Observations" ); + + + + // pointer on first and last obs + $('.pointer').css('cursor', 'pointer'); + //display nb observations + nbObs=0; + myGeoJson.features.forEach(function(l){ + nbObs += l.properties.nb_observations + }) + $("#nbObs").html("Nombre d'observation(s): "+ nbObs); + + + + // Slider event + mySlider.on("change",function(){ + years = mySlider.getValue(); + yearMin = years[0]; + yearMax = years[1]; + map.removeLayer(currentLayer); + displayMailleLayerFicheEspece(observations, yearMin, yearMax) + + + nbObs=0; + myGeoJson.features.forEach(function(l){ + nbObs += l.properties.nb_observations + }) + + $("#nbObs").html("Nombre d'observation(s): "+ nbObs); + + }); + + + // Stat - map interaction + $('#firstObs').click(function(){ + var firstObsLayer; + var year = new Date('2400-01-01'); + + + var layer = (currentLayer._layers); + for (var key in layer) { + layer[key].feature.properties.tabDateobs.forEach(function(thisYear){ + if (thisYear <= year){ + year = thisYear; + firstObsLayer = layer[key]; + } + }); + } + + + var bounds = L.latLngBounds([]); + var layerBounds = firstObsLayer.getBounds(); + bounds.extend(layerBounds); + map.fitBounds(bounds, { + maxZoom : 12 + }); + + firstObsLayer.openPopup(); + }) + + $('#lastObs').click(function(){ + var firstObsLayer; + var year = new Date('1800-01-01'); + + + var layer = (currentLayer._layers); + for (var key in layer) { + layer[key].feature.properties.tabDateobs.forEach(function(thisYear){ + if (thisYear >= year){ + year = thisYear; + firstObsLayer = layer[key]; + } + }); + } + + + var bounds = L.latLngBounds([]); + var layerBounds = firstObsLayer.getBounds(); + bounds.extend(layerBounds); + map.fitBounds(bounds, { + maxZoom : 12 + }); + + firstObsLayer.openPopup(); + })*/ +}); + diff --git a/templates/ficheEspece.html b/templates/ficheEspece.html index 7f8554309..233a22ced 100644 --- a/templates/ficheEspece.html +++ b/templates/ficheEspece.html @@ -553,7 +553,11 @@

Observations mensuelles

{% if configuration.AFFICHAGE_MAILLE %} + {% if configuration.TYPE_MAILLE == "last obs" %} + + {% else %} + {% endif %} {% else %} {% endif %}