49
Démographie des régions européennes entre 1992 et 2022 en 9 familles
Qgis
6 déc 2023

Performance démographique relative des régions selon le classement de l'APR
Groupe Rang Delta
++++ 1 à 7 7
+++ 8 à 27 20
++ 28 à 47 20
+ 48 à 67 20
= 68 à 76 9
- 77 à 96 20
-- 97 à 116 20
--- 117 à 136 20
---- 136 à 143 7

Evolution démographique des régions éuropéennes (NUTS2) par tranches de cinq années avec répartition en neuf groupes selon la performance relative sur la période. Le rouge foncé correspond aux régions en plus forte croissance sur la période, le vert foncé à celles avec la plus faible augmentation. Le jaune correspond aux régions dans la moyenne. Les données et le regroupement sont issus d'une note de l'APR.

Selon la notice :

La classification proposée est construite d’après le rang des régions, par symétrie par rapport à la médiane. Ainsi le symbole ++++ correspond-il aux 7 régions les plus dynamiques (approximativement 5%), le suivant aux 20 régions suivantes, etc. La zone médiane correspond aux 7 régions centrales.

48
Cheatsheet Image Magick et FFMPEG
Windows
28 nov 2023

Image

Convertir toutes les images d'un dossier de WEBP à PNG

mogrify -format webp -quality 80 *.jpg

Réduire de moitié la taille (en pixel) de toutes les images en PNG d'un dossier

mogrify -resize 50% -quality 80  *.png


Son

Convertir un WAV en MP3 VBR de qualité optimale (de 220 à 260 KB/s) (le paramètre -q:a gère la qualité et se paramètre de 0 à 9)

ffmpeg -i input.wav -codec:a libmp3lame -q:a 0 output.mp3

Convertir tous les fichiers FLAC d'un dossier en MP3 320 KB/s (commande Powershell)

gci -file | Foreach-Object {ffmpeg -i $_.FullName -ab 320k -map_metadata 0 -id3v2_version 3 "$($_.BaseName).mp3"}


Vidéo

Extraire un segment de vidéo sans perte (ici à partir de 1 h 07 min et 5 s, pendant 1 min 25 s)

ffmpeg -ss 01:07:05 -t 00:01:25 -i input.mkv -qscale:v 0 -async 1 output.mp4

Convertire en MP4 optimisé pour le Web (en deux passes)

ffmpeg -i source.mkv -vcodec libx264 -preset slow -crf 24 -ab 192k firstpass.mp4
ffmpeg -i firstpass.mp4 -map_metadata -1 -vcodec libx264 -vf scale=720:-1 -vb 700k -maxrate 8000k -bufsize 1000K -minrate 10k -crf 24 -preset slow -ab 192k web.mp4

Rogner l'image d'une vidéo (avec iw : largeur totale rognée ; ih : hauteur totale rognée)

ffmpeg -i input.mkv -qscale:v 0 -qscale:a 0 -vf "crop=iw-0:ih-150:0:75" output.mp4

Redimensionner (ici 960px par 540px)

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4

Accélérer (augmenter le 5 pour accélérer, le paramètre -r (fps) n'influe pas sur la vitesse mais sur la qualité)

ffmpeg -i input.mp4 -r 30 -qscale:v 0 -vf "setpts=(1/5)*PTS" output.mp4

Accélérer (augmenter le 5 pour accélérer, le paramètre -r (fps) n'influe pas sur la vitesse mais sur la qualité)

ffmpeg -i input.mp4 -r 30 -qscale:v 0 -vf "setpts=(1/5)*PTS" output.mp4

Convertir une série d'image en vidéo (ici pour une série d'image en img001.jpg, img002.jpg, ... avec le %03d pour définir le nombre de chiffre dans le numérotage)

ffmpeg -i img%03d.jpg -vcodec libx264 -b:v 15000k -s 1200x800 -r 60 -vf "setpts=(1/1)*PTS" output.mp4

Télécharger un flux HLS. La première commande affiche la liste des programmes disponibles, la seconde télécharge un programme spécifique avec le paramètre p:1 (ici le second programme).

ffmpeg -i "https://website.net/master.m3u8"
ffmpeg -i "https://website.net/master.m3u8" -map p:1 -c copy -bsf:a aac_adtstoasc output.mp4

Supprimer toutes les méta-données

ffmpeg -i input.mov -map_metadata -1 -c:v copy -c:a copy output.mov

Ajouter des sous-titres SRT à un fichier vidéo

ffmpeg -i input.mp4 -i sub.srt -c copy -c:s mov_text output.mp4

Imprimer des sous-titres SRT sur la vidéo

ffmpeg -i input.m4v -vf subtitles=sub.srt -c:a copy output.m4v

Ajouter une piste audio

ffmpeg -i input.mkv -i audio.mp3 -map 0 -map 1:a -c:v copy -shortest output.mkv

Supprimer une piste audio (le numéro de la piste à supprimer se règle avec le paramètre -0:a:1, ici avec le 1 pour la deuxième piste)

ffmpeg -i input.mkv -map 0 -map -0:a:1 -c copy output.mkv
47
Textures de tomettes pour perspectives 3D
Rhino3D, Cad
13 nov 2023

Les textures de tomettes en action (V-Ray Next 2 et Rhino)

Textures de tomettes provençales continue (seamless) avec trois couches : diffuse, bump et specular. La couche specular est à placer dans "Reflection color". Les textures sont prévues pour un pavage de 150 x 150 cm.

Le .vrmat est enregistré! pour V-Ray Next.

Télécharger les textures et le .vrmat en ZIP

46
Des usages de l'appartement témoin
Cinema
1er nov 2022
Riff Raff, 1990, Ken Loach
45
Compiler plusieurs images en un PDF avec marges à 150 ppp
Windows
3 mai 2022

Commande ImageMagick.

convert -auto-orient * -resize 1403x992 -gravity center -extent 1754x1240 -density 150x150 -units PixelsPerInch -repage 1754x1240 multipage.pdf

Sortie en PDF A4 résolution 150 ppp avec des marges blanches (80%). La résolution des images elles-mêmes est donc inférieure. Accepte tout type d'image.

44
Créer un dossier à la date du jour dans le menu contextuel
Windows
14 avr 2022

Pour ajouter une fonctionnalité "Créer un dossier à la date du jour" intégrée au menu contextuel (clic droit) de Windows.

Script à nommer makeDirToday.bat et placer dans le dossier C:\Program Files\ContextualScripts – ou ailleurs si l'on modifie également le chemin dans le fichier registre plus bas. Il est calibré pour les versions française ou allemande de Windows de format de date par défaut DD/MM/YYYY. Il faudra donc l'adapter sur un Windows anglais, par exemple.

@echo off    
mkdir %date:~-4,4%"-"%date:~-7,2%"-"%date:~0,2%

Fichier registre .reg pour installer le script dans le menu contextuel. Double-clic dessous pour l'installer. À bien enregistrer avec encodage ANSI (Windows-1252) pour gérer les accents.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\makeDirToday]
@="&Créer un dossier à date"
"Icon"="%SystemRoot%\\System32\\shell32.dll,71"

[HKEY_CLASSES_ROOT\Directory\Background\shell\makeDirToday\command]
@="C:\\Program Files\\ContextualScripts\\makeDirToday.bat \"%V\""
43
Lister les extensions comprises dans un dossier
Python
26 nov 2021
import os
import pathlib

extensions = {}

for root, dirs, files in os.walk("./"):
    for file in files:
        extension = pathlib.Path(file).suffix
        if extension not in extensions:
            extensions[extension] = 1
        else:
            extensions[extension] += 1

sortedExtensions = dict(sorted(extensions.items(), key=lambda x: x[1], reverse=True))
print(sortedExtensions)

# End
input("Press Enter to close")
42
Densité du bâti dans le Grand Paris
Qgis, Architecture
3 oct 2021

Densité de l'emprise bâtie calculée selon la méthode décrite dans cet article à l'échelle de l'IRIS. Les données de population sont de 2015.

Densité selon l'emprise bâtie, par IRIS
Densité selon l'emprise bâtie, par IRIS

La même carte, avec les emprises bâties représentées est disponible ici.

41
Aspirateur ZLB
Python
1er oct 2021

Script Python pour aspirer les documents numérisés de la Zentral- und Landesbibliothek de Berlin. Extrait les pages en JPG et assemble un PDF. Les URL soumis doivent être du type : https://digital.zlb.de/viewer/image/16054086_1911/12/, c'est à dire l'adresse quand vous lisez une page depuis la visionneuse.

import os
import re
from PIL import Image # "pip install Pillow" to install package
import requests # "pip install requests" to install package
import shutil
import mimetypes
from bs4 import BeautifulSoup # "pip install beautifulsoup4" to install package
headers = {'User-Agent': 'Mozilla/5.0'}

# functions
def downloadFile(url, fileName):
    url = url.replace("\\","")
    response = requests.get(url, stream=True)
    content_type = response.headers['content-type']
    extension = mimetypes.guess_extension(content_type)
    fileName += extension
    with open(fileName, 'wb') as out_file:
        shutil.copyfileobj(response.raw, out_file)
        del response

def getRecordName(url):
    reg = re.match(r"https?:\/\/digital.zlb.de\/viewer\/image\/([A-Za-z0-9_]*)\/", url)
    if reg:
        return reg.group(1)
    else:
        print("Erreur : format d'URL incorrect. Exemple correct https://digital.zlb.de/viewer/image/16054086_1911/9/LOG_0006/")
        return None

def getMaxPagesFromRecord(record):
    url = "https://digital.zlb.de/viewer/image/"+record+"/"
    response = requests.get(url, headers=headers)
    if response:
        reg = re.search(r"rft\.tpages=(\d+)&", str(response.text))
        if reg:
            return int(reg.group(1))
        else:
            print("Impossible de trouver le nombre maximal de page automatiquement.")
            return int(input("Nombre de pages à extraire :"))
    else:
        print("Erreur : la page ZLB n'est pas chargeable.")
        return None

def findImageFromUrl(url,resolution):
    response = requests.get(url, headers=headers)
    if response:
        soup = BeautifulSoup(response.text,"html.parser")
        metaImage = soup.findAll("meta", {"property" : "og:image"})
        img = metaImage[0].get("content")
        img = img.replace("/300,/","/"+str(resolution)+",/")
        return img
    else:
        print("Erreur : la page ZLB n'est pas chargeable.")


#input
inputUrl = input("Adresse de la page ZLB à aspirer :")
resolution = int(input("Résolution (1300 recommandé) :"))

#get record infos
record = getRecordName(inputUrl)
if record:
    maxPages = getMaxPagesFromRecord(record)

#download pages as JPG
if record and maxPages:
    i = 1
    while i < (maxPages+1):
        print("Page",i,"sur",maxPages)
        url = "https://digital.zlb.de/viewer/image/"+record+"/"+str(i)+"/"
        img = findImageFromUrl(url,resolution)
        downloadFile(img, record+"_"+str(i).zfill(8))
        i += 1

#assemble PDF
filesInFolder = os.listdir()
imagesInFolder = []
imagesRGBInFolder = []
for file in filesInFolder:
    ext = os.path.splitext(file)[1]
    imageExtensions = [".jpg",".png",".gif",".jpeg",".svg"]
    if ext in imageExtensions:
        imagesInFolder.append(file)
        img = Image.open(file)
        if img.mode == "RGBA":
            img = img.convert(RGB)
        imagesRGBInFolder.append(img)

if imagesRGBInFolder:
    imagesRGBInFolder[0].save(record+".pdf", save_all=True, quality=85, append_images=imagesRGBInFolder[1:])

#delete JPG
    for file in imagesInFolder:
        os.remove(file)

Pour éviter des erreurs de mémoire avec les documents de beaucoup de pages, il faut utiliser une installation 64bits de Python.

40
De la densité à Paris
Qgis, Architecture
26 sept 2021

En urbanisme, la densité d'un territoire doit être le reflet de la quantité d'humain qui y vivent par unité de surface. En particulier, elle doit permettre de mettre en lumière l'intensité d'usage du bâti et des services et réseaux qui y sont attachés. Dans un quartier dense, on aura plus d'habitants et donc besoin de plus d'écoles, d'une plus grande fréquence de ramassage des ordures et de plus larges canalisations. C'est un indicateur des politiques urbaines pour justifier la construction de nouveaux logements ou l'implantation de services.

Son calcul se fait généralement à partir de la surface d'une zone administrative (ville, arrondissement, quartier, IRIS) et de la population qui y réside. Le nombre de résidant provient des recensements qui s'intéressent uniquement au lieu de résidence et non au lieu de travail des individus, ce qui introduit immédiatement une imprécision importante pour étudier l'intensité d'usage car elle ommet les travailleurs. Un quartier d'affaire peut être considéré comme dense (en semaine) mais aura une faible population résidente. Ce n'est cependant pas ce problème qui m'intéresse aujourd'hui.

18ème arrondissement. En blanc les grandes infrastructures, cimetières et terrains de sport
18ème arrondissement. En blanc les grandes infrastructures, cimetières et terrains de sport

Ce qui me semble plus gênant est l'usage de la surface de la zone administrative totale, dans le cas de Paris généralement celle de l'arrondissement. En effet, une part non-négligeable de la surface des arrondissements est occupée par des zones non-construites et non-habitées : périphérique, rails, terrains de sport, cimetières, ... Surtout, cette part est très inégalement repartie entre les arrondissements de Paris. Les arrondissements périphériques en possèdent généralement plus que ceux du centre.

Densité selon la surface totale de l'arrondissement, population 2015
Densité selon la surface totale de l'arrondissement, population 2015

Dans la comparaison de la densité des arrondissements, celle-ci se retrouve donc sur-évaluée dans les arrondissements avec peu d'espace non-construits (3ème, 11ème) et sous-évaluée dans ceux accueillant de grandes infrastructures (18ème, 15ème). Voir ci-dessus une carte de la densité des arrondissements de Paris, telle qu'on la voit généralement, basée sur la surface totale. La population est celle du recensement de de 2015, compilées par l'APUR.

Pour obtenir une cartographie plus réaliste, je propose de calculer la densité à partir de l'emprise bâtie totale de l'arrondissement, c'est à dire de la somme des surfaces de tous les bâtiments qui la compose. Cela permet de masquer le biais généré par la répartition inégale des espaces vides dans la ville. Cela génère un indicateur intéressant pour l'architecte et l'urbaniste car représentant précisément « l'intensité d'usage humain du bâti » et inversement sur le taux de vacances des constructions. Dans une ville si homogène en terme de gabarit de construction, cet indicateur renseigne précisément sur les zones où les immeubles sont habités ou partiellement vides.

Densité selon l'emprise bâtie totale, population 2015
Densité selon l'emprise bâtie totale, population 2015

Le tableau ci-dessous reprend les données des deux cartes et permet de faire varier le classement des arrondissements selon la surface ou l'emprise bâtie. Le 11ème arrondissement est assez largement le premier selon la surface mais ne se retrouve qu'en 4ème position selon l'emprise bâtie. Ce sont les arrondissements périphériques des 20ème, 19ème et 18ème qui occupent le podium dans ce calcul, confirmant l'intuition de départ. Le 3ème arrondissement, 5ème au classement selon la surface, descend à la 13ème place selon l'emprise. En effet, c'est un arrondissement très construit (la densité de surface est proche de la densité d'emprise bâtie) mais avec beaucoup d'équipements, de musées et de locations saisonnières. Inversement, un arrondissement comme le 13ème, pénalisés par ses grands équipements remonte dans le classement.

Arrondissement Population (2015) Surface totale Emprise bâtie totale Densité surface Densité emprise bâtie
75001 16696 1824612 633985 0.009 0.026
75002 20968 991153 591653 0.021 0.035
75003 35750 1170882 644382 0.031 0.055
75004 27501 1600585 612771 0.017 0.045
75005 60202 2539374 949065 0.024 0.063
75006 43368 2153095 919452 0.020 0.047
75007 55140 4090057 1338078 0.013 0.041
75008 37325 3880036 1650073 0.010 0.023
75009 60105 2178303 1227988 0.028 0.049
75010 92573 2891739 1414306 0.032 0.065
75011 151253 3665441 1842440 0.041 0.082
75012 143557 6388139 2005954 0.022 0.072
75013 184851 7149311 2266280 0.026 0.082
75014 141175 5614877 1774677 0.025 0.080
75015 237088 8494994 2989550 0.028 0.079
75016 167797 7873838 2657580 0.021 0.063
75017 170200 5668834 2104679 0.030 0.081
75018 198820 5996051 2184799 0.033 0.091
75019 187081 6792651 2002307 0.028 0.093
75020 196959 5983446 1972398 0.033 0.100

Avec l'exemples de Paris, ces écarts avec doivent inviter à repenser le discours sur le rapport entre construction et densité. Une zone avec de grands espaces non-bâtis n'est pas forcément moins dense qu'une zone très construite – à Paris, on constate plutôt l'inverse. Le levier de la densité se situe dans l'usage des emprises bâties : bureaux, résidences secondaires et locations saisonnières contre logements réellements occupés par des familles.