gregoiredavid / france-geojson

Contours des régions, départements, arrondissements, cantons et communes de France (métropole et départements d'outre-mer) au format GeoJSON
https://france-geojson.gregoiredavid.fr
729 stars 409 forks source link

Angular + ngx-openlayers + database + NodeJs #17

Closed jerethom closed 6 years ago

jerethom commented 6 years ago

Salut,

Pour ceux comme moi qui souhaite intégrer les coordonnées en base de données (ici Mysql) et/ou utiliser le composant ngx-openlayers (OpenStreetMap) je vous laisse mon script, ça pourrait peut-être servir à quelqu'un.

Raisons: J'ai écris ce script car les coordonnées de certains départements/communes sont sur plus de deux dimensions et ne sont pas comprise par le composant ngx-openlayers. De ce fait il a fallu splitter les départements/communes.

Info: Script en es6, utiliser une version NodeJs adapté. Le script fonctionne avec le dossier departements au même niveau que le script. Pour les départements/communes qui sont sur plus de deux dimensions, ceux-ci seront splitté avec la nomenclature suivante: "nom département/commune " + i

Prérequis: NodeJs >= 8.9.3 npm i mysql2 fs-jetpack

Exécuter le script: node < filename >(.js)

const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');
const jetpack = require('fs-jetpack');

const depPath = jetpack.inspectTree(path.join(__dirname, 'departements'));

(async () => {

  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'geo_fr'
  });

  for (let dir of depPath.children) {
    const depFile = dir.children.find(el => /^departement/g.test(el.name));
    const comFile = dir.children.find(el => /^communes/g.test(el.name));
    // On lit le fichier département
    // .geometry.coordinates
    // .properties.code
    // .properties.nom
    const contentDep = JSON.parse(fs.readFileSync(path.join(__dirname, 'departements', dir.name, depFile.name)).toString());
    // On lit le fichier communes
    // .features[].geometry.coordinates
    // .features[].properties.code
    // .features[].properties.nom
    const contentCom = JSON.parse(fs.readFileSync(path.join(__dirname, 'departements', dir.name, comFile.name)).toString());

    try {

      const finalDepCoordinates = [];
      const rootCoordinates = contentDep.geometry.coordinates;

      if (rootCoordinates.length > 1) {
        for (let part0 of rootCoordinates) {
          if (part0.length === 1) {
            // Je dois descendre
            for (let part1 of part0) {
              if (part1.length === 1) {
                // Je dois descendre
                for (let part2 of part1) {
                  // Je stocke
                  finalDepCoordinates.push(part2);
                }
              } else {
                // Je stocke
                finalDepCoordinates.push(part1);
              }
            }
          } else {
            // Je stocke
            finalDepCoordinates.push(part0);
          }
        }
      } else {
        finalDepCoordinates.push(rootCoordinates[0]);
      }

      let resDep;
      // On ajoute chaque partie du département
      for (let i = 0; i < finalDepCoordinates.length; i++) {
        resDep = await connection.execute(`insert into geo_fr_dep (code, name, coordinates) values (?, ?, ?)`, [
          contentDep.properties.code,
          contentDep.properties.nom + (i ? ` ${i}` : ''),
          JSON.stringify(finalDepCoordinates[i])
        ]);
      }

      console.log('Insert dep', contentDep.properties.nom);

      for (let dep of contentCom.features) {
        const finalComCoordinates = [];
        if (dep.geometry.coordinates.length > 1) {
          for (let part0 of dep.geometry.coordinates) {
            if (part0.length === 1) {
              // Je dois descendre
              for (let part1 of part0) {
                if (part1.length === 1) {
                  // Je dois descendre
                  for (let part2 of part1) {
                    // Je stocke
                    finalComCoordinates.push(part2);
                  }
                } else {
                  // Je stocke
                  finalComCoordinates.push(part1);
                }
              }
            } else {
              // Je stocke
              finalComCoordinates.push(part0);
            }
          }
        } else {
          finalComCoordinates.push(dep.geometry.coordinates[0]);
        }

        for (let i = 0; i < finalComCoordinates.length; i++) {
          console.log(dep.properties);
          const resCom = await connection.execute(`insert into geo_fr_com (code, name, coordinates) values (?, ?, ?)`, [
            dep.properties.code,
            dep.properties.nom + (i ? ` ${i}` : ''),
            JSON.stringify(finalComCoordinates[i])
          ]);
          console.log('Insert com', dep.properties.nom);

          await connection.execute(`insert into geo_fr_dep__geo_fr_com (geo_fr_dep_code, geo_fr_com_code) values (?, ?)`, [
            contentDep.properties.code,
            dep.properties.code
          ]);
          console.log('Insert link', contentDep.properties.code, ' | ', dep.properties.code);
        }
      }
    } catch (e) {
      console.log(e);
    }
  }

  process.exit(0);
})();