Zwemmen in de buurt

Zwembaden in Nederland, België en delen van Duitsland op één plek, met de baden per gebouw, voorzieningen, openingstijden, tarieven en reistijd.

Type
Privé / hobby
Duur
Doorlopend
Stack

Een zwembadengids voor Nederland, België en delen van Duitsland, met bijna 2.200 zwembaden in ruim 1.500 plaatsen. Je typt een plaatsnaam en ziet welke zwembaden er in de buurt zijn, welke baden er in dat gebouw zitten, hoe lang je erover doet en wat het kost. Handig voor een gezin dat een leuk bad voor de kinderen zoekt, maar ook voor baanzwemmers die een 50-meterbad willen of iemand die warm water of een tillift nodig heeft.

Het idee stond in juni 2022 al als leeg item op mijn vorige portfolio: alleen een titel. Het bleef jaren liggen, omdat het pas zin had met een goede basis eronder. Er is veel nagedacht over de opbouw: de infrastructuur, het datamodel en hoe je data binnenhaalt zonder dat het een rommel wordt. In september 2026 ben ik het gaan bouwen, en twee maanden en ruim 650 commits later is de gids veel verder dan de eerste versie.

Waarom

De informatie bestaat wel, maar staat verspreid over honderden gemeentesites, elk in een eigen opmaak. Openingstijden in een plaatje, tarieven in een PDF, en nergens staat welke baden er in één gebouw zitten. De waarde zit in verzamelen, structureren en vergelijkbaar maken.

Hoe het werkt

Laravel 12 met Inertia en Vue 3, op de server gerenderd zodat zoekmachines de inhoud meteen zien. OpenStreetMap is de enige vrije bron met landelijke dekking. Die weet waar een zwembad staat, maar zelden welke baden er zijn, hoe diep en warm het water is of wat het kost.

Daarom werkt het in stappen. Elke week scant de server een paar provincies of deelstaten. Een sorteerstap handelt de duidelijke gevallen af: nieuwe locaties in Nederland en België gaan door, nieuwe vondsten in Duitsland worden een concept. Twijfel komt in het scherm Te beoordelen, waar ik per veld kies wat ik overneem.

Wat OpenStreetMap niet weet, komt van de sites van de baden zelf. Sinds november staat daarvoor een knop in het beheer: Claude leest de site van het bad terwijl je meekijkt, en elke gevonden wijziging wordt een rij om aan te vinken. Een los script loopt ruim 4.000 links na en meldt wat kapot of verhuisd is. Mail met baden en redacties loopt via een eigen postvak in het beheer.

Reistijd komt uit OSRM, plaatssuggesties in Nederland uit PDOK en in België en Duitsland uit Nominatim.

Kernpunten waar ik trots op ben

  • Een scan overschrijft niets. Lege velden vult de scan zelf in, een echt verschil komt als voorstel. Wat met de hand is ingevuld blijft staan, en een afgewezen voorstel komt niet terug.
  • Sorteren tegen dubbelingen. In OpenStreetMap heeft een peuterbad soms een eigen object. Wat een bassinnaam draagt of binnen 200 meter van een bekend zwembad ligt, wordt afgewezen.
  • Verrijking als bestand. Feiten van de sites van de baden landen als JSON in de repo. Zo is elke wijziging te lezen in een diff.
  • Eigen cijfers. De tarieven van ruim 1.600 baden staan naast elkaar, met de mediaan per land, provincie en soort bad. Zo is te zien dat wie in België buiten de eigen gemeente zwemt bij bijna twee derde van de baden meer betaalt. De site rekent dit elke dag opnieuw uit, en in november gingen de cijfers als persbericht naar regionale redacties.
  • Alleen pagina’s met inhoud in de index. In oktober bestond 78% van de sitemap uit gegenereerde lijstpagina’s. Nu gaat een bad pas de index in met minstens twee van zeven kenmerken, zoals een echte beschrijving, een tarief, foto’s of een bezoekerstip. De sitemap ging van 9.588 naar ongeveer 4.000 adressen, en een pagina komt vanzelf terug zodra hij genoeg heeft.
  • Beeld met herkomst. Foto’s van Wikimedia Commons en Pexels staan op mijn eigen server, met maker en licentie erbij. Bij foto’s van de site van het bad staat de bron, en een rechthebbende kan ze met één melding laten weghalen. De automatische fotoronde is eruit: van 58 foto’s met een hoge score bleken er 44 fout, zoals een wapen, logo of poster.
  • Toegankelijkheid als inhoud. Rolstoeltoegang, tilliften en prikkelarme uren staan in de filters en op een eigen overzichtspagina. De site zelf is getest met axe tegen WCAG 2.2 AA: 0 contrast- en tikvlakfouten op 16 openbare pagina’s, op telefoon en desktop.
  • Zichtbaar onderhoud. Elke badpagina noemt de datum van de laatste controle, en een openbare pagina laat per week zien hoeveel baden zijn nagelopen, toegevoegd en bijgewerkt. Bezoekers kunnen een fout melden of een tip achterlaten.

Wat er nog niet in zit

Nog meer zwembaden, nog meer informatie! Bij ruim 500 baden staat nog geen los tarief, en bij veel baden wisselt het rooster per week, zodat er alleen een link naar dat rooster staat. Van Duitsland staan alleen Nedersaksen en Noordrijn-Westfalen online; de Eifel, de Moezel, de Harz en de Noordzeekust staan klaar als concept.

Wat het opleverde

Een privéproject dat live staat en klaar is voor gebruik, is al heel fijn. Maar vooral ervaring met een grote database die blijft groeien: hoe je data van wisselende kwaliteit binnenhaalt, controleert en bijhoudt zonder dat het uit de hand loopt. En natuurlijk de scanners, die dat werk grotendeels voor me doen.