>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Python

OpenStreetMap-data omzetten in posters met prettymaps

Soms kom je bibliotheken tegen die gewoon een lust voor het oog zijn. Ze lossen geen complexe enterprise-problemen op of versnellen builds tienvoudig — in plaats daarvan nemen ze geodata en zetten ze om in grafische afbeeldingen die je wilt printen en in een lijst aan de muur wilt hangen.

Ongeveer drie jaar geleden gingen vectorronde stadskaarten met zachte pastelkleuren viraal op Reddit en Hacker News. Het bleek dat dit esthetische ontwerp was gemaakt door een klein script van Braziliaanse ontwikkelaar Marcelo Prates. Het project heet prettymaps.

Onder de motorkap

De bibliotheek is opgebouwd met een eenvoudige set van hulpmiddelen. Het haalt ruwe geografische kenmerken op van OpenStreetMap via osmnx, verwerkt veelhoekgeometrie met shapely, en render de uiteindelijke compositie via de vertrouwde matplotlib. Voor het voorbereiden van vectorcontouren voor plotters gebruikte de auteur ook vsketch.

In plaats van handmatig lagen te exporteren, tags voor wegen, rivieren en gebouwen te filteren, projecties te configureren en te worstelen met matplotlib asstijlen, geef je simpelweg een adres of coördinaten door en krijg je een kant-en-klare tekening.

Een snelle start ziet er letterlijk zo uit:

import prettymaps

plot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')

Met één functieaanroep worden de data voor het gewenste gebied gedownload, in lagen gesneden en de plot gebouwd.

Je kaart aanpassen

De volledige flexibiliteit van de bibliotheek komt tot uiting in de fijnafstemmingsopties van de prettymaps.plot()-functie.

Hier zijn de parameters waar je het meest mee zult werken:

  • layers definieert een woordenboek van OpenStreetMap-lagen. Hier stel je de tags in die worden gebruikt om objecten te selecteren: waterlichamen (natural: water), gebouwen (building: True), parken, straten van verschillende categorieën, of spoorwegen.
  • style stelt weergaveregels in voor elke laag. Dit accepteert vertrouwde matplotlib-parameters: vulkleur (fc), streekkleur (ec), lijndikte (lw), en kant-en-klare kleurenpaletten (palette).
  • circle, radius en dilate bepalen de canvasgrenzen. Je kunt de kaart bijsnijden tot een perfecte cirkel met een gegeven straal in meters of een rechthoekig gebied behouden.
  • preset laadt kant-en-klare stijlconfiguraties (bijvoorbeeld default, minimal, macao of tijuca) zodat je niet vanaf nul een kleurenschema hoeft op te bouwen.

Een voorbeeld van het configureren van een specifieke locatie:

plot = prettymaps.plot(
    'Praça Ferreira do Amaral, Macau',
    circle=True,
    radius=1100,
    layers={
        "water": {"tags": {"natural": ["water", "bay"]}},
        "building": {"tags": {"building": True}},
    },
    style={
        "water": {"fc": "#a1e3ff", "ec": "#2F3737"},
        "building": {"palette": ["#FFC857", "#E9724C", "#C5283D"]},
    },
)

De functie retourneert een Plot-dataclass-object. Hierin vind je geodataframes voor elke laag (geodataframes), evenals referenties naar matplotlib fig- en ax-objecten. Dit is handig als je je eigen annotaties, markers of labels wilt toevoegen met standaard Python-plotmethoden.

Uitvoeren zonder code te schrijven

Als je te lui bent om code te schrijven of snel door paletten voor verschillende steden wilt klikken, bevat de repository een kant-en-klare webinterface gebouwd met streamlit.

Het pakket installeren:

pip install prettymaps

De interface starten:

streamlit run app.py

Voor interactieve experimenten heeft de auteur een notebook voorbereid voor marimo (een moderne vervanger voor Jupyter). Je kunt het lokaal openen met de opdracht marimo edit notebooks/tutorial.py of het direct uitvoeren in Google Colab via de link in de documentatie.

Praktische toepassingen

De eerste toepassing die in je opkomt is generatieve kunst en merchandise. Kaarten van thuissteden, buurten of gedenkwaardige plaatsen in een minimalistische stijl werken geweldig voor posters, ansichtkaarten en t-shirts. Omdat de bibliotheek het exporteren van vectorcontouren ondersteunt, kun je de grafische afbeeldingen naar penplotters en graveermachines sturen.

Het tweede scenario is rapport- en presentatieontwerp. Als je een stadsstudie uitvoert, toegankelijkheid van openbaar vervoer analyseert of een vastgoeddashboard bouwt, zien standaardorkaarttegels er vaak overladen uit. Hier kun je alleen de contouren van stadsblokken en waterlichamen behouden, en ze strikt in de kleuren van je merk kleuren.

Licentie en belangrijke opmerkingen

Het project heeft een paar dingen die het waard zijn om te weten voordat je het gebruikt.

De code wordt gedistribueerd onder de GNU AGPL v3.0-licentie. Dit brengt verplichtingen met zich mee: als je de bibliotheek gebruikt op de backend van een netwerkdienst, moet je die dienst open-source maken.

Bij het exporteren van afbeeldingen moet je de attributie aan OpenStreetMap en de repository zelf behouden — dit is een directe vereiste van de geodata-licentie. De repositoryauteur is ook principieel gekant tegen het gebruik van hun generator voor de verkoop van NFT's en benadrukt dit specifiek in de README.

Is het de moeite waard om te proberen

De bibliotheek doet uitstekend zijn werk. Als je ooit een mooie stadskaart nodig hebt gehad zonder handmatig werk in Illustrator of QGIS, bespaart prettymaps je uren werk.

Om te beginnen installeer je het pakket gewoon via pip en doorloop je een paar voorbeelden van Colab. Het project werkt met Python 3.11+, haalt betrouwbaar data op via de OSM API en produceert voorspelbare resultaten.

Gerelateerde projecten