Skip to content

Commit

Permalink
Update CLI and doc
Browse files Browse the repository at this point in the history
  • Loading branch information
jdesboeufs committed Aug 29, 2017
1 parent 0a81df6 commit 35c706c
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 18 deletions.
64 changes: 58 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,79 @@
# edigeo2geojson
# Cadastre

[![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo)

Script permettant d'extraire les géométries des fichiers EDIGéO, ainsi que la relation Numéro de voie <=> Parcelle.
Scripts permettant de produire les données cadastre à partir des fichiers EDIGÉO mis à disposition par la DGFiP

## Prérequis

* Node.js >= 8
* [Node.js](https://nodejs.org) >= 8

⚠️ L'installation de Node.js via `apt` (Ubuntu, Debian) ne permet pas immédiatement d'installer des modules `npm` globaux.
Pour éviter des problèmes de permissions, il est recommandé de suivre [ces instruction](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory).

* Pour France entière : un CPU avec au moins 8 coeurs, ou __beaucoup__ de patience
* Pour France entière : au moins 160 Go d'espace disponible (50 pour les fichiers sources, 50 pour les fichiers de travail, 30 pour les fichiers départementaux résultants, 30 pour les fichiers communaux résultats)

## Installation

```bash
npm install edigeo2geojson -g
npm install @etalab/cadastre -g
```

Ce module a de nombreuses dépendances, dont [GDAL](www.gdal.org). Son installation peut prendre plusieurs minutes. Si vous êtes pressé, utilisez [yarn](https://yarnpkg.com/lang/en/docs/install/).

## Téléchargement des archives EDIGÉO

_À venir_

## Utilisation

### Extraction des données
Actuellement la production des fichiers se déroule en 3 étapes, via 3 commandes.

### Préparation des fichiers EDIGÉO

Tout d'abord la commande `prepare` explore le dossier contenant les archives départementales ÉDIGÉO, le décompresse dans le dossier de travail tout en organisant les fichiers résultats par départements et par communes.

Pour France entière l'opération ne prend que quelques minutes sur une machine moyenne.

```bash
edigeo2geojson edigeo_files_dir target_geojson_files_dir
cadastre-builder prepare sources/ cadastre/
```

* `sources/` : dossier contenant les archives sous la forme `depXX.zip`
* `cadastre/` : dossier de travail qui sera réutilisé pour les autres commandes

### Extraction des données et production des fichiers communaux

La commande `extract` déclenche l'analyse et l'extraction de tous les départements et toutes les communes présentes dans le dossier de travail.

Les archives correspondant aux feuilles cadastrales, sous la forme `XXXX-XXX-XX-XX.tar.bz2`, sont successivement extraites dans le répertoire temporaire de votre système puis analysées par GDAL et par le parseur développé par Etalab.

Un fichier GeoJSON est produit pour chaque couche et pour chaque commune.

Pour France entière, l'opération prend environ __140 heures__ par coeur de CPU moderne disponible. Sur une machine classique il n'est pas envisageable de lancer l'opération d'un coup. Néanmoins le script gère efficacement la présence de multiples coeurs. Sur une instance Cloud de 32 coeurs louée à l'heure, le temps de traitement est inférieure à 5 heures, pour quelques euros.

```bash
cadastre-builder extract cadastre/
```

### Production des fichiers GeoJSON départementaux

La commande `merge` permet d'obtenir des fichiers GeoJSON départementaux à partir des fichiers communaux.

L'opération France entière dure quelques minutes.

```
cadastre-builder merge cadastre/
```

## TODO

* Fusionner les commandes
* Téléchargement automatique des sources
* CLI plus flexible
* Moindre consommation d'espace disque et de CPU

## Licence

MIT
10 changes: 5 additions & 5 deletions bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@ program
.version(version)

program
.command('prepare [workDir]')
.command('prepare <archivesDir> <workDir>')
.description('prepare EDIGÉO files')
.action(workDir => {
require('../lib/commands/prepare')(workDir).catch(boom)
.action((archivesDir, workDir) => {
require('../lib/commands/prepare')(archivesDir, workDir).catch(boom)
})

program
.command('extract [workDir]')
.command('extract <workDir>')
.description('extract features from EDIGÉO to GeoJSON')
.option('--write-raw', 'Write raw features')
.action((workdir, options) => {
require('../lib/commands/extract')(workdir, options).catch(boom)
})

program
.command('merge [workDir]')
.command('merge <workDir>')
.description('merge communes into departements')
.action(workdir => {
require('../lib/commands/merge')(workdir).catch(boom)
Expand Down
3 changes: 2 additions & 1 deletion lib/commands/extract.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ const rimrafAsync = promisify(rimraf)
const readdirAsync = promisify(readdir)

async function handler(workDir, { writeRaw }) {
workDir = workDir ? resolve(workDir) : join(__dirname, '..', '..', '.tmp')
if (!workDir) throw new Error('workDir is required')
workDir = resolve(workDir)
const srcDir = join(workDir, 'edigeo')
const destDir = join(workDir, 'geojson')

Expand Down
3 changes: 2 additions & 1 deletion lib/commands/merge.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ const readdirAsync = promisify(readdir)


async function handler(workDir) {
workDir = workDir ? resolve(workDir) : join(__dirname, '..', '..', '.tmp')
if (!workDir) throw new Error('workDir is required')
workDir = resolve(workDir)
const departementsPath = join(workDir, 'geojson', 'departements')

const children = await readdirAsync(departementsPath)
Expand Down
12 changes: 7 additions & 5 deletions lib/commands/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ const readdirAsync = promisify(readdir)
const renameAsync = promisify(rename)
const rimrafAsync = promisify(rimraf)

async function handler(workDir) {
workDir = workDir ? resolve(workDir) : join(__dirname, '..', '..', '.tmp')
const srcDir = join(workDir, 'source-archives')
async function handler(archivesDir, workDir) {
if (!workDir) throw new Error('workDir is required')
workDir = resolve(workDir)
if (!archivesDir) throw new Error('archivesDir is required')
archivesDir = resolve(archivesDir)
const destDir = join(workDir, 'edigeo')

await rimrafAsync(destDir)

const files = await readdirAsync(srcDir)
const files = await readdirAsync(archivesDir)
const departements = getDepartements(files)

await Promise.each(departements, async codeDep => {
Expand All @@ -32,7 +34,7 @@ async function handler(workDir) {
/* Decompress */

const archiveName = `dep${codeDep}.zip`
const archivePath = join(srcDir, archiveName)
const archivePath = join(archivesDir, archiveName)

await decompress(archivePath, depPath, { strip: 10 })

Expand Down

0 comments on commit 35c706c

Please sign in to comment.