Grenoble/2022-05-02 Import arbres

From OpenStreetMap Wiki
Jump to navigation Jump to search

Informations sur l'import

Nom Description
Date 2022-05-02
Importateur Binnette
Data source https://data.metropolegrenoble.fr/ckan/dataset/les-arbres-de-grenoble (Dernière modification: 2022-01-26)
Data set - 31619 arbres
Type Import semi-automatique
Outils JOSM + Plugins: Scripting et Conflation
Changesets
  • 120458382 (achavi, OSMLab) Mise à jour des arbres de Grenoble : imports des nouveaux arbres du référentiel qui sont "trop loin" (>10m) des arbres existants sans balise ref:FR:Grenoble:trees
  • 120458332 (achavi, OSMLab) Mise à jour des arbres de Grenoble : merge des nouveaux arbres du référentiel avec les arbres existances sans tag ref:FR:Grenoble:trees
  • 120437335 (achavi, OSMLab) Suppression des anciens arbres (coupés ou remplacés) Part 2/2
  • 120437290 (achavi, OSMLab) Suppression des anciens arbres (coupés ou remplacés)
  • 120436673 (achavi, OSMLab) Mise à jour des arbres de Grenoble : arbres remplacés à moins de 0.5m
  • 120436633 (achavi, OSMLab) Mise à jour des arbres de Grenoble : arbres remplacés à moins de 0.5m
  • 120436596 (achavi, OSMLab) Mise à jour des arbres de Grenoble : arbres remplacés à moins de 0.5m
  • 120435993 (achavi, OSMLab) Mise à jour des arbres de Grenoble : resolution des conflits pour les id dupliqués et arbres mal placés
  • 120435130 (achavi, OSMLab) Mise à jour des arbres de Grenoble déjà importés dans OSM depuis le dataset de la métro
  • 120435080 (achavi, OSMLab) Mise à jour des arbres de Grenoble déjà importés dans OSM depuis le dataset de la métro
  • 120435042 (achavi, OSMLab) Mise à jour des arbres de Grenoble déjà importés dans OSM depuis le dataset de la métro

Méthodologie

  1. Télécharger le jeu de données au format GeoJSON
  2. Ouvrir le fichier dans JOSM
  3. Renommer le layer en arbres.geojson
  4. Convertir les données via mon script de conversion (voir ci-dessous)
  5. Télécharger les arbres actuel d'OSM via une requêtes Overpass
  6. Faire la conflation (voir ci-dessous)

Code de conversion

Code à utiliser depuis le plugin Scripting de JOSM:

var layer = josm.layers.get("arbres.geojson");
var ds = layer.data;
var nbObj = ds.allPrimitives().size();
var nbArbres = 0, nbNotArbres = 0;
var nbAvecGenre = 0, nbSansGenre = 0;
var nbAvecEspece = 0, nbSansEspece = 0;
var nbAvecVariete = 0;
var console = require("josm/scriptingconsole");
console.clear();

function getAge(stage) {
    switch(stage) {
        case 'Arbre jeune': return 'young';
        case 'Arbre adulte': return 'semi-mature';
        case 'Arbre vieillissant': return 'mature';
        default: return '';
    }
}

function getGenre(n) {
    var genre = n.tags.GENRE_BOTA;
    if (typeof(genre) !== "undefined") {
        return genre;
    }
    nbSansGenre++;
    return genre;
    // var espece = n.tags.ESPECE;
    // Fix Cedrus sinensis -> Cedrela sinensis   
    // Fix missing genre for Magnolia kobus
}

function getEspece(n) {
    var espece = n.tags.ESPECE;
    // Fix jullibrissin -> julibrissin
    // Fix pensylvanica -> pennsylvanica
    if (espece) {
        return espece;
    }
    nbSansEspece++;
    return espece;
}

function isArbre(n) {
    return n.tags.CATEGORIE_DESC == 'Arbre';
}

console.println("Debut traitement des " + nbObj + " arbres du jeu de données.");
ds.each(function (n) {
    if (!isArbre(n)) {
        nbNotArbres++;
    } else {
        nbArbres++;
        var genre = getGenre(n);
        var espece = getEspece(n);
        var variete = n.tags.VARIETE;
        var startDate = n.tags.ANNEEDEPLANTATION;
        var operator = n.tags.COLLECTIVITE;
        var age = getAge(n.tags.STADEDEDEVELOPPEMENT); // young, semi-mature, mature
        var ref = n.tags.ELEM_POINT_ID;
        var source = 'https://data.metropolegrenoble.fr/ckan/dataset/les-arbres-de-grenoble';
        var denotation = 'urban';

        // new tags
        var tags = {};
        if (genre) {
            tags.genus = genre.trim();
            nbAvecGenre++;
            if (espece) {
                tags.species = genre.trim() + " " + espece.trim();
                nbAvecEspece++;
                if (variete) {
                    tags.species = genre.trim() + " " + espece.trim() + " var. " + variete.trim();
                    nbAvecVariete++;
                }
            }
        }
        if (startDate) {
            tags.start_date = startDate;
        }
        if (operator) {
            tags.operator = operator;
        }
        if (age) {
            tags.age = age;
        }
        if (ref) {
            tags['ref:FR:Grenoble:trees'] = ref;
        }

        tags.source = source;
        tags.denotation = denotation;

        // erase all tags to kepp only the usefull ones
        n.tags = tags;
    }
});
console.println("Traitement terminé.");
console.println("Arbres=" + nbArbres);
console.println("Non Arbres=" + nbNotArbres);
console.println("AvecGenre=" + nbAvecGenre);
console.println("SansGenre=" + nbSansGenre);
console.println("AvecEspece=" + nbAvecEspece);
console.println("SansEspece=" + nbSansEspece);
console.println("AvecVariete=" + nbAvecVariete);
josm.alert("Done. Arbres=" + nbArbres + ";Non arbres=" + nbNotArbres);

Conflation

C'est la partie la plus complexe du process. Elle requiert de prendre quelques décisions d'arbitrage selon votre appréciation.

J'ai procédé comme ceci :

  1. Mise à jour des arbres déjà importés. Faciles à trouver, ils ont conserver leur id 'ref:FR:Grenoble:trees'
  2. Résolution des conflits sur les arbres OSM et les arbres du dataset qui ont le même id 'ref:FR:Grenoble:trees'
  3. Merge des arbres 'remplacés' du dataset. J'ai choisi une distance arbitraire de 0.5m
  4. Suppression des anciens arbres (coupés ou remplacés)
  5. Import des nouveaux arbres du dataset avec merge sur les arbres existant dans OSM