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

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