<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Duckdb on Boris Dupoux</title><link>https://borisdupoux.com/tags/duckdb/</link><description>Recent content in Duckdb on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/tags/duckdb/index.xml" rel="self" type="application/rss+xml"/><item><title>Points of Interest and Urban Flows in Fort-de-France City Centre from Open Data</title><link>https://borisdupoux.com/research/urban-flows-fort-de-france/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/research/urban-flows-fort-de-france/</guid><description>&lt;h2 id="context"&gt;&lt;a href="#context" class="header-anchor"&gt;&lt;/a&gt;Context
&lt;/h2&gt;&lt;p&gt;Fort-de-France (Martinique) has almost no local open data. The city&amp;rsquo;s own
datasets were last updated in 2019, and there are no public pedestrian
counters, open transit ridership figures or open road counts at
city-centre scale. The project asks how far national open data and
continuously archived feeds can go in describing the city centre as a system
of &lt;strong&gt;points of interest&lt;/strong&gt; (shops, administrations, schools, health, culture,
entry gates) and &lt;strong&gt;flows&lt;/strong&gt; (residents, commuters, pupils, visitors, cruise
passengers, vehicles, buses) over a ten-year horizon (2016–2026).&lt;/p&gt;
&lt;p&gt;No single source answers that question. The business register knows where
establishments are but not who visits them. The census knows where people
sleep but not where they spend the day. Transit feeds show the buses but not
their passengers, and cruise schedules show the ships but not the people
ashore. The approach is therefore to &lt;strong&gt;cross many heterogeneous sources&lt;/strong&gt; on
a common spatial and temporal frame, so that each one fills a blind spot of
the others, and to check the result against the few measured signals that do
exist.&lt;/p&gt;
&lt;h2 id="approach"&gt;&lt;a href="#approach" class="header-anchor"&gt;&lt;/a&gt;Approach
&lt;/h2&gt;&lt;p&gt;The method comes from an earlier knowledge-base project of mine. Raw data is
immutable and addressed by content. Every database is disposable and rebuilt
from it. Every value keeps its provenance, and a set of invariants is checked
on each rebuild.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A[Source catalogue&lt;br/&gt;sources.yaml] --&gt; B[Immutable raw store&lt;br/&gt;sha256 + JSONL manifest]
 C[Scheduled collectors&lt;br/&gt;Meta every 14 days · GTFS-RT 60 s] --&gt; B
 B --&gt; D[Versioned extractors&lt;br/&gt;normalised Parquet]
 D --&gt; E[DuckDB spatial warehouse&lt;br/&gt;rebuilt, never edited]
 E --&gt; F[QA invariants I1–I6]
 E --&gt; G[Statistics&lt;br/&gt;requetes/*.sql]
 E --&gt; H[Desktop application&lt;br/&gt;map + time selector]
 G --&gt; I[Calibration against&lt;br/&gt;measured signals]&lt;/pre&gt;&lt;h2 id="methods"&gt;&lt;a href="#methods" class="header-anchor"&gt;&lt;/a&gt;Methods
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Acquisition.&lt;/strong&gt; Each download is hashed (SHA-256) and logged in a JSONL
manifest, and acquisition is idempotent. National files larger than 1 GB
(Sirene business register) are read as remote HTTP-range extracts filtered
to the municipality. The filtering query is recorded as part of the
provenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ephemeral sources.&lt;/strong&gt; Meta Movement Distribution keeps only 90 days online,
so a scheduled task archives it every 14 days. A bus collector polls GTFS-RT
vehicle positions every 60 s and predictions every 10 min, and zips each day
with a SHA-256 checksum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spatial frame.&lt;/strong&gt; Data is stored in WGS84 and computed in EPSG:5490 on the
INSEE 200 m grid. Points of interest are classified by one typology
(NAF codes, OSM tags, stops), with family, weight and an hourly rhythm over
seven time slots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Models.&lt;/strong&gt; Hourly presence per grid cell combines residents (Filosofi
2021, distributed dasymetrically to buildings), employees, pupils and
tourists. A Huff model estimates catchment. Cruise passengers onshore are
modelled from ship schedules and capacities. An island-wide gravity model
with BPR assignment covers visitors and through-traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality.&lt;/strong&gt; Six invariants are checked, from provenance to the absence of
personal data. Unconfirmed parameters go in a decision log.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data-sources"&gt;&lt;a href="#data-sources" class="header-anchor"&gt;&lt;/a&gt;Data sources
&lt;/h2&gt;&lt;p&gt;Crossing the sources is the core of the project. Business registers (Sirene,
BODACC, URSSAF) give the stock and turnover of activities, but say nothing
about the people around them. The census and tax data (RP, Filosofi) place
residents, their income and housing vacancy, but only at night. Commuting
files and the national travel survey (MOBPRO, MOBSCO, EMP) say who travels,
why and when. Transit, accident and air-quality feeds (GTFS-RT, BAAC,
Madininair) are the only measured traces of movement. Cruise schedules and
ship capacities bring a population that no census counts. The geographic
frames (IGN, OpenStreetMap, the INSEE 200 m grid) are what make all of these
comparable cell by cell.&lt;/p&gt;
&lt;p&gt;The catalogue lists &lt;strong&gt;120 sources&lt;/strong&gt;: 51 integrated, 32 to integrate, 7 to
verify, 13 available on request only, 5 paid, 1 by partnership and 11 not
retained. The tables below list every integrated source and summarise the
others by theme.&lt;/p&gt;
&lt;h3 id="businesses-jobs--amenities"&gt;&lt;a href="#businesses-jobs--amenities" class="header-anchor"&gt;&lt;/a&gt;Businesses, jobs &amp;amp; amenities
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/fr/datasets/base-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret/" target="_blank" rel="noopener"
 &gt;Sirene business register&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Establishments, activity code (NAF), creation and closure dates, headcount bands&lt;/td&gt;
					&lt;td&gt;Full history; stock rebuilt at any date 2016–2026&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BODACC — DILA&lt;/td&gt;
					&lt;td&gt;Business turnover and failures (sales of goodwill, insolvency proceedings)&lt;/td&gt;
					&lt;td&gt;2016–2026, daily&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/8217525" target="_blank" rel="noopener"
 &gt;Permanent amenities database (BPE)&lt;/a&gt;, geolocated — INSEE&lt;/td&gt;
					&lt;td&gt;Shops, services, health, administrations, education, sport, tourism&lt;/td&gt;
					&lt;td&gt;2024 and 2025 editions, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://open.urssaf.fr/explore/dataset/etablissements-et-effectifs-salaries-au-niveau-commune-x-ape-last/" target="_blank" rel="noopener"
 &gt;Establishments and salaried headcount by municipality × activity&lt;/a&gt; — URSSAF / Acoss&lt;/td&gt;
					&lt;td&gt;Private salaried employment by activity&lt;/td&gt;
					&lt;td&gt;2006–2025, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.education.gouv.fr/explore/dataset/fr-en-annuaire-education/" target="_blank" rel="noopener"
 &gt;Education directory and pupil numbers&lt;/a&gt; — MENJ / DEPP&lt;/td&gt;
					&lt;td&gt;Schools, location, pupils per school year, staff&lt;/td&gt;
					&lt;td&gt;Pupil numbers 2016–2025&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FINESS — DREES / ARS&lt;/td&gt;
					&lt;td&gt;Health and social facilities, pharmacies&lt;/td&gt;
					&lt;td&gt;Extract of May 2026, bimonthly&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://docs.overturemaps.org/guides/places" target="_blank" rel="noopener"
 &gt;Overture Maps places&lt;/a&gt; — Overture Maps Foundation&lt;/td&gt;
					&lt;td&gt;Points of interest with a confidence score (comparison layer)&lt;/td&gt;
					&lt;td&gt;Frozen extract of release 2026-09-23, monthly&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenStreetMap (Overpass) — OpenStreetMap contributors&lt;/td&gt;
					&lt;td&gt;Points of interest, shops, streets, pedestrian paths&lt;/td&gt;
					&lt;td&gt;Current state&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Historic monuments (Mérimée / POP) — Ministry of Culture&lt;/td&gt;
					&lt;td&gt;Heritage attractors (cathedral, Schœlcher library, Fort Saint-Louis)&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;23 more&lt;/em&gt; — e.g. Flores localised employment (INSEE), Foursquare Open Source Places, LOCOMVAC vacant commercial premises (DGFiP), Google Places&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="population-income--housing"&gt;&lt;a href="#population-income--housing" class="header-anchor"&gt;&lt;/a&gt;Population, income &amp;amp; housing
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/8647014" target="_blank" rel="noopener"
 &gt;Census, IRIS-level files (RP)&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Residents, age, occupations, dwellings (vacancy, car ownership), workforce&lt;/td&gt;
					&lt;td&gt;RP 2016 → RP 2022, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/8229323" target="_blank" rel="noopener"
 &gt;Filosofi by IRIS&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Disposable and declared income, poverty&lt;/td&gt;
					&lt;td&gt;2016–2021, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/fichier/8735162/Filosofi2021_carreaux_200m_csv.zip" target="_blank" rel="noopener"
 &gt;Filosofi 200 m grid files&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Tax households, individuals, poverty, social housing and age per 200 m cell&lt;/td&gt;
					&lt;td&gt;2015, 2017, 2019, 2021&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Filosofi 200 m grid, Géoplateforme WFS layer — INSEE&lt;/td&gt;
					&lt;td&gt;Grid cell geometries&lt;/td&gt;
					&lt;td&gt;2015 layer&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/536998cba3a729239d20505e" target="_blank" rel="noopener"
 &gt;IRCOM income tax by municipality&lt;/a&gt; — DGFiP&lt;/td&gt;
					&lt;td&gt;Tax households, declared income&lt;/td&gt;
					&lt;td&gt;2016–2024, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.caf.fr/explore/dataset/s_ben_com_f/information/" target="_blank" rel="noopener"
 &gt;Cafdata&lt;/a&gt; — CNAF&lt;/td&gt;
					&lt;td&gt;Recipients of minimum income, housing and family benefits&lt;/td&gt;
					&lt;td&gt;2020–2024 (2022 missing), annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/5a561801c751df42d7fca9b6" target="_blank" rel="noopener"
 &gt;Priority neighbourhoods (QPV)&lt;/a&gt; — ANCT / INSEE&lt;/td&gt;
					&lt;td&gt;Priority urban policy areas, which include the city centre&lt;/td&gt;
					&lt;td&gt;2024 boundaries&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/61816c6e23197bb34835228e" target="_blank" rel="noopener"
 &gt;LOVAC&lt;/a&gt; — Cerema / DGALN&lt;/td&gt;
					&lt;td&gt;Short-term and structural (≥ 2 years) vacancy of private housing&lt;/td&gt;
					&lt;td&gt;2020–2026 editions, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RPLS social housing — SDES&lt;/td&gt;
					&lt;td&gt;Social dwellings (address, surface, rent, vacancy)&lt;/td&gt;
					&lt;td&gt;2023 and 2025&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sitadel building permits — SDES&lt;/td&gt;
					&lt;td&gt;Dwellings and premises authorised, started, demolished&lt;/td&gt;
					&lt;td&gt;2013–2026, monthly&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://files.data.gouv.fr/geo-dvf/latest/csv/" target="_blank" rel="noopener"
 &gt;Geolocated DVF&lt;/a&gt; — DGFiP / Etalab&lt;/td&gt;
					&lt;td&gt;Property transactions (price, surface, commercial premises)&lt;/td&gt;
					&lt;td&gt;2021–2025, rolling 5 years&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;8 more&lt;/em&gt; — e.g. census detail files and legal populations (INSEE), DV3F and land files (Cerema / DGFiP), WorldPop / GHSL gridded population&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="mobility--transport"&gt;&lt;a href="#mobility--transport" class="header-anchor"&gt;&lt;/a&gt;Mobility &amp;amp; transport
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/8582949" target="_blank" rel="noopener"
 &gt;Commuting flows (MOBPRO)&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Home → work flows between municipalities&lt;/td&gt;
					&lt;td&gt;2016–2022, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/8582969" target="_blank" rel="noopener"
 &gt;School commuting (MOBSCO)&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Home → study flows between municipalities&lt;/td&gt;
					&lt;td&gt;2016–2022, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/donnees-detaillees-de-lenquete-mobilite-des-personnes-2018-2019" target="_blank" rel="noopener"
 &gt;National travel survey 2018–2019 (EMP)&lt;/a&gt; — SDES&lt;/td&gt;
					&lt;td&gt;Trip purposes, departure and return times, activity durations, distances&lt;/td&gt;
					&lt;td&gt;2018–2019&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://transport.data.gouv.fr/datasets/gtfs-urbain-de-la-zone-centre" target="_blank" rel="noopener"
 &gt;GTFS, urban network Centre zone&lt;/a&gt; (Mozaïk, BRT lines) — Martinique Transport&lt;/td&gt;
					&lt;td&gt;Scheduled transit supply&lt;/td&gt;
					&lt;td&gt;Archives since June 2023&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GTFS-RT, continuous collection — Martinique Transport&lt;/td&gt;
					&lt;td&gt;Observed bus speeds, buses in service, declared occupancy&lt;/td&gt;
					&lt;td&gt;Since 7 October 2026; 60 s (positions), 10 min (predictions)&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://transport.data.gouv.fr/datasets/gtfs-du-reseau-maritime-de-martinique" target="_blank" rel="noopener"
 &gt;GTFS, ferry shuttles&lt;/a&gt; — Martinique Transport&lt;/td&gt;
					&lt;td&gt;Shuttles landing on the waterfront&lt;/td&gt;
					&lt;td&gt;Versions since August 2024&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/53698f4ca3a729239d2036df/" target="_blank" rel="noopener"
 &gt;Road injury accidents (BAAC)&lt;/a&gt; — ONISR&lt;/td&gt;
					&lt;td&gt;Geolocated accidents (pedestrians, vehicles), with time&lt;/td&gt;
					&lt;td&gt;2016–2024 loaded&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.humdata.org/dataset/movement-distribution" target="_blank" rel="noopener"
 &gt;Movement Distribution&lt;/a&gt; — Meta Data for Good / HDX&lt;/td&gt;
					&lt;td&gt;Share of users at home, within 10 km, 10–100 km, beyond 100 km&lt;/td&gt;
					&lt;td&gt;Daily; 90-day window, archived every 14 days&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.humdata.org/dataset/movement-range-maps" target="_blank" rel="noopener"
 &gt;Movement Range Maps&lt;/a&gt; — Meta Data for Good / HDX&lt;/td&gt;
					&lt;td&gt;Change in movement, share of users staying put&lt;/td&gt;
					&lt;td&gt;March 2020 → May 2022, daily (discontinued)&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BD TOPO main road network — IGN&lt;/td&gt;
					&lt;td&gt;Island road graph for traffic assignment&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BD TOPO road sections — IGN&lt;/td&gt;
					&lt;td&gt;Carriageway width, lanes and direction, used to measure kerbside parking&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenStreetMap car parks — OpenStreetMap contributors&lt;/td&gt;
					&lt;td&gt;Car parks, type, declared capacity&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;18 more&lt;/em&gt; — e.g. ridership and ticket validations (Martinique Transport, on request), road counts (on request), Orange Flux Vision mobile data (paid), Waze for Cities / Strava Metro (partnership), a pedestrian counting campaign (to be created)&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tourism--cruise"&gt;&lt;a href="#tourism--cruise" class="header-anchor"&gt;&lt;/a&gt;Tourism &amp;amp; cruise
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.cruisemapper.com/ports/fort-de-france-port-2382" target="_blank" rel="noopener"
 &gt;Cruise call schedule, port of Fort-de-France&lt;/a&gt; — CruiseMapper&lt;/td&gt;
					&lt;td&gt;Ship-by-ship calls with arrival and departure times&lt;/td&gt;
					&lt;td&gt;March 2026 → March 2029; archived monthly, as past months disappear&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.cruisemapper.com/ships" target="_blank" rel="noopener"
 &gt;Ship pages&lt;/a&gt; — CruiseMapper&lt;/td&gt;
					&lt;td&gt;Passenger capacity, crew, tonnage of ships in port&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cruise season reviews — Martinique Tourism Authority (CMT), via the press&lt;/td&gt;
					&lt;td&gt;Passengers and calls per season, cruise terminals&lt;/td&gt;
					&lt;td&gt;Seasons 2024–25 and 2025–26&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.humdata.org/dataset/martinique-daily-port-activity-data-and-shipment-estimates" target="_blank" rel="noopener"
 &gt;PortWatch&lt;/a&gt; — IMF / HDX&lt;/td&gt;
					&lt;td&gt;Daily port calls from AIS&lt;/td&gt;
					&lt;td&gt;2019–2026, daily&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/64808a5811da153f1439914c" target="_blank" rel="noopener"
 &gt;Monthly commercial air traffic&lt;/a&gt; — DGAC&lt;/td&gt;
					&lt;td&gt;Arrivals at Martinique Aimé Césaire airport (tourist seasonality)&lt;/td&gt;
					&lt;td&gt;1990–2025, monthly&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/hebergements-touristiques-classes-en-france/" target="_blank" rel="noopener"
 &gt;Classified tourist accommodation&lt;/a&gt; — Atout France&lt;/td&gt;
					&lt;td&gt;Classified hotels and residences, rooms and capacity&lt;/td&gt;
					&lt;td&gt;Current stock&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.insee.fr/fr/statistiques/2021703" target="_blank" rel="noopener"
 &gt;Tourist accommodation capacity&lt;/a&gt; — INSEE&lt;/td&gt;
					&lt;td&gt;Hotels by rating, campsites, residences, holiday villages&lt;/td&gt;
					&lt;td&gt;2015–2026, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;7 more&lt;/em&gt; — e.g. DATAtourisme (ADN Tourisme), INSEE hotel occupancy survey, Inside Airbnb / AirDNA, port authority call data&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="context-weather-air-calendar-safety"&gt;&lt;a href="#context-weather-air-calendar-safety" class="header-anchor"&gt;&lt;/a&gt;Context: weather, air, calendar, safety
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/donnees-climatologiques-de-base-horaires" target="_blank" rel="noopener"
 &gt;Climatological data&lt;/a&gt; — Météo-France&lt;/td&gt;
					&lt;td&gt;Rain, temperature, wind (Fort-de-France Desaix and Le Lamentin stations)&lt;/td&gt;
					&lt;td&gt;2010–2026, hourly / daily&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Air quality — Madininair&lt;/td&gt;
					&lt;td&gt;NO₂ as a traffic proxy, plus PM10, PM2.5, O₃ and H₂S from sargassum&lt;/td&gt;
					&lt;td&gt;Hourly; monthly NO₂ 2016–2026&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.data.gouv.fr/datasets/bases-statistiques-communale-departementale-et-regionale-de-la-delinquance-enregistree-par-la-police-et-la-gendarmerie-nationales" target="_blank" rel="noopener"
 &gt;Recorded crime by municipality&lt;/a&gt; — SSMSI&lt;/td&gt;
					&lt;td&gt;Recorded offences&lt;/td&gt;
					&lt;td&gt;2016–2025, annual&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Public holidays in Martinique — DINUM&lt;/td&gt;
					&lt;td&gt;Calendar, including 22 May&lt;/td&gt;
					&lt;td&gt;2006–2031&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://data.education.gouv.fr/explore/dataset/fr-en-calendrier-scolaire/" target="_blank" rel="noopener"
 &gt;School calendar&lt;/a&gt; — MENJ&lt;/td&gt;
					&lt;td&gt;School holidays, including Carnival&lt;/td&gt;
					&lt;td&gt;2017–18 → 2026–27&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pageviews — Wikimedia Foundation&lt;/td&gt;
					&lt;td&gt;Online interest in Fort-de-France, Carnival and heritage&lt;/td&gt;
					&lt;td&gt;2016–2026, monthly&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;4 more&lt;/em&gt; — e.g. NASA Black Marble night lights, Google Trends / GDELT, an events agenda (to be compiled)&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="geography--base-maps"&gt;&lt;a href="#geography--base-maps" class="header-anchor"&gt;&lt;/a&gt;Geography &amp;amp; base maps
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Source&lt;/th&gt;
					&lt;th&gt;What it contributes&lt;/th&gt;
					&lt;th&gt;Period / frequency&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Study perimeters — project&lt;/td&gt;
					&lt;td&gt;City centre and extended centre (provisional, see D1)&lt;/td&gt;
					&lt;td&gt;Version 0.1&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Administrative boundaries API (geo.api.gouv.fr) — DINUM / IGN / INSEE&lt;/td&gt;
					&lt;td&gt;Municipal boundary and legal population&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IRIS boundaries — IGN / INSEE&lt;/td&gt;
					&lt;td&gt;Sub-municipal census units&lt;/td&gt;
					&lt;td&gt;Current layer&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://cartes.gouv.fr/rechercher-une-donnee/dataset/IGNF_BD-TOPO" target="_blank" rel="noopener"
 &gt;BD TOPO&lt;/a&gt; — IGN&lt;/td&gt;
					&lt;td&gt;Buildings (height, use), roads, facilities&lt;/td&gt;
					&lt;td&gt;Quarterly editions&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BD TOPO residential buildings, extended centre — IGN&lt;/td&gt;
					&lt;td&gt;Use, height and footprint used to place households in buildings&lt;/td&gt;
					&lt;td&gt;Current edition&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenStreetMap vector base map — OpenStreetMap contributors&lt;/td&gt;
					&lt;td&gt;Streets, water, parks, coastline drawn in the application&lt;/td&gt;
					&lt;td&gt;Current&lt;/td&gt;
					&lt;td&gt;Integrated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;em&gt;9 more&lt;/em&gt; — e.g. Etalab cadastre, National Address Base, BD ORTHO aerial imagery (IGN), local urban plan (Géoportail de l&amp;rsquo;Urbanisme), natural risk maps (Géorisques)&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Catalogued&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="the-cœur-de-ville-application"&gt;&lt;a href="#the-c%c5%93ur-de-ville-application" class="header-anchor"&gt;&lt;/a&gt;The “Cœur de ville” application
&lt;/h2&gt;&lt;p&gt;The warehouse is explored through a desktop application (Electron, React, ECharts,
Leaflet on OpenStreetMap, DuckDB reading a copy of the warehouse). It is organised
around a few questions — who is there, when, what attracts, does parking cope, who
depends on public transport, is the centre gaining or losing — with a map always in
the same place, a shared day × time-slot selector, and every figure labelled with its
source and status.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Synthesis screen: key indicators, morning presence map on the 200 m grid, daily rhythm by population group and hourly car flows" class="gallery-image" data-flex-basis="395px" data-flex-grow="164" height="972" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-synthese.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-synthese_hu_1325b374e6fd7abc.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-synthese.jpg 1600w" width="1600"&gt;
&lt;em&gt;Synthesis — the centre at a glance: day/night ratio, parking pressure, retail
2016 → 2026, poverty, the next big cruise day, presence by 200 m cell and the daily
rhythm of residents, workers, pupils and tourists.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Flows screen: animated presence map by time slot and week-by-slot heat table" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-flux.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-flux_hu_f9fb52a2d7d7124a.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-flux.jpg 1500w" width="1500"&gt;
&lt;em&gt;Flows and moments of life — presence by cell for any day and time slot, playable as
an animation over the week, with the stacked daily curve per population group.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Points of interest screen: thousands of establishments by family, most attractive cells and opening-hour curves" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-poles.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-poles_hu_cf9d8514fb9c8d3d.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-poles.jpg 1500w" width="1500"&gt;
&lt;em&gt;Points of interest — establishments by family (business registry and OpenStreetMap),
the most attractive cells at the selected moment, and the share of establishments
open hour by hour.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Street-level zoom: facade of a street number by number, sector map and index 100 trend" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-ilot-perrinon.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-ilot-perrinon_hu_7d284fe42d9fc670.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-ilot-perrinon.jpg 1500w" width="1500"&gt;
&lt;em&gt;Street-level zoom on one block — the facade of the street number by number, active
and closed establishments since 2016, and the sector&amp;rsquo;s trend against the whole centre.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Evolution screen: attractiveness score per cell with a 2016–2026 year slider and supporting indicators" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-evolution.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-evolution_hu_1eb289eca6678a0e.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-evolution.jpg 1500w" width="1500"&gt;
&lt;em&gt;Evolution 2016–2026 — attractiveness per cell with a year slider, openings and
closures, tax households and other signals crossed on the same grid.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Parking screen: theoretical occupancy per cell with live-adjustable hypotheses" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-stationnement.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-stationnement_hu_8141213c09f19e60.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-stationnement.jpg 1500w" width="1500"&gt;
&lt;em&gt;Parking — supply rebuilt street by street and theoretical occupancy per cell and time
slot; every hypothesis (space length, lane width, modal share…) is a slider and the
result is recomputed in SQL.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Parking pressure on a weekday morning: cells coloured by theoretical occupancy, hypotheses and the week-by-slot occupancy table" class="gallery-image" data-flex-basis="425px" data-flex-grow="177" height="846" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-pression-parking.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-pression-parking_hu_48b3b457873b0ba9.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-pression-parking.jpg 1500w" width="1500"&gt;
&lt;em&gt;Parking pressure — Tuesday, 9–12 h: cars of residents and workers per public space
within 300 m on foot, cell by cell. The week table shows theoretical occupancy above 1
on weekday mornings, while evenings and weekends stay well below.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cruise calls and events screen: annual calendar of calls, ships of the day and passengers ashore by hour" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-escales.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-escales_hu_712bc4be717471d7.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-escales.jpg 1500w" width="1500"&gt;
&lt;em&gt;Cruise calls and events — the yearly calendar of calls with public holidays and
school holidays, the ships of a given day and an estimate of passengers ashore hour by
hour.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sources and hypotheses screen: searchable catalogue of sources with integration status, modelling parameters and acquisition log" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1122" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/urban-flows-fort-de-france/app-sources.jpg" srcset="https://borisdupoux.com/research/urban-flows-fort-de-france/app-sources_hu_e0417d4e381ce409.jpg 800w, https://borisdupoux.com/research/urban-flows-fort-de-france/app-sources.jpg 1500w" width="1500"&gt;
&lt;em&gt;Sources and hypotheses — the catalogue behind every number (filterable by status),
the modelling parameters with their justification, and the archived acquisitions.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="results"&gt;&lt;a href="#results" class="header-anchor"&gt;&lt;/a&gt;Results
&lt;/h2&gt;&lt;p&gt;The project started in October 2026 and is at an &lt;strong&gt;early, uncalibrated
stage&lt;/strong&gt; (application v0.6.0). All city-centre figures depend on a provisional
perimeter (see below). Each result below states which sources it crosses:
none of them could be produced from a single dataset.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalogue.&lt;/strong&gt; 120 sources are catalogued, of which 51 are integrated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warehouse (first build).&lt;/strong&gt; 117,161 entities, about 25,000 measures and
1,278 indicators, with all 6 invariants passing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retail decline vs residents (measured, registers × census × tax data).&lt;/strong&gt;
Active personal-goods establishments (Sirene) fell from 498 (2016) to 363
(2026), a drop of 27 %, and the city centre&amp;rsquo;s share of the municipality in
this sector fell from 75.5 % to 64.7 %. Over the same period, population in
the city-centre IRIS (census) fell from 13,444 (2016) to 12,898 (2022), and
housing vacancy rose from 24.9 % to 27.6 %. 47 % of city-centre households
are below the poverty line, against 30 % for the municipality (Filosofi
2021). Read together, the three sources show a centre losing shops,
residents and purchasing power at the same time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day/night rhythm (modelled, six sources crossed).&lt;/strong&gt; About 3,700 people
are present at night and 11,200 in the morning, a ratio of 3.0. Night-time
residents come from the Filosofi 200 m grid placed in BD TOPO buildings;
daytime workers from Sirene headcount bands; pupils from the education
directory; tourists from classified accommodation capacity. The morning
slot is adjusted on the hourly NO₂ profile of traffic stations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observed bus speed vs model (GTFS-RT × road graph × travel surveys).&lt;/strong&gt;
Over one full day, buses ran at 12.7 km/h at 05:00, falling to 7–8 km/h
during the day and 10.6 km/h at 19:00. The assignment model, built from BD
TOPO roads, MOBPRO commuting, EMP trip profiles and BPE amenities, predicts
a 20 % slowdown at peak hours, whereas the buses show 45 %. The measured
feed exposes what the model misses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cruise check (schedules × ship capacities × reported counts).&lt;/strong&gt; Onshore
passengers are modelled from the CruiseMapper call schedule and ship
capacities. On the one documented cruise day (24 April 2026), the estimates
came within about 1–2 % of the passenger counts reported in the press
(3,075 vs 3,112, and 1,995 vs 1,969). The fill rate used in the model was
set on that same day, so this is a consistency check, not an independent
validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations--next-steps"&gt;&lt;a href="#limitations--next-steps" class="header-anchor"&gt;&lt;/a&gt;Limitations &amp;amp; next steps
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;D1: the city-centre perimeter is provisional.&lt;/strong&gt; It is a rectangle around
the historic core plus a 1 km extended zone, used until an official
perimeter is provided. Every city-centre figure depends on it.&lt;/li&gt;
&lt;li&gt;No pedestrian, ridership or road-count data is open. Hourly rhythms,
attractiveness weights and parking assumptions are still uncalibrated. The
measured controls so far are hourly NO₂ at traffic stations and observed
bus speeds.&lt;/li&gt;
&lt;li&gt;The 2016–2026 business stock is rebuilt from creation and closure dates
only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next steps:&lt;/strong&gt; build up several months of GTFS-RT data for measured
congestion, request survey and counting data, and calibrate presence on
field counts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stack"&gt;&lt;a href="#stack" class="header-anchor"&gt;&lt;/a&gt;Stack
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; · &lt;code&gt;DuckDB&lt;/code&gt; (spatial, httpfs) · &lt;code&gt;Parquet&lt;/code&gt; · &lt;code&gt;SQL&lt;/code&gt; · &lt;code&gt;GTFS / GTFS-RT&lt;/code&gt; · &lt;code&gt;pytest&lt;/code&gt; · &lt;code&gt;ruff&lt;/code&gt; · &lt;code&gt;Electron&lt;/code&gt; · &lt;code&gt;React&lt;/code&gt; · &lt;code&gt;TypeScript&lt;/code&gt; · &lt;code&gt;ECharts&lt;/code&gt; · &lt;code&gt;Leaflet&lt;/code&gt; · &lt;code&gt;GitHub Actions&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>