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);
})();
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)