From d9191f1f6eaa4f671b98cb67d37f89ae80c31e33 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Fri, 1 Mar 2019 16:33:26 +0100 Subject: [PATCH 1/8] backend maille_lastobs --- main/atlasAPI.py | 6 +++++ .../vmObservationsMaillesRepository.py | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+) 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/modeles/repositories/vmObservationsMaillesRepository.py b/main/modeles/repositories/vmObservationsMaillesRepository.py index 3301ca73a..7ec36cc37 100644 --- a/main/modeles/repositories/vmObservationsMaillesRepository.py +++ b/main/modeles/repositories/vmObservationsMaillesRepository.py @@ -32,6 +32,32 @@ def getObservationsMaillesChilds(connection, cd_ref): tabObs.append(temp) return tabObs +def getObservationsMaillesLastObsChilds(connection, cd_ref): + sql = """ + SELECT + obs.id_maille, + obs.geojson_maille, + max(date_part('year', o.dateobs)) as lastyear + 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 = { + 'id_maille': o.id_maille, + 'nb_observations': 1, + 'lasyear': o.lastyear, + 'geojson_maille': ast.literal_eval(o.geojson_maille) + } + tabObs.append(temp) + return tabObs + # last observation for index.html def lastObservationsMailles(connection, mylimit, idPhoto): From 2f8bf7073deed787df4110510cc0c34caf75db51 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Sat, 2 Mar 2019 14:19:16 +0100 Subject: [PATCH 2/8] config --- main/atlasRoutes.py | 1 + main/configuration/config.py.sample | 3 +++ 2 files changed, 4 insertions(+) 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 From f9884c7178b20c4df475edbacf0676066e58c404 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Sat, 2 Mar 2019 15:15:07 +0100 Subject: [PATCH 3/8] change sliderContainer scope --- static/mapGenerator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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'; From e020362529d92398535877031c87455731a20d0c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Sat, 2 Mar 2019 15:15:55 +0100 Subject: [PATCH 4/8] servir directement un geojson depuis le serveur --- .../repositories/vmObservationsMaillesRepository.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/main/modeles/repositories/vmObservationsMaillesRepository.py b/main/modeles/repositories/vmObservationsMaillesRepository.py index 7ec36cc37..c40d8a7ce 100644 --- a/main/modeles/repositories/vmObservationsMaillesRepository.py +++ b/main/modeles/repositories/vmObservationsMaillesRepository.py @@ -32,6 +32,7 @@ def getObservationsMaillesChilds(connection, cd_ref): tabObs.append(temp) return tabObs +#Maille avec date de derniere obs seulement def getObservationsMaillesLastObsChilds(connection, cd_ref): sql = """ SELECT @@ -50,13 +51,16 @@ def getObservationsMaillesLastObsChilds(connection, cd_ref): tabObs = list() for o in observations: temp = { + 'properties':{ 'id_maille': o.id_maille, 'nb_observations': 1, - 'lasyear': o.lastyear, - 'geojson_maille': ast.literal_eval(o.geojson_maille) + 'lastyear': o.lastyear}, + 'geometry': ast.literal_eval(o.geojson_maille), + 'type' : "Feature" } tabObs.append(temp) - return tabObs + outGeoJson={'type':"FeatureCollection", 'features':tabObs} + return outGeoJson # last observation for index.html From 28809fe7b4ace790cb81eeee7a3290aaddb6d7f4 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Sat, 2 Mar 2019 15:16:26 +0100 Subject: [PATCH 5/8] affichage carte --- static/mapMaillesLastObs.js | 146 ++++++++++++++++++++++++++++++++++++ templates/ficheEspece.html | 4 + 2 files changed, 150 insertions(+) create mode 100644 static/mapMaillesLastObs.js diff --git a/static/mapMaillesLastObs.js b/static/mapMaillesLastObs.js new file mode 100644 index 000000000..704cfdcb1 --- /dev/null +++ b/static/mapMaillesLastObs.js @@ -0,0 +1,146 @@ +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: 2, + color: 'black', + 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(); + + L.geoJson(observations, { + //onEachFeature : onEachFeatureMaille, + style: styleMailleAtlas, + }).addTo(map); + /* + // 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 %} From 57edc4c0db925b505f08d65c6d1c7f8e90cb1024 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Sun, 3 Mar 2019 09:53:57 +0100 Subject: [PATCH 6/8] style mailles --- static/mapMaillesLastObs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/mapMaillesLastObs.js b/static/mapMaillesLastObs.js index 704cfdcb1..ab8dd2b67 100644 --- a/static/mapMaillesLastObs.js +++ b/static/mapMaillesLastObs.js @@ -30,8 +30,8 @@ function styleMailleAtlas(feature) { return { fillColor: fillColor, - weight: 2, - color: 'black', + weight: 0.5, + color: 'white', fillOpacity: 0.8 }; } From 97d7a99849304e7cd045d1452b70593725841b66 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Mon, 4 Mar 2019 10:39:02 +0100 Subject: [PATCH 7/8] maille to front --- static/mapMaillesLastObs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/mapMaillesLastObs.js b/static/mapMaillesLastObs.js index ab8dd2b67..8e81bdfa1 100644 --- a/static/mapMaillesLastObs.js +++ b/static/mapMaillesLastObs.js @@ -47,10 +47,11 @@ $.ajax({ }).done(function(observations) { $('#loadingGif').hide(); - L.geoJson(observations, { + currentLayer = L.geoJson(observations, { //onEachFeature : onEachFeatureMaille, style: styleMailleAtlas, }).addTo(map); + currentLayer.bringToFront(); /* // affichage des mailles displayMailleLayerFicheEspece(observations, taxonYearMin, YEARMAX); From f4c02e6ed8b24b4861b2273fa21d9250774a6469 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Desbas Date: Wed, 13 Mar 2019 15:46:34 +0100 Subject: [PATCH 8/8] popup --- .../repositories/vmObservationsMaillesRepository.py | 12 +++++++----- static/mapMaillesLastObs.js | 6 +++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/main/modeles/repositories/vmObservationsMaillesRepository.py b/main/modeles/repositories/vmObservationsMaillesRepository.py index c40d8a7ce..042337779 100644 --- a/main/modeles/repositories/vmObservationsMaillesRepository.py +++ b/main/modeles/repositories/vmObservationsMaillesRepository.py @@ -38,7 +38,8 @@ def getObservationsMaillesLastObsChilds(connection, cd_ref): SELECT obs.id_maille, obs.geojson_maille, - max(date_part('year', o.dateobs)) as lastyear + 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 ( @@ -51,10 +52,11 @@ def getObservationsMaillesLastObsChilds(connection, cd_ref): tabObs = list() for o in observations: temp = { - 'properties':{ - 'id_maille': o.id_maille, - 'nb_observations': 1, - 'lastyear': o.lastyear}, + 'properties':{ + 'id_maille': o.id_maille, + 'nb_observations': o.nb_obs, + 'lastyear': o.lastyear + }, 'geometry': ast.literal_eval(o.geojson_maille), 'type' : "Feature" } diff --git a/static/mapMaillesLastObs.js b/static/mapMaillesLastObs.js index 8e81bdfa1..9207a6d69 100644 --- a/static/mapMaillesLastObs.js +++ b/static/mapMaillesLastObs.js @@ -48,7 +48,11 @@ $.ajax({ $('#loadingGif').hide(); currentLayer = L.geoJson(observations, { - //onEachFeature : onEachFeatureMaille, + 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();