Generate beautiful vintage-style historical maps from GeoJSON data.
bash
# Install dependencies
pip install geopandas matplotlib numpy Pillow pyproj shapely
# Download historical GeoJSON data
git clone https://github.com/aourednik/historical-basemaps.git
# Copy world_YYYY.geojson files to ./data/
# Generate a map
python generate.py --year 1914 --region europe --output europe_1914.png
Commonly used years from historical-basemaps:
text
world_bc3000.geojson, world_bc1500.geojson, world_100.geojson
world_500.geojson, world_1000.geojson, world_1200.geojson
world_1400.geojson, world_1492.geojson, world_1600.geojson
world_1700.geojson, world_1783.geojson, world_1815.geojson
world_1880.geojson, world_1900.geojson, world_1914.geojson
world_1920.geojson, world_1930.geojson, world_1938.geojson
world_1945.geojson, world_1960.geojson, world_2000.geojson
bash
python generate.py --year 1914 --region europe --output europe_1914.png
bash
python generate.py --year 1600 --region world --projection mollweide --palette dark --output world_1600.png
bash
python generate.py --year 1400 --region china --palette pastel \
--title "MING DYNASTY" --title-cn "明朝疆域" --output ming.png
bash
python generate.py --year 1815 --region 18,34,32,48 --output balkans_1815.png
Create my_events.json:
json
[
{"year": "1789", "label": "Revolution", "cn": "法国大革命", "color": "#4169E1"},
{"year": "1804", "label": "Empire", "cn": "拿破仑称帝", "color": "#2E5E2E"},
{"year": "1815", "label": "Fall", "cn": "滑铁卢", "color": "#8B0000"}
]
bash
python generate.py --year 1815 --events my_events.json --output napoleon.png
bash
python generate.py --year 1945 --region world \
--title "POST-WAR WORLD" --title-cn "二战后的世界" \
--palette vintage --output postwar.png
ParameterDefaultDescription--yearrequiredHistorical year (must match a GeoJSON file)--region``europeRegion preset or lon_min,lat_min,lon_max,lat_max``--projection``laea``laea, lcc, mollweide, platecarree``--palette``vintage``vintage, pastel, dark, satellite``--titleautoMain title (Latin/English)--title-cnautoChinese subtitle--dataauto-detectPath to GeoJSON file--basemapnonePath to satellite basemap image--parchmentnonePath to parchment texture image--eventsauto-presetPath to events JSON file--dpi300Output resolution--no-timelinefalseDisable bottom timeline--no-compassfalseDisable compass rose--no-postprocessfalseSkip vignette/noise effects--output``historical_map.pngOutput file path
KeyCoverageeuropeFull European continentbalkansBalkan PeninsulaworldGlobal viewasiaAsian continentchinaChina and surroundingsmediterraneanMediterranean basinmiddle_eastMiddle EastamericasNorth + South America
HOI4-inspired desaturated military colors. Ocean: dark teal. Perfect for war maps.
Light, soft colors on off-white background. Great for educational content.
Deep navy background with gold accents. Dramatic, cinematic feel.
Modern cartography style with clean lines. Professional and neutral.
python
from generate import HistoricalMapGenerator
gen = HistoricalMapGenerator(
data_path='data/world_1914.geojson',
basemap_path='textures/satellite.jpg',
parchment_path='textures/parchment.jpg',
)
gen.generate(
year=1914,
region='europe',
projection='laea',
title='EUROPA ANNO DOMINI MCMXIV',
title_cn='第一次世界大战前夜的欧洲',
color_palette='vintage',
dpi=300,
output_path='my_map.png',
)
historical-basemaps by @aourednik. 50+ GeoJSON time slices covering 10,000 BC to 2010 AD.
Note: Border precision varies. The BORDERPRECISION field indicates accuracy (1=high, 3=approximate). Some regions (especially Balkans) may have minor gaps between neighboring territories. For publication-quality maps, consider manually editing the GeoJSON or using commercial data.
MIT
Developed by Lumielle / OpenClaw Agent Data: historical-basemaps (CC BY 4.0)