Skip to content

Commit

Permalink
Merge pull request #440 from MTES-MCT/feature/agrivoltaisme-et-2150
Browse files Browse the repository at this point in the history
Agrivoltaïsme : prise en compte du cas particulier photovoltaïque pour la rubrique 2150 de la Loi sur l'eau
  • Loading branch information
pyDez authored Oct 8, 2024
2 parents d0ee284 + cd6bb36 commit 0027c3b
Show file tree
Hide file tree
Showing 7 changed files with 344 additions and 22 deletions.
102 changes: 80 additions & 22 deletions envergo/moulinette/regulations/loisurleau.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,23 +229,48 @@ class EcoulementSansBV(CriterionEvaluator):
choice_label = "Loi sur l'eau > Écoulement EP sans BV"
slug = "ecoulement_sans_bv"

CODES = ["soumis", "action_requise", "non_soumis"]
CODES = [
"soumis",
"action_requise",
"non_soumis",
"action_requise_pv_sol",
"non_soumis_pv_sol",
]

RESULT_MATRIX = {
"soumis": RESULTS.soumis,
"action_requise_pv_sol": RESULTS.action_requise,
"action_requise": RESULTS.action_requise,
"non_soumis_pv_sol": RESULTS.non_soumis,
"non_soumis": RESULTS.non_soumis,
}

CODE_MATRIX = {
"big": "soumis",
"medium": "action_requise",
"small": "non_soumis",
("gte_1ha", "non_pv_sol"): "soumis",
("gte_9000", "non_pv_sol"): "soumis",
("gte_8000", "non_pv_sol"): "action_requise",
("lt_8000", "non_pv_sol"): "non_soumis",
("gte_1ha", "pv_sol"): "action_requise_pv_sol",
("gte_9000", "pv_sol"): "action_requise_pv_sol",
("gte_8000", "pv_sol"): "non_soumis_pv_sol",
("lt_8000", "pv_sol"): "non_soumis_pv_sol",
}

def get_result_data(self):
if self.catalog["final_surface"] >= 10000:
project_size = "big"
final_surface = "gte_1ha"
elif self.catalog["final_surface"] >= 9000:
final_surface = "gte_9000"
elif self.catalog["final_surface"] >= 8000:
project_size = "medium"
final_surface = "gte_8000"
else:
project_size = "small"
final_surface = "lt_8000"

return project_size
is_pv_sol = "non_pv_sol"
if self.moulinette.raw_data.get("evalenv_rubrique_30-localisation") == "sol":
is_pv_sol = "pv_sol"

return final_surface, is_pv_sol


# This was the old evaluator name
Expand All @@ -258,27 +283,54 @@ class EcoulementAvecBV(CriterionEvaluator):
choice_label = "Loi sur l'eau > Écoulement EP avec BV"
slug = "ecoulement_avec_bv"

CODES = ["soumis", "action_requise_probable_1ha", "action_requise", "non_soumis"]
CODES = [
"soumis",
"action_requise_probable_1ha",
"action_requise",
"non_soumis",
"action_requise_pv_sol",
"non_soumis_pv_sol",
]

CODE_MATRIX = {
("gt_11000", "gt_1ha"): "soumis",
("gt_11000", "gt_7000"): "action_requise_probable_1ha",
("gt_11000", "gt_500"): "action_requise",
("gt_11000", "lt_500"): "non_soumis",
("gt_9000", "gt_1ha"): "soumis",
("gt_9000", "gt_7000"): "action_requise",
("gt_9000", "gt_500"): "action_requise",
("gt_9000", "lt_500"): "non_soumis",
("lt_9000", "gt_1ha"): "soumis",
("lt_9000", "gt_7000"): "non_soumis",
("lt_9000", "gt_500"): "non_soumis",
("lt_9000", "lt_500"): "non_soumis",
("gt_11000", "gt_1ha", "pv_sol"): "action_requise_pv_sol",
("gt_11000", "gt_9000", "pv_sol"): "action_requise_pv_sol",
("gt_11000", "gt_7000", "pv_sol"): "non_soumis_pv_sol",
("gt_11000", "gt_500", "pv_sol"): "non_soumis_pv_sol",
("gt_11000", "lt_500", "pv_sol"): "non_soumis_pv_sol",
("gt_9000", "gt_1ha", "pv_sol"): "action_requise_pv_sol",
("gt_9000", "gt_9000", "pv_sol"): "action_requise_pv_sol",
("gt_9000", "gt_7000", "pv_sol"): "non_soumis_pv_sol",
("gt_9000", "gt_500", "pv_sol"): "non_soumis_pv_sol",
("gt_9000", "lt_500", "pv_sol"): "non_soumis_pv_sol",
("lt_9000", "gt_1ha", "pv_sol"): "action_requise_pv_sol",
("lt_9000", "gt_9000", "pv_sol"): "action_requise_pv_sol",
("lt_9000", "gt_7000", "pv_sol"): "non_soumis_pv_sol",
("lt_9000", "gt_500", "pv_sol"): "non_soumis_pv_sol",
("lt_9000", "lt_500", "pv_sol"): "non_soumis_pv_sol",
("gt_11000", "gt_1ha", "non_pv_sol"): "soumis",
("gt_11000", "gt_9000", "non_pv_sol"): "action_requise_probable_1ha",
("gt_11000", "gt_7000", "non_pv_sol"): "action_requise_probable_1ha",
("gt_11000", "gt_500", "non_pv_sol"): "action_requise",
("gt_11000", "lt_500", "non_pv_sol"): "non_soumis",
("gt_9000", "gt_1ha", "non_pv_sol"): "soumis",
("gt_9000", "gt_9000", "non_pv_sol"): "action_requise",
("gt_9000", "gt_7000", "non_pv_sol"): "action_requise",
("gt_9000", "gt_500", "non_pv_sol"): "action_requise",
("gt_9000", "lt_500", "non_pv_sol"): "non_soumis",
("lt_9000", "gt_1ha", "non_pv_sol"): "soumis",
("lt_9000", "gt_9000", "non_pv_sol"): "non_soumis",
("lt_9000", "gt_7000", "non_pv_sol"): "non_soumis",
("lt_9000", "gt_500", "non_pv_sol"): "non_soumis",
("lt_9000", "lt_500", "non_pv_sol"): "non_soumis",
}

RESULT_MATRIX = {
"soumis": RESULTS.soumis,
"action_requise_probable_1ha": RESULTS.action_requise,
"action_requise_pv_sol": RESULTS.action_requise,
"action_requise": RESULTS.action_requise,
"non_soumis_pv_sol": RESULTS.non_soumis,
"non_soumis": RESULTS.non_soumis,
}

Expand All @@ -303,6 +355,8 @@ def get_catalog_data(self):
def get_result_data(self):
if self.catalog["final_surface"] >= 10000:
final_surface = "gt_1ha"
elif self.catalog["final_surface"] >= 9000:
final_surface = "gt_9000"
elif self.catalog["final_surface"] >= 7000:
final_surface = "gt_7000"
elif self.catalog["final_surface"] >= 500:
Expand All @@ -317,7 +371,11 @@ def get_result_data(self):
else:
catchment_surface = "lt_9000"

return catchment_surface, final_surface
is_pv_sol = "non_pv_sol"
if self.moulinette.raw_data.get("evalenv_rubrique_30-localisation") == "sol":
is_pv_sol = "pv_sol"

return catchment_surface, final_surface, is_pv_sol


class OtherCriteria(CriterionEvaluator):
Expand Down
94 changes: 94 additions & 0 deletions envergo/moulinette/tests/test_loisurleau.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,20 @@ def loisurleau_criteria(france_map): # noqa
evaluator="envergo.moulinette.regulations.loisurleau.Ruissellement",
activation_map=france_map,
),
CriterionFactory(
title="Écoulement EP sans BV",
regulation=regulation,
evaluator="envergo.moulinette.regulations.loisurleau.EcoulementSansBV",
activation_map=france_map,
is_optional=True,
),
CriterionFactory(
title="Écoulement EP avec BV",
regulation=regulation,
evaluator="envergo.moulinette.regulations.loisurleau.EcoulementAvecBV",
activation_map=france_map,
is_optional=True,
),
]
return criteria

Expand Down Expand Up @@ -260,3 +274,83 @@ def test_3220_medium_footprint_within_potential_flood_zones(moulinette_data):
moulinette.catalog["potential_flood_zones_within_0m"] = True
moulinette.evaluate()
assert moulinette.loi_sur_leau.zone_inondable.result == "non_soumis"


@pytest.mark.parametrize("footprint", [9000])
def test_2150_big(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "soumis"


@pytest.mark.parametrize("footprint", [8000])
def test_2150_medium(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "action_requise"


@pytest.mark.parametrize("footprint", [7000])
def test_2150_small(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "non_soumis"


@pytest.mark.parametrize("footprint", [10000])
def test_2150_with_pv_sol_big(moulinette_data):
moulinette_data["evalenv_rubrique_30-localisation"] = "sol"
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert (
moulinette.loi_sur_leau.ecoulement_sans_bv.result_code
== "action_requise_pv_sol"
)


@pytest.mark.parametrize("footprint", [8000])
def test_2150_with_pv_sol_small(moulinette_data):
moulinette_data["evalenv_rubrique_30-localisation"] = "sol"
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "non_soumis_pv_sol"


@pytest.mark.parametrize("footprint", [10000])
def test_2150_avec_bv_big(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "soumis"


@pytest.mark.parametrize("footprint", [9000])
def test_2150_avec_bv_medium(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "action_requise"


@pytest.mark.parametrize("footprint", [7000])
def test_2150_avec_bv_small(moulinette_data):
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "non_soumis"


@pytest.mark.parametrize("footprint", [10000])
def test_2150_avec_bv_with_pv_sol_big(moulinette_data):
moulinette_data["evalenv_rubrique_30-localisation"] = "sol"
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert (
moulinette.loi_sur_leau.ecoulement_avec_bv.result_code
== "action_requise_pv_sol"
)


@pytest.mark.parametrize("footprint", [8000])
def test_2150_avec_bv_with_pv_sol_small(moulinette_data):
moulinette_data["evalenv_rubrique_30-localisation"] = "sol"
moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data)
moulinette.evaluate()
assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "non_soumis_pv_sol"
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<p>
🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet.
</p>

<p>
<strong>Action requise :</strong>
</p>

<p>Démontrer que le projet {{ criterion.required_action }}.</p>

<p>
<strong>Pourquoi cette action est-elle requise ?</strong>
</p>

{% if final_surface >= 10000 %}
<p>
La surface du projet est supérieure à 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus de 1 ha, le projet sera soumis à la Loi sur l’eau.
</p>

{% else %}
<p>
La surface du projet est proche de 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus
de 1 ha, en comptant la surface du bassin versant intercepté, le projet sera soumis à la Loi sur l’eau.
</p>

{% endif %}

<p>
Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant :
</p>

<ul>
<li>
le ruissellement au bas des panneaux peut engendrer la formation de couloirs d’écoulement, et augmente les risques
d’érosion ;
</li>
<li>
les impacts de la phase travaux (terrassement, tranchées pour l’enfouissement des câbles…) doivent être pris en
compte et ils peuvent être significatifs.
</li>
</ul>

<p>Une étude hydraulique doit donc être menée.</p>

{% if moulinette.eval_env.result == "systematique" %}
<p>
Le projet étant soumis à évaluation environnementale (voir la section <a href="#regulation_eval_env">« Évaluation environnementale »</a> dans cette
page), une étude d’impact doit être réalisée. C’est dans le cadre de celle-ci que se fera l’étude hydraulique, et
qu’il sera déterminé si la surface impactée dépasse 1 ha.
</p>
{% endif %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<p>
🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet.
</p>

<p>
<strong>Pourquoi le projet n'est-il pas concerné ?</strong>
</p>

<p>
Au vu des informations saisies, la surface du projet est inférieure à 1 ha. Le projet n’est donc pas concerné par cette rubrique de la Loi sur l’eau.
</p>

<p>
<strong>Quel impact environnemental ?</strong>
</p>
<p>
Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant :
</p>

<ul>
<li>
le ruissellement au bas des panneaux peut engendrer la formation de couloirs d’écoulement, et augmente les risques
d’érosion ;
</li>
<li>
les impacts temporaires de la phase travaux (terrassement, tranchées pour l’enfouissement des câbles…) sur
l’écoulement des eaux pluviales peuvent être significatifs.
</li>
</ul>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<p>
🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet.
</p>

<p>
<strong>Action requise :</strong>
</p>

<p>Démontrer que le projet {{ criterion.required_action }}.</p>

<p>
<strong>Pourquoi cette action est-elle requise ?</strong>
</p>

{% if final_surface >= 10000 %}
<p>
La surface du projet est supérieure à 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus de 1 ha, le projet sera soumis à la Loi sur l’eau.
</p>

{% else %}
<p>
La surface du projet est proche de 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus
de 1 ha, en comptant la surface du bassin versant intercepté, le projet sera soumis à la Loi sur l’eau.
</p>

{% endif %}

<p>
Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant :
</p>

<ul>
<li>
le ruissellement au bas des panneaux peut engendrer la formation de couloirs d’écoulement, et augmente les risques
d’érosion ;
</li>
<li>
les impacts de la phase travaux (terrassement, tranchées pour l’enfouissement des câbles…) doivent être pris en
compte et ils peuvent être significatifs.
</li>
</ul>

<p>Une étude hydraulique doit donc être menée.</p>

{% if moulinette.eval_env.result == "systematique" %}
<p>
Le projet étant soumis à évaluation environnementale (voir la section <a href="#regulation_eval_env">« Évaluation environnementale »</a> dans cette
page), une étude d’impact doit être réalisée. C’est dans le cadre de celle-ci que se fera l’étude hydraulique, et
qu’il sera déterminé si la surface impactée dépasse 1 ha.
</p>
{% endif %}
Loading

0 comments on commit 0027c3b

Please sign in to comment.