France/Parcs nationaux et régionaux, réserves naturelles/Import des données INPN
Suite à l'autorisation donnée par l'INPN a importer ses données, voici le plan d'action pour les importer :
Phase alpha - Mise à disposition des fichiers dans des formats plus travaillables
Accès à de gros fichiers zip qui contiennent tout
Note : Les fichiers des territoires d'Outre-Mer ne sont pas en Lambert 93, donc les données dans ces régions ne sont pas forcément bien transformées en WGS84 dans les fichiers travaillés ; sauf dans le dossier wgs84.tar.gz.
protect_class pour la nouvelle calédonie
Phase 1 - Affichage sur carte pour une analyse quantitative et qualitative
Voici une première représentation de toutes les données INPN sur toute la france
En rouge les données en provenance de l'INPN, en vert (si elles existent celles déjà présentes dans OSM).
Note : A ce jour les données d'Outre-Mer sont mal reprojetées sur cette carte (La Réunion se retrouve en Écosse, etc.)
PS: la carte est volontairement centrée sur un lieu ou on en voit deux, celle que j'ai fièrement rentré à la main, et celle de l'INPN sletuffe 16:10, 1 June 2010 (UTC)
Phase 2 - Liste des données attributaires disponibles dans les shapefile INPN
L'ensemble des shp n'est pas si homogènes, on a :
Nom du champ | format | Contenu |
---|---|---|
ID_DIREN (sauf pour conservatoire du littoral et réserves biologiques) | 12 caractères | identifiant utilisé en DIREN. Très peu rempli et incohérent. |
DATE_ (des fois DATE) | chaîne de 10 caractère au format JJ/MM/AAAA (des fois juste AAAA) | Date de l’arrêté. Assez bien renseigné. |
ID_SPN | 9 caractères | Identifiant international. Très bien renseigné et homogène. Les 2 premiers caractères indiquent le pays (ici c'est FR à chaque fois), et les deux chiffres suivants indiquent le type de protection (par exemple 23 pour les réserves biologiques dirigées et 24 pour les réserves bioogiques intégrales (qui sont dans le même fichier shapefile). Le reste est un numéro d'ordre. |
NOM | 160 caractères | Pour les PNR et RN, <raccourcis pour décrire le type> <son nom> : exemple "PNR du massif des bauges", "R. N. des hauts de chartreuse". Nom simple sinon. Toujours renseigné. Parfois en lettres capitales (à traiter pour import dans OSM) |
SUPERFICIE | entier | superficie "officielle" de la surface, peut être légèrement différent de la superficie calculée. Renseigné dans 1/3 des cas. |
Selon les cas, il peut y avoir d'autres champs | ||
ID_CDL (pour les conservatoire du littoral) | entier | Identifiant pour le Conservatoire du Littoral. Bien renseigné. |
ID_ORG (pour les réserves biologiques) | 12 caractères | Identifiant des RB, en fait un entier. Bien renseigné. |
D_I (pour les réserves biologiques des DOM) | 1 caractère | I = intégrale ou D = dirigée. Bien renseigné. |
MIXTE (pour les réserves biologiques des DOM) | 1 caractère | Si la réserve est mixte. Bien renseigné. |
Phase 3 - Choix des tags à utiliser pour l'intégration dans OSM
Pour l'instant les balises documentées dans le wiki sont :
- leisure=nature_reserve
- landuse=conservation
- boundary=national_park
- boundary=protected_area qui propose une classification basée sur l'IUCN. Les zonages protégés de France sont interprétables avec cette classification :
- cf. cette carte de l'EEA où on peut voir qu'il y a en France des zones Ia, II (Parcs nationaux ?), III, IV, et V (PNR et PNM ?). Les types Ib et VI on l'air absents.
protect_class=* est préféré à protect_id=* pour la classification.
- cf. wdpa.org pour les classements ci-dessous
- il y aussi Les espaces protégés français, un document du Comité français de l'IUCN qui explique les niveaux IUCN des différents types d'espaces.
Espaces protégés
Ici on pourrait utiliser la balise boundary=protected_area + protect_class=*.
Note : wdpa.org répertorie un seul Marine Park : Côte Bleue (près de Marseille), et INPN répertorie un seul parc naturel marin en métropole : Iroise. Ce n'est donc pas la même chose.
On pourra mettre à chaque fois les champs :
- name= avec la valeur du champ NAME remise en forme,
- valid_from= avec la valeur du champ DATE ou DATE_ remise au format AAAA-MM-JJ
- id_spn= avec la valeur de ID_SPN
protection_title | protection_title:en | Niveau | préfixe ID_SPN | nb objets | protect_class | Tags additionnels à ajouter |
---|---|---|---|---|---|---|
Arrêté de protection de biotope | Biotope Protection Order | National | FR38 | 715 | 4 | |
Réserve de la biosphère, zone centrale | UNESCO-MAB Biosphere Reserve | International | FR63 | 9 | 98 | |
Réserve de la biosphère, zone tampon | UNESCO-MAB Biosphere Reserve | International | FR64 | 9 | 98 | |
Réserve de la biosphère, aire de coopération | UNESCO-MAB Biosphere Reserve | International | FR65 | 9 | 98 | |
Terrain du Conservatoire du Littoral | Land Acquired by Littoral and Lakeside Conservatoire | National | FR11 | 636 | 4 | id_cdl |
Coeur de Parc national | National Park - Central Area | National | FR33 | 9 | 2 (sauf Cévennes ?) | access=no + foot=no (car accès interdit en dehors des chemins ?) |
Aire d'adhésion de Parc national | National Park - Central Area / Buffer Zone | National | FR34 | 8 | 5 | Sauf erreur, en tout cas de ma connaissance pour le parc de la vanoise, l'aire d'adhésion ne dispose d'aucune protection particulière |
Parc naturel marin | National | FR91 | 1 | 5 ou 6 | ||
Parc naturel régional | Regional Natural Park, Regional Nature Park | National | FR80 | 46 | 5 | |
Site Ramsar (voir aussi Ramsar site) | Wetlands of International Importance (Ramsar) | International | FR72 | 33 | 98 | |
Réserve biologique dirigée | Forest Biological Reserve | National | FR23 | 168 | 4 | id_org |
Réserve biologique intégrale | Forest Biological Reserve | National | FR24 | 62 | 1 | id_org |
Réserve naturelle nationale | Nature Reserve, Natural Reserve, National Natural Reserve | National | FR36 | 166 | 4 sauf celles géologiques : 3. | access=no + foot=no(car accès interdit en dehors des chemins ?) |
Réserve nationale de chasse et faune sauvage | National Hunting and Wildlife Reserve | National | FR51 | 9 | 4 | |
Réserve naturelle volontaire | Voluntary Nature Reserve | National | FR37 | 139 | 3 |
Et aussi "Marine Protected Zone: aquaculture concession" (deux : Cap Couronne et Carry-le-Rouet) : pas d'équivalent dans les données INPN ?
Inventaires d'espaces naturels
Ce ne sont pas des espaces protégés à proprement parler. L'utilité de leur import dans OSM est discutable.
Type | balise |
---|---|
Zone d'importance pour la conservation des oiseaux (ZICO) | |
ZNIEFF 1 | |
ZNIEFF 2 |
NATURA 2000
Ici aussi, on pourrait utiliser la balise boundary=protected_area + protect_class=*, s'il s'agit effectivement de zones protégées (si quelqu'un peut confirmer).
Type | protect_class |
---|---|
Sites d'importance communautaire (SIC, directive habitats) | 97 |
Zones de protection spéciale (ZPS, directive oiseaux) | 97 |
Phase 4 - Choix de tout ou partie des données à importer et méthode
Choix des données
- Les Réserves Naturelles Volontaires sont notées en "ex-" dans la doc du site : peut-être est-ce inutile des les importer s'il s'agit de données anciennes. Elles sont devenues Réserves Naturelles Régionales (loi 2002-276 relative à la démocratie de proximité du 27 février 2002 modifiant le code l'Environnement (article L332-11). Elles mériteraient tout de même de figurer dans la base dans la mesure où elles participent à définir des espaces réglementaires protégeant, ipso facto, des zones sensibles (ZNIEFF entre autres). Depuis cette loi, d'autres nouvelles RNR ont été instituées par les Régions. Il faudrait donc compléter, si possible (les délibérations des collectivités locales sont des données publiques librement réutilisables).DenisHelfer 19:32, 15 June 2010 (UTC)
- Les terrains du Conservatoire du Littoral sont extrêmement nombreux, fragmentés, et de petites tailles. En outre, leurs noms sont en capitales et nécessitent un gros travail de réécriture. Peut-être est-ce mieux de ne pas les importer pour l'instant.
Méthode
Parcs Naturels Régionaux
Une première analyse rapide indique que les données sont des unions de limites communales (parfois infra-communales : Altenstadt -intégré à Wissembourg- pour le PNR des Vosges du Nord, par exemple).
Certaines de ces limites communales existent déjà dans OSM avec une précision meilleure que celle de l'import (niveau scan25|BD Carto, à vue de nez).
Proposition de conflation
- découper les polygones d'origine en segments élémentaires (entre 2 points => anciens segments dans l'API 0.4). Les segments peuvent être rassemblés en entités plus grandes avec une limite inférieure sur la longueur du segment (moyenne nationale de la longueur d'un segment de limite communale ?)
- lister les segments déjà présents dans OSM (fragment de limite communale) en requêtant spatialement avec un buffer de tolérance
- distinguer les segments "neufs" par rapport à OSM
- créer une relation "PNR" (type=boundary+boundary=natural_park+name=*+ref=*, etc.) avec l'ensemble des segments originaux + une mention spéciale (rôle ?) pour les segments identifiés comme "non-neufs"
Use case
- le PNR a l'ensemble de ses segments "neufs" dans OSM -> un way fermé + 1 relation "PNR" -> import direct dans la base
- le PNR a une partie de ses segments déjà intégré dans OSM -> import des segments neufs avec mention (au niveau de la relation ?) de la nécessité de procéder à une fusion avec des éléments existants ou import de l'ensemble des segments avec mention pour les segments "existants" d'être fusionnés avec les limites communales
- le PNR présente un ou plusieurs "trous"
- le "trou" correspond à une limite communale existante dans OSM -> remplacer par la limite communale existante
- le "trou" ne correspond pas à une limite existante -> traiter comme un segment "neuf" ; gérer classiquement au niveau de la relation (inner, outer)
Autre proposition
Si la zone candidate à import est par nature constituée d'un ensemble de communes (cas des PNR) alors on peut :
- (1) Identifier les communes incluses dans la zone candidate en récupérant les nodes 'place' inclus dans la zone, dotés d'un ref:INSEE,
- (2) Récupérer la liste des relations de type "boundary=administrative & admin_level=8" pour lesquelles le tag ref:INSEE matche avec les valeurs de ref:INSEE retournées par (1)
- (3) Récupérer la liste des ways de ces relations
- (4) Si les limites communales sont topologiques (ce qui devrait être le cas normalement), tout way parmi ceux de (3) présent deux fois dans la liste est une limite, interne à la zone, à supprimer. Tout way présent une seule fois est une limite entre la zone et l'extérieur, à garder comme constituant des limites de la zone finale.
- (5) Effectuer au moins deux contrôles à ce stade à partir des ways récupérés en (4)
- procéder à une comparaison entre la surface de la zone candidate et la surface constituée par les ways retenus en (4). En pourcentage, le delta entre les deux chiffres doit être minime, en dessous de 1 (à affiner) ;
- procéder de même à une comparaison de périmètre, avec là aussi un pourcentage de variation qui doit être infime.
- (6) Si les tests de (5) sont concluants, constituer de nouveaux ways répliques des ways retenus en (4), en s'appuyant sur les mêmes nodes. Associer ces ways au sein de la nouvelle relation (tags à définir).
- (6bis) Si les tests de (5) ne sont pas concluants, alors il est vraisemblable qu'il manque des limites communales pour recomposer la zone candidate. Il faudrait idéalement procéder à la création de ces limites communales pour ensuite re-jouer le processus à partir de (2)
Idéalement dans ce schéma on ne crée aucune géométrie propre aux zones candidates, on s'appuie sur de la géométrie OSM existante. Cela reste un cas bien particulier, valable uniquement pour les zones qui sont des "sommes" de communes entières.
Importation technique avec ogr2osm
Utilisation de l'outil ogr2osm : (La version disponible du svn pose problème, cette version [1] permet une utilisation plus adapté au cas INPN (ways de + de 500 noeuds interdits, ne pas ignorer le dernier champ du shapefile, et j'ai même tweaké la librairie SimpleXMLWrite pour produire un fichier lisible et pour bien gérer le ' )
python ogr2osm.py -t inpn_rules filename.shp
Avec le fichier inpn_rules.py (dans le sous-dossier "translations")
- CHANGELOG v7 : Les aires d'adhésion de parc n'interdisent ni les véhicules à moteurs, ni la construction. sletuffe 18:27, 4 July 2010 (UTC)
- CHANGELOG v6 : Bon ordre des if pour les attributs (sinon protection_title et protect_id sont absents !) Damouns 14:50, 1 July 2010 (UTC)
- CHANGELOG v5 : Ajout de la source et gestion chaîne DATE vide ou différente Damouns 13:35, 1 July 2010 (UTC)
- CHANGELOG v4 : Ajout des restrictions d'accès pour les réserves et parcs nationaux sletuffe 17:53, 30 June 2010 (UTC)
- CHANGELOG v3 : re-factorisation du code, si il s'agit d'un parc national, je laisse tomber le boundary=national_park pour lui préférer l'homogénéité de boundary=protected_area sletuffe 17:46, 30 June 2010 (UTC)
- CHANGELOG v2 : factorisation du code, gestion de la conversion iso -> utf-8, correction de bugs ajout de FR33 sletuffe 17:38, 30 June 2010 (UTC)
- CHANGELOG v1 : Première version
ATTENTION certains noms en provenance de l'INPN comportent des abréviations, ce qui est contraire à l'usage toponymique dans openstreetmap, il serait bon de corriger les règles ci-après, ou de finir à la main avant import
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def translateAttributes(attrs):
if not attrs: return
tags = {}
tags.update({'boundary':'protected_area'})
tags.update({'source':'Inventaire National du Patrimoine Naturel 2010'})
# Utiliser l'attribut "NOM" pour la balise name=
if 'NOM' in attrs:
#print 'un nom :' + unicode(attrs['NOM'],'ISO-8859-15')
nom=unicode(attrs['NOM'],'ISO-8859-15')
tags.update({'name':nom})
# Utiliser l'attribut "DATE" ou "DATE_" pour la balise valid_from=
key_date = 'EMPTY'
if 'DATE' in attrs:
key_date = 'DATE'
if 'DATE_' in attrs:
key_date = 'DATE_'
if key_date != 'EMPTY':
if (attrs[key_date].count('/') == 2):
year = attrs[key_date].split('/')[2]
month = attrs[key_date].split('/')[1]
day = attrs[key_date].split('/')[0]
date = year + '-' + month + '-' + day
tags.update({'valid_from':date})
elif (len(attrs[key_date].strip()) != 0):
tags.update({'valid_from':attrs[key_date]})
# Utiliser l'attribut "ID_DIREN" si existe, pour la balise id_diren
if 'ID_DIREN' in attrs:
if attrs['ID_DIREN'] :
tags.update({'id_diren':attrs['ID_DIREN']})
# Utiliser l'attribut "ID_SPN" pour la balise id_spn=
if 'ID_SPN' in attrs:
tags.update({'id_spn':attrs['ID_SPN']})
# Mettre les bons tags selon le préfixe de ID_SPN
if attrs['ID_SPN'].startswith('FR38'):
tags.update({'protect_id':'4'})
tags.update({'protection_title':u'Arrêté de protection de biotope'})
elif attrs['ID_SPN'].startswith('FR63'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'98'})
tags.update({'protection_title':u'Réserve de la biosphère, zone centrale'})
elif attrs['ID_SPN'].startswith('FR64'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'98'})
tags.update({'protection_title':u'Réserve de la biosphère, zone tampon'})
elif attrs['ID_SPN'].startswith('FR65'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'98'})
tags.update({'protection_title':'Réserve de la biosphère, aire de coopération'})
elif attrs['ID_SPN'].startswith('FR33'):
tags.update({'protect_id':'2'})
tags.update({'protection_title':u'Cœur de Parc national'})
tags.update({'access':u'no'})
tags.update({'foot':u'yes'})
elif attrs['ID_SPN'].startswith('FR34'):
tags.update({'protect_id':'5'})
tags.update({'protection_title':u'Aire d’adhésion de Parc national'})
elif attrs['ID_SPN'].startswith('FR91'):
tags.update({'protect_id':'5'})
tags.update({'protection_title':'Parc naturel marin'})
elif attrs['ID_SPN'].startswith('FR80'):
tags.update({'protect_id':'5'})
tags.update({'protection_title':u'Parc naturel régional'})
elif attrs['ID_SPN'].startswith('FR72'):
tags.update({'protect_id':'98'})
tags.update({'protection_title':'Site Ramsar'})
elif attrs['ID_SPN'].startswith('FR23'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'4'})
tags.update({'protection_title':u'Réserve biologique dirigée'})
elif attrs['ID_SPN'].startswith('FR24'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'1'})
tags.update({'protection_title':u'Réserve biologique intégrale'})
elif attrs['ID_SPN'].startswith('FR36'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'4'})
tags.update({'protection_title':u'Réserve naturelle nationale'})
tags.update({'access':u'no'})
tags.update({'foot':u'yes'})
elif attrs['ID_SPN'].startswith('FR51'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'4'})
tags.update({'protection_title':u'Réserve nationale de chasse et faune sauvage'})
elif attrs['ID_SPN'].startswith('FR37'):
tags.update({'leisure':'nature_reserve'})
tags.update({'protect_id':'3'})
tags.update({'protection_title':u'Réserve naturelle volontaire'})
#print tags
return tags
Phase 5 - Réflexion sur l'avenir et le maintien à jour des données
Si on a une version annuelle des shapefile sur le site de l'INPN, on pourrait comparer leurs contours avec ce qu'il y a dans la base OSM. Le problème c'est que si un contributeur a amélioré le contour présent grâce au cadastre et au texte du décret constitutif de l'espace protégé, on risque d'écraser son travail (cf. réserve naturelle des Hauts de Chartreuse). L'idéal serait d'avoir un différentiel tous les ans, par exemple uniquement la liste des espaces modifiés, ajoutés, supprimés. on pourrait regénérer les fichiers osm de ces espaces.
Phase 6 - Import réél dans OSM
- Un premier import partiel a eu lieu le 04/06/2010, l'import a été réalisé directement avec JOSM sur la base d'un fichier osm généré avec ogr2osm.py et le fichier de règles ci avant en version 6. Cet import n'a concerné que les réserves naturelles de france métropolitaine comme expliqué ici (Cela concerne donc les rn2010 de l'INPN) les changesets sont [2] et [3] sletuffe 17:58, 4 July 2010 (UTC)
- Un deuxième import partiel le 04/06/2010, idem précédemment mais pour les parcs nationaux de france métropolitaine (fichier pn2010) les changesets sont [4] et [5] sletuffe 23:16, 4 July 2010 (UTC)
- Imports en Outre-Mer fin juillet/début août 2010, liste des ensembles de changements (changesets) concernés :
- glp_apb2010 arrêtés de protection de biotope de Guadeloupe : 5361462 (achavi, OSMLab)
- glp_bios2010 réserve de biosphère de Guadeloupe : 5386807 (achavi, OSMLab)
- glp_pn2010 parc national de Guadeloupe : 5365833 (achavi, OSMLab)
- glp_ramsar2010 zone Ramsar de Guadeloupe : 5354030 (achavi, OSMLab)
- glp_rn2010 réserves naturelles de Guadeloupe : 5353993 (achavi, OSMLab)
- mtq_apb2010 arrêtés de protection de biotope de Martinique : 5354102 (achavi, OSMLab)
- mtq_pnr2010 PNR de Martinique : 5363766 (achavi, OSMLab)
- mtq_rb2010 réserves biologiques de Martinique : 5353957 (achavi, OSMLab)
- mtq_rn2010 réserves naturelles de Martinique : 5354071 (achavi, OSMLab)
- guf_apb2010 arrêtés de protection de biotope de Guyane : 5353937 (achavi, OSMLab)
- guf_pn2010 parc national de Guyane : 5362426 (achavi, OSMLab)
- guf_pnr2010 PNR de Guyane : 5354323 (achavi, OSMLab)
- guf_ramsar2010 zones Ramsar de Guyane : 5353919 (achavi, OSMLab)
- guf_rb2010 réserve biologique de Guyane : 5361538 (achavi, OSMLab) et 5362053 (achavi, OSMLab)
- guf_rn2010 réserves naturelles de Guyane : 5362200 (achavi, OSMLab)
- reu_apb2010 arrêtés de protection de biotope de La Réunion : 5354264 (achavi, OSMLab)
- reu_pn2010 parc national de La Réunion : 5395688 (achavi, OSMLab)
- reu_rb2010 réserves biologiques de La Réunion : 5354149 (achavi, OSMLab)
- reu_rn2010 réserves naturelles de La Réunion : 5354219 (achavi, OSMLab)
- myt_apb2010 arrêtés de protection de biotope de Mayotte : 5353902 (achavi, OSMLab)
- myt_rn2010 réserve naturelle de Mayotte : 5353910 (achavi, OSMLab)
C'est long et ça prend du temps ! Damouns 10:33, 10 August 2010 (BST)
- Imports en métropole :
- apb2010 arrêtés de protection de biotope
- bios2010 réserves de biosphère : 5586106 (achavi, OSMLab) (Fontainebleau), 5586373 (achavi, OSMLab) (Luberon et Mont Ventoux), 5588599 (achavi, OSMLab) (Camargue), 5595905 (achavi, OSMLab) (Cévennes), 5595831 (achavi, OSMLab) (Fango), 5595711 (achavi, OSMLab) (Iroise)
- pn2010 parcs nationaux : 5135932 (achavi, OSMLab) et 5137643 (achavi, OSMLab) (Sly)
- pnm2010 parc naturel marin : 5775442 (achavi, OSMLab)
- pnr2010 parcs naturels régionaux
- ramsar2010 zones Ramsar
- rb2010 réserves biologiques : 5783860 (achavi, OSMLab)
- rn2010 réserves nationales : 5133905 (achavi, OSMLab) et 5135061 (achavi, OSMLab) (Sly)
- rncfs2010 réserves nationales de chasse et de faune sauvage : 6289371 (achavi, OSMLab) (sauf celle des Bauges, cf. Imports localisés)
- rnv réserves nationales volontaires
Ajout du 7 janvier 2011 : Suite à des remarques et surtout des problèmes de rendu (eh oui) j'ai modifié les données comme suit :
- les noms ont été modifiés de façon à être plus clairs hors contexte (avec le type de zone et pas seulement le nom)
- les zones tampons et aires de coopération des réserves de biosphère ont perdu leur attribut leisure=nature_reserve qui rajoutait un énorme pâté vert sur des zones à faible niveau de protection
- à l'inverse, les coeurs de parcs nationaux ont reçu boundary=national_park afin d'être visibles.
Je suis conscient que tagguer pour le rendu ne se fait pas, mais en l'occurence ce sont des modifications qui se justifient d'une certaine manière, donc pas inacceptables selon moi. Je les documente ici pour info. Damouns 12:43, 7 January 2011 (UTC)
Voir aussi Import/Catalogue#Ongoing_Imports.2C_Semi-Automated