Skip to content

Instantly share code, notes, and snippets.

View ThomasG77's full-sized avatar

Thomas Gratier ThomasG77

View GitHub Profile
wget https://static.data.gouv.fr/resources/quartiers-prioritaires-de-la-politique-de-la-ville-qpv/20250206-161839/qp2024-france-hexagonale-outre-mer-wgs84-epsg4326.geojson
duckdb :memory: "INSTALL spatial;LOAD spatial;COPY (SELECT * FROM ST_Read('qp2024-france-hexagonale-outre-mer-wgs84-epsg4326.geojson')) TO 'qpv-2024.parquet' (FORMAT 'parquet', COMPRESSION 'zstd');"
rm qp2024-france-hexagonale-outre-mer-wgs84-epsg4326.geojson
gpio add bbox qpv-2024.parquet qpv-2024-with-bbox.parquet
rm qpv-2024.parquet
gpio sort hilbert qpv-2024-with-bbox.parquet qpv-2024.parquet
rm qpv-2024-with-bbox.parquet
gpio check all qpv-2024.parquet
@ThomasG77
ThomasG77 / README.md
Created November 19, 2025 12:47
Exemples de consommation Geo DVF Parquet via Duckdb

Exemples de consommation de DVF via parquet et Duckdb

# Une commune
duckdb :memory: "INSTALL spatial;LOAD spatial;COPY (SELECT id_mutation, date_mutation, numero_disposition, nature_mutation, valeur_fonciere::DOUBLE AS valeur_fonciere, adresse_numero, adresse_suffixe, adresse_nom_voie, adresse_code_voie, code_postal, code_commune, nom_commune, code_departement, ancien_code_commune, ancien_nom_commune, id_parcelle, ancien_id_parcelle, numero_volume, lot1_numero, lot1_surface_carrez::DOUBLE AS lot1_surface_carrez, lot2_numero, lot2_surface_carrez::DOUBLE AS lot2_surface_carrez, lot3_numero, lot3_surface_carrez::DOUBLE AS lot3_surface_carrez, lot4_numero, lot4_surface_carrez::DOUBLE AS lot4_surface_carrez, lot5_numero, lot5_surface_carrez::DOUBLE AS lot5_surface_carrez, nombre_lots, code_type_local, type_local, surface_reelle_bati::DOUBLE AS surface_reelle_bati, nombre_pieces_principales, code_nature_culture, nature_culture, code_nature_culture_speciale, nature_culture_speciale, surface_terrain::DOUBL
@ThomasG77
ThomasG77 / stats-surface-91114.sql
Created October 20, 2025 16:29
Get area stats for parcelles and batiments for each parcelle
INSTALL SPATIAL;
LOAD SPATIAL;
SET memory_limit = '16GB';
SET max_temp_directory_size = '125GB';
COPY (WITH batiments_91114 AS (
SELECT *
FROM
read_parquet('https://cadastre.data.gouv.fr/data/etalab-cadastre/2025-09-01/geoparquet/france/cadastre.parquet')
WHERE type_objet = 'batiments' AND departement = '91' AND commune = '91114' AND ST_GeometryType(geometry) IN ('POLYGON', 'MULTIPOLYGON')
),
@ThomasG77
ThomasG77 / README.md
Created September 9, 2025 20:05
Imprimer un plan DXF de votre commune : quelques points pour démarrer

Vous souhaitez imprimer un plan DXF de votre commune?

## Quelques points pour vous aider

Prenez le DXF d'une feuille de votre commune. Les DXF comme les Edigeo utilisent des coordonnées en mètres utilisant soit la projection Lambert 93 soit une des projections Lamebert 93 conformes (voir https://bofip.impots.gouv.fr/bofip/5106-PGP.html/identifiant%3DBOI-ANNX-000373-20120912 pour savoir laquelle selon votre département)

rm *.DXF
wget https://cadastre.data.gouv.fr/data/dgfip-pci-vecteur/2025-04-01/dxf/feuilles/44/44109/dxf-44109000AZ01.tar.bz2
tar -xvf dxf-44109000AZ01.tar.bz2
@ThomasG77
ThomasG77 / README.md
Created July 18, 2025 10:33
Récupération geolocalisation EHPAD 57

Récupération geolocalisation EHPAD 57

Depuis le site https://www.pour-les-personnes-agees.gouv.fr/annuaire-ehpad-et-comparateur-de-prix-et-restes-a-charge/moselle-57, on a retrouvé la référence à l'API pour récupérer la donnée pour ce cas particulier

wget -O ehpad-57.json https://www.pour-les-personnes-agees.gouv.fr/api/v1/annuaire/heb?dept_numero=57

jq '.[].item | {"type": "Feature","properties": {"title": .title, "noFinesset": .noFinesset, "legal_staus": .legal_status, "postcode": .coordinates.postcode, "street": .coordinates.street, "codeinsee": .coordinates.codeinsee, "city": .coordinates.city}, "geometry": {"coordinates": [(.coordinates.longitude|tonumber), (.coordinates.latitude|tonumber)], "type": "Point"}}' ehpad-57.json | jq --slurp '{"type": "FeatureCollection", "features": .}' >| ehpad-57.geojson
``
@ThomasG77
ThomasG77 / README.md
Last active June 23, 2025 08:50
Liste des tribunaux judiciaires via site https://cartejudiciaire.fr/

Données récupérées depuis https://cartejudiciaire.fr/

Sûrement possible de reconstituer les périmètres depuis https://www.data.gouv.fr/fr/datasets/liste-des-juridictions-competentes-pour-les-communes-de-france/ mais cela aurait été laborieux...

wget https://cartejudiciaire.fr/resultats/2025/cartes/tj_population.html
grep 'geo_json_8b7d5198a511cd18e16301b3ef38921c_add({"bbox": ' tj_population.html | sed 's#);##g' | sed 's#            geo_json_8b7d5198a511cd18e16301b3ef38921c_add(##g' | jq '.features | map(del(.properties."Population du ressort (en milliers d‘habitants)", .properties."__folium_color"))' | jq '{"type": "FeatureCollection","features": .}' >| tj-2025.geojson
``
@ThomasG77
ThomasG77 / index.js
Created June 12, 2025 09:28
Issue with geobucket package
import { jenksBuckets } from "geobuckets";
const data = [60, 26, 20, 17, 10, 27, 98, 42, 55, 35];
const numClasses = 3;
const buckets = await jenksBuckets(data, numClasses);
console.log(buckets);
@ThomasG77
ThomasG77 / README.md
Last active June 11, 2025 10:56
Rapide exploitation des données SWI catnat (grilles et données)

Rapide exploitation des données SWI catnat (grilles et données)

Coordonnées des mailles https://donneespubliques.meteofrance.fr/client/document/metadonnees_swi_276.csv (pris depuis la page https://donneespubliques.meteofrance.fr/?fond=produit&id_produit=301&id_rubrique=40 partie Documentation)

curl -s https://donneespubliques.meteofrance.fr/client/document/metadonnees_swi_276.csv | sed 1,4d | sed 's/#//g' >| mailles_safran.csv

ogr2ogr -f "ESRI Shapefile" -dialect SQLite -sql "SELECT num_maille, lambx, lamby, lambx93, lamby93,lat_dg,lon_dg,PolygonFromText('POLYGON((' || (lambx * 100 - 4000) || ' ' || (lamby * 100 - 4000) || ',' || (lambx * 100 - 4000) || ' ' || (lamby * 100 + 4000) || ',' || (lambx * 100 + 4000) || ' ' || (lamby * 100 + 4000) || ',' || (lambx * 100 + 4000) || ' ' || (lamby * 100 - 4000) || ',' || (lambx * 100 - 4000) || ' ' || (lamby * 100 - 4000) || '))', 27572) AS geometry FROM mailles_safran" mailles_safran.shp mailles_safran.csv
zip mailles_safran.zip mailles_safran.shp maille
@ThomasG77
ThomasG77 / get-ocs-data-filtered.py
Created May 22, 2025 13:20
OCSGE téléchargement IGN flux Atom
import xml.etree.ElementTree as ET
import requests
base_url_ocsge = "https://data.geopf.fr/telechargement/resource/OCSGE"
limit = 50
first_page = f'{base_url_ocsge}?page=1&limit={limit}'
r_first_page = requests.get(first_page)
root = ET.fromstring(r_first_page.text)