Create geographic maps for Belgian data visualizations. Use when the user asks to add a map, create a choropleth map, visualize geographic data, show data by region/province/municipality, or add a MunicipalityMap component. This skill covers Belgian geographic data (regions, provinces, municipalities) using NIS codes.
This skill guides you through creating geographic visualizations using the MunicipalityMap component, which displays Belgian geographic data at the municipality level (581 municipalities) with optional province boundaries.
Important: All maps render ONLY at the municipality level. There is no hierarchical level-switching between regions, provinces, and municipalities.
import { MunicipalityMap } from "@/components/analyses/shared/MunicipalityMap"
<MunicipalityMap
data={municipalityData}
getGeoCode={(d) => d.municipalityCode} // NIS code (5 digits)
getValue={(d) => d.value}
/>
<MunicipalityMap
data={municipalityData}
getGeoCode={(d) => d.code}
getValue={(d) => d.permits}
showProvinceBoundaries={true} // Overlay province borders
colorScheme="YlOrRd"
/>
import { expandProvinceToMunicipalities } from "@/lib/map-utils"
// Province-level data
const provinceData = [
{ provinceCode: '10000', permits: 500 }, // Antwerp
{ provinceCode: '20001', permits: 300 } // Brussels
]
// Expand to municipalities
const municipalityData = expandProvinceToMunicipalities(
provinceData,
(d) => d.provinceCode,
(d) => d.permits
)
<MunicipalityMap
data={municipalityData}
getGeoCode={(d) => d.municipalityCode}
getValue={(d) => d.value}
showProvinceBoundaries={true}
/>
interface MunicipalityMapProps<T> {
data: T[] // Array of municipality data
getGeoCode: (item: T) => string // Extract NIS municipality code (5 digits)
getValue: (item: T) => number // Extract value for color scale
showProvinceBoundaries?: boolean // Show province overlay (default: false)
colorScheme?: string // D3 color scheme (default: YlOrRd)
}
'01000' - Brussels-Capital Region'02000' - Flemish Region (Vlaanderen)'03000' - Walloon Region (Wallonie)'10000' - Antwerp (Antwerpen)'20001' - Brussels-Capital (Brussel Hoofdstedelijk Gewest)'30000' - Flemish Brabant (Vlaams-Brabant)'40000' - Limburg'50000' - East Flanders (Oost-Vlaanderen)'60000' - West Flanders (West-Vlaanderen)'70000' - Walloon Brabant (Waals-Brabant)'80000' - Hainaut (Henegouwen)'90000' - Liège (Luik)'91000' - Luxembourg (Luxemburg)'92000' - Namur (Namen)5-digit codes, e.g.:
'11001' - Antwerp city'21001' - Brussels city (Anderlecht)'44021' - HasseltConverts province-level data to municipality-level data by distributing values equally across all municipalities in each province.
import { expandProvinceToMunicipalities } from "@/lib/map-utils"
const municipalityData = expandProvinceToMunicipalities<T>(
data: T[], // Province-level data
getProvinceCode: (item: T) => string, // Extract province code
getValue: (item: T) => number // Extract value
): MunicipalityDataPoint[]
// Returns: [{ municipalityCode: string, value: number }, ...]
Example:
const provinceData = [
{ p: '10000', permits: 600 }, // Antwerp province (69 municipalities)
{ p: '20001', permits: 200 } // Brussels (19 municipalities)
]
const municipalityData = expandProvinceToMunicipalities(
provinceData,
(d) => d.p,
(d) => d.permits
)
// Result:
// - Each Antwerp municipality gets: 600 / 69 ≈ 8.7 permits
// - Each Brussels municipality gets: 200 / 19 ≈ 10.5 permits
Similar to province expansion, but for region-level data.
import { expandRegionToMunicipalities } from "@/lib/map-utils"
const municipalityData = expandRegionToMunicipalities<T>(
data: T[],
getRegionCode: (item: T) => string,
getValue: (item: T) => number
): MunicipalityDataPoint[]
The MunicipalityMap integrates seamlessly with AnalysisSection for full chart/table/map views:
import { AnalysisSection } from "@/components/analyses/shared/AnalysisSection"
import { GeoProvider } from "@/components/analyses/shared/GeoContext"
import { expandProvinceToMunicipalities } from "@/lib/map-utils"
export function Dashboard() {
const provinceData = // load province-level data
// Expand for map
const mapData = expandProvinceToMunicipalities(
provinceData,
(d) => d.provinceCode,
(d) => d.value
)
return (
<GeoProvider>
<AnalysisSection
title="Permits by Province"
slug="permits"
sectionId="by-province"
data={provinceData}
getLabel={(d) => d.provinceName}
getValue={(d) => d.value}
columns={columns}
mapData={mapData}
getGeoCode={(d) => d.municipalityCode}
showProvinceBoundaries={true}
/>
</GeoProvider>
)
}
Use geo-utils.ts for reference data:
import {
REGIONS,
PROVINCES,
MUNICIPALITIES,
getMunicipalitiesByProvince,
getProvinceByCode
} from "@/lib/geo-utils"
// Get all municipalities in Antwerp province
const antwerpenMunis = getMunicipalitiesByProvince('10000')
// Returns: [{ code: '11001', name: 'Antwerpen' }, { code: '11002', name: 'Aartselaar' }, ...]
// Get province details
const province = getProvinceByCode('10000')
// Returns: { code: '10000', name: 'Antwerpen', regionCode: '02000' }
MunicipalityMap supports D3 color schemes for choropleth maps:
Sequential (single hue):
'YlOrRd' (default) - Yellow-Orange-Red'Blues' - Light to dark blue'Greens' - Light to dark green'Reds' - Light to dark redDiverging (dual hue):
'RdYlGn' - Red-Yellow-Green'RdBu' - Red-Blue'PuOr' - Purple-OrangeExample:
<MunicipalityMap
data={data}
getGeoCode={(d) => d.code}
getValue={(d) => d.value}
colorScheme="Blues"
/>
import { MunicipalityMap } from "@/components/analyses/shared/MunicipalityMap"
import { expandProvinceToMunicipalities } from "@/lib/map-utils"
const provinceData = // load from results/by_province.json
const mapData = expandProvinceToMunicipalities(
provinceData,
(d) => d.p,
(d) => d.count
)
<MunicipalityMap
data={mapData}
getGeoCode={(d) => d.municipalityCode}
getValue={(d) => d.value}
showProvinceBoundaries={true}
/>
const municipalityData = // load from results/by_municipality.json
<MunicipalityMap
data={municipalityData}
getGeoCode={(d) => d.m}
getValue={(d) => d.permits}
/>
import { expandRegionToMunicipalities } from "@/lib/map-utils"
const regionData = // load from results/by_region.json
const mapData = expandRegionToMunicipalities(
regionData,
(d) => d.r,
(d) => d.total
)
<MunicipalityMap
data={mapData}
getGeoCode={(d) => d.municipalityCode}
getValue={(d) => d.value}
showProvinceBoundaries={true}
/>
Data preparation:
geo-utils.ts reference dataPerformance:
Visualization choices:
Geographic filtering:
GeoProvider for filtering capabilityGeoFilter component for region/province/municipality selectionMap not displaying:
data is not emptygetGeoCode returns valid 5-digit NIS codesIncorrect colors:
getValue returns a number (not string)Province data showing incorrectly:
expandProvinceToMunicipalities utilitygetGeoCode (must be municipality codes)showProvinceBoundaries={true} for visual clarityMissing municipalities:
See real implementations: