France/Parcs nationaux et régionaux, réserves naturelles/Import des données INPN

From OpenStreetMap Wiki
Jump to navigation Jump to search

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.

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 :

J'aime bien le boundary=protected_area je donne une voix pour celui-là agrémenté de son protect_id=*. Je ne vois pas d'inconvénient à enregistrer toutefois dans un Fr:quelquechose=Réserve Naturelle sletuffe 12:57, 2 June 2010 (UTC)
Je crois que c'est prévu avec le protection_title=* (par exemple protection_title=Arrêté de protection de biotope). Damouns 07:29, 3 June 2010 (UTC)
Alors cette proposition est vraiment bien faite ;-) sletuffe 08:56, 3 June 2010 (UTC)
J'ai mis 'protection_title' dans le tableau Damouns 09:02, 7 June 2010 (UTC)

Il peut y avoir débat sur l'utilisation de boundary=national_park d'une part, ou de la combinaison boundary=protected_area + protect_id=2 + protection_title=Coeur de Parc National d'autre part : la première a un usage déjà répandu, et est rendue sur la carte, alors que la seconde permet de comparer le niveau de protection de parcs de différents pays, et de différentier coeur et aire d'adhésion.

Pour les réserves naturelles, l'idée est la même (rendu, usage, et le classement en leisure du tag leisure=nature_reserve fait aussi débat).

En revanche pour les autres types de zones, rien n'existe, l'utilisation de boundary=protected_area permet d'être générique (les Arrêtés de protection de biotope n'existent qu'en France... inutile de créer boundary=apb qui ne serait jamais rendu sur la carte)

Espaces protégés

Ici on pourrait utiliser la balise boundary=protected_area + protect_id=*.

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_id 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_id=*, s'il s'agit effectivement de zones protégées (si quelqu'un peut confirmer).

Type protect_id
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

C'est long et ça prend du temps ! Damouns 10:33, 10 August 2010 (BST)

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