A monument walk through your own neighbourhood
An app that builds a walk past ten listed monuments around any starting point, with address, description, photo, a historic image from the Rijksmuseum and a café on the way.
geef_project("monumentenwandeling")geef_bron("rijksmonumenten")geef_bron("openstreetmap")geef_bron("rijksmuseum")
I have the project, the tested calls and the pitfalls. I'll build a app with Register of national monuments, OpenStreetMap and Rijksmuseum collection. This is how it could look:
You build this yourself. Copy the prompt into Claude, ChatGPT or Cursor, with the MCP server on, or follow the steps below.
Around the Brink
10 of the 503 listed monuments within 600 m · 1.0 km
- 1Brink 6618th c.79 m
- 2Kleine Overstraat 5018th–19th c.67 m
- 3Brink 7818th c.4 m
- 4Brink 37front c. 1860–7074 m
- 5Menstraat 918th c.67 m
- 6Spijkerboorsteeg 12162717 m
- 7Assenstraat 618th c. · gateway12 m
- 8Assenstraat 50161790 m
- 9Polstraat 53undated117 m
- 10Polstraat 66 A17th/18th c.77 m
This is a mockup, not a working version, with the route from our test run around the Brink in Deventer on 16 October 2026 (RCE, OpenStreetMap cafés as of 27 July 2026) and the map from the RCE monument points and the BAG buildings from PDOK, fetched on 17 October 2026. Turn the MCP server on with the address on For AI.
Who it's for
Walkers, guides, tourist offices and municipalities, schools planning a field trip, and anyone who wants to know what that old building around the corner is.
What you get
A map with a numbered route past ten listed monuments, and for each stop the address, the type of monument, the description from the monument register, a photo from the RCE and the nearest café. At the top a historic photo of the place from the Rijksmuseum. In the test run on 16 October 2026 around the Brink in Deventer there were 503 listed monuments within 600 metres; all 503 had a description and 329 a photo. The script picked ten monuments with a photo, always at least 75 metres apart, 1.0 km in a straight line in total: from Brink 66 via Kleine Overstraat, Menstraat, Spijkerboorsteeg (a gable from 1627) and Assenstraat to Polstraat. OpenStreetMap gave 26 cafés, 75 benches and 6 drinking water points in the same box (as of 27 July 2026), but only 21 objects with a monument number (ref:rce): for the monuments themselves the RCE is the source. The Rijksmuseum had 9 objects with 'Brink Deventer' in the title and an image, such as a photograph 'De Brink te Deventer' from 1873.
National monuments per municipality: most Amsterdam (7,679 national monuments), then Maastricht and Utrecht
National monuments per municipality, October 2026, in national monuments. Total: 63,098; the largest 12 of 342 categories are shown. Amsterdam is 12% of the total. Counted in the RCE linked data, only objects with the status of national monument.
How you could start6 steps
- 1
Find the monuments around your starting point (WFS)
The RCE map service returns monument points as GeoJSON with number, status, main and sub category and a link to the register, but without name or address. Ask for a box around the starting point and compute the distance yourself. Mind the order in bbox: with urn:ogc:def:crs:EPSG::4326 it is latitude,longitude (289 points in the box), with the short form EPSG:4326 longitude,latitude; the wrong order gives 0 points and no error. Without count you get the whole layer (63,083 points).
https://services.rce.geovoorziening.nl/rce/wfs?request=GetFeature&service=WFS&version=2.0.0&typeNames=rce:NationalListedMonumentPoints&outputFormat=application/json&count=2&srsName=EPSG:4326&bbox=52.2490,6.1550,52.2535,6.1625,urn:ogc:def:crs:EPSG::4326
{"type":"FeatureCollection","features":[ {"type":"Feature","id":"NationalListedMonumentPoints.10018","geometry":{"type":"Point","coordinates":[6.1572,52.2533]}, "properties":{"id":10018,"rijksmonument_nummer":12660,"complex_nummer":null,"juridische_status":"rijksmonument", "aard_monument":"onroerend gebouwd","hoofdcategorie":"Woningen en woningbouwcomplexen","subcategorie":"Werk-woonhuis", "rijksmonumenturl":"https://monumentenregister.cultureelerfgoed.nl/monumenten/12660"}}, {"type":"Feature","id":"NationalListedMonumentPoints.10184", … "rijksmonument_nummer":12860, … "subcategorie":"Omwalling", …}], "totalFeatures":289,"numberMatched":289,"numberReturned":2,"timeStamp":"2026-10-16T21:36:29.360Z", …} - 2
Fetch address, description and photo (SPARQL)
The RCE linked data have what the map service lacks. Search on ceo:rijksmonumentnummer (as text, "12660") and use VALUES to ask for all numbers at once. The description is in ceo:heeftOmschrijving/ceo:omschrijving, the address in ceo:heeftBasisregistratieRelatie/ceo:heeftBAGRelatie/ceo:volledigAdres, a photo from the RCE image bank in foaf:depiction (images.memorix.nl, 640 by 480). Data appear more than once: use SAMPLE or DISTINCT. With Accept application/json you get a flat list. A query may take 58 seconds.
curl -X POST "https://api.linkeddata.cultureelerfgoed.nl/datasets/rce/cho/services/cho/sparql" \ -d 'query=PREFIX ceo: <https://linkeddata.cultureelerfgoed.nl/def/ceo#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?nummer (SAMPLE(?adres) AS ?adres) (SAMPLE(?tekst) AS ?omschrijving) (SAMPLE(?foto) AS ?foto) WHERE { VALUES ?nummer { "12660" "12860" "12500" } ?m ceo:rijksmonumentnummer ?nummer . OPTIONAL { ?m ceo:heeftOmschrijving/ceo:omschrijving ?tekst } OPTIONAL { ?m ceo:heeftBasisregistratieRelatie/ceo:heeftBAGRelatie/ceo:volledigAdres ?adres } OPTIONAL { ?m foaf:depiction ?foto } } GROUP BY ?nummer '[ { "nummer": "12660", "adres": "Pontsteeg 5", "omschrijving": "Onderkelderd pand met lijstgevel, XIX A. XIX B winkelpui.", "foto": "https://images.memorix.nl/rce/thumb/640x480/71add71a-892f-74a1-6e36-c4e8784bf62f.jpg" }, { "nummer": "12860", "adres": "Bokkingshang 13", "omschrijving": "Pand, waarin wellicht een deel van de laat-middeleeuwse stadsmuur is bewaard gebleven.", "foto": null }, { "nummer": "12500", "adres": "Brink 37", "omschrijving": "Onderkelderd hoekpand met omstreeks 1860/1870 gepleisterde lijstgevel; …", "foto": "https://images.memorix.nl/rce/thumb/640x480/d2b33ec7-c792-ee56-afb4-c933b4235045.jpg" } ] - 3
Find cafés and benches in OpenStreetMap (ohsome)
Overpass and Nominatim exclude scripts in their robots.txt; HeiGIT's ohsome API (no robots.txt) can count and, through /elements/bbox, return objects with their tags and bounding box. /elements/centroid and /elements/geometry returned HTTP 403 on 16 and 17 October 2026. Note: ohsome wants the box as longitude,latitude (the other way round from the WFS), the data run about three months behind (as of 27 July 2026), and a query takes 15 to 25 seconds. On the evening of 16 October the server closed every query after 60 seconds; build in a retry.
https://api.ohsome.org/v1/elements/count/groupBy/tag?bboxes=6.1513,52.2459,6.1669,52.2567&filter=amenity in (bench,cafe,toilets,drinking_water)&groupByKey=amenity
{"attribution":{"url":"https://ohsome.org/copyrights","text":"© OpenStreetMap contributors"},"apiVersion":"1.10.4", "groupByResult":[ {"groupByObject":"amenity=bench","result":[{"timestamp":"2026-07-27T09:00:00Z","value":71.0}]}, {"groupByObject":"amenity=cafe","result":[{"timestamp":"2026-07-27T09:00:00Z","value":26.0}]}, {"groupByObject":"amenity=drinking_water","result":[{"timestamp":"2026-07-27T09:00:00Z","value":6.0}]}]} - 4
Check what OSM knows about the monuments themselves
Volunteers put the monument number in the tag ref:rce, sometimes with name, wikidata and start_date. In the small box of step 1 there were 13 such objects against 289 RCE points. So use OSM for what is around (cafés, benches, toilets) and the RCE for the monuments. With /elements/bbox and properties=tags you get the tags too.
https://api.ohsome.org/v1/elements/bbox?bboxes=6.1550,52.2490,6.1625,52.2535&filter=ref:rce%3D*&properties=tags
{"type":"FeatureCollection","features":[ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[6.1561289,52.2508369],[6.1564293,52.2508369],[6.1564293,52.2510218],[6.1561289,52.2510218],[6.1561289,52.2508369]]]}, "properties":{"@osmId":"way/262225591","@snapshotTimestamp":"2026-07-27T09:00:00Z","building":"house","heritage":"2","heritage:operator":"rce", "historic":"building","ref:bag":"0150100000001090","ref:rce":"12758","start_date":"1870","wikidata":"Q17346593"}}, {"type":"Feature", … "properties":{"@osmId":"way/262225677", … "name":"Kronenburg","note":"Gotische gevel Boterstraat 4","ref:rce":"12503", …}}, …]} - 5
Find a historic image of the place at the Rijksmuseum
The Rijksmuseum search API (data.rijksmuseum.nl, no key) searches titles with title=, and imageAvailable=true returns only objects with an image. The response only holds identifiers; fetch the data per object with _profile=la-framed (Linked Art). Search on place and street ('Brink Deventer', 9 objects): 'Deventer' alone gave 321 objects with an image, from all over the town. Check the rights per object; most old photographs are public domain.
https://data.rijksmuseum.nl/search/collection?title=Brink Deventer&imageAvailable=true
{"@context":"https://linked.art/ns/v1/search.json","id":"https://data.rijksmuseum.nl/search/collection?title=Brink%20Deventer&imageAvailable=true", "type":"OrderedCollectionPage","partOf":{…,"type":"OrderedCollection","totalItems":9, …}, "orderedItems":[{"id":"https://id.rijksmuseum.nl/200142146","type":"HumanMadeObject"}, {"id":"https://id.rijksmuseum.nl/200325745","type":"HumanMadeObject"}, …]} - 6
From object to IIIF image
The image sits three steps deep: object, then shows (a VisualItem), then digitally_shown_by (a DigitalObject) with access_point, an IIIF address on iiif.micr.io. Sometimes the IIIF address is also in the object's subject_of, but not always (not for RP-F-F17927): follow the long route. Replace full/max with full/800, for an image 800 pixels wide (50 kB).
https://id.rijksmuseum.nl/50089861211057449110105?_profile=la-framed
{ "@context": "https://linked.art/ns/v1/linked-art.json", "id": "https://id.rijksmuseum.nl/50089861211057449110105", "type": "DigitalObject", "access_point": [ { "id": "https://iiif.micr.io/ZHeyA/full/max/0/default.jpg", "type": "DigitalObject" } ], "digitally_shows": [ { "id": "https://id.rijksmuseum.nl/202325745", "type": "VisualItem" } ], "referred_to_by": [ { …, "content": "downloadbaar" }, { …, "content": "zichtbaar" } ] }
How the sources fit together
- Register of national monumentsOpenStreetMapvia
monumentnummer (RCE rijksmonument_nummer = OSM-tag ref:rce) en coördinatenWhere an OSM object has ref:rce you get extra data such as name, year built (start_date) and a Wikidata id. For everything else you join on distance: the café or bench nearest to each stop.
- Register of national monumentsRijksmuseum collectionvia
plaats- en straatnaam in de titel (adres uit de linked data)There is no shared key between the monument register and the museum collection. Search the Rijksmuseum on the place and street of the stop, and show the user that the link is made on words.
Let AI build it
Paste this prompt into Claude, ChatGPT, Cursor or Lovable. It names the real endpoints, the join keys and the pitfalls, so the assistant writes working code straight away. Always check the result against the source itself.
Build a mobile web app (one HTML file with JavaScript and Leaflet, or Next.js) that builds a walk past ten listed monuments around my location or an address. For each stop: address, type of monument, description, photo and the nearest café. At the top a historic photo of the place from the Rijksmuseum.
Data, all without a key:
1. Monument points (RCE, WFS, GeoJSON): https://services.rce.geovoorziening.nl/rce/wfs?request=GetFeature&service=WFS&version=2.0.0&typeNames=rce:NationalListedMonumentPoints&outputFormat=application/json&srsName=EPSG:4326&count=1000&bbox=<minlat>,<minlon>,<maxlat>,<maxlon>,urn:ogc:def:crs:EPSG::4326
2. Address, description and photo (RCE linked data, SPARQL, POST with query=…, Accept: application/json): https://api.linkeddata.cultureelerfgoed.nl/datasets/rce/cho/services/cho/sparql
SELECT ?nummer (SAMPLE(?adres) AS ?adres) (SAMPLE(?tekst) AS ?omschrijving) (SAMPLE(?foto) AS ?foto) WHERE { VALUES ?nummer { "12660" … } ?m ceo:rijksmonumentnummer ?nummer . OPTIONAL { ?m ceo:heeftOmschrijving/ceo:omschrijving ?tekst } OPTIONAL { ?m ceo:heeftBasisregistratieRelatie/ceo:heeftBAGRelatie/ceo:volledigAdres ?adres } OPTIONAL { ?m foaf:depiction ?foto } } GROUP BY ?nummer
(PREFIX ceo: <https://linkeddata.cultureelerfgoed.nl/def/ceo#>, foaf: <http://xmlns.com/foaf/0.1/>)
3. Cafés and benches (OpenStreetMap via ohsome): https://api.ohsome.org/v1/elements/bbox?bboxes=<minlon>,<minlat>,<maxlon>,<maxlat>&filter=amenity in (cafe, bench, drinking_water)&properties=tags
4. Historic images (Rijksmuseum): https://data.rijksmuseum.nl/search/collection?title=<street> <place>&imageAvailable=true, then per identifier ?_profile=la-framed.
What you need to know:
- WFS: with urn:ogc:def:crs:EPSG::4326 the bbox is latitude,longitude; with EPSG:4326 longitude,latitude. Wrong = 0 results and no error. Without count you get the whole layer (63,083 points). The points have no name or address; filter on juridische_status 'rijksmonument'.
- SPARQL: rijksmonumentnummer is text ("12660"). Data appear more than once: use SAMPLE/DISTINCT. Time limit 58 seconds: ask for at most a few hundred numbers at a time. Not every monument has a photo (Deventer centre: 329 of 503). Do not call concept URIs on data.cultureelerfgoed.nl: robots.txt forbids it.
- ohsome: bbox as longitude,latitude. /elements/centroid and /elements/geometry returned HTTP 403; /elements/bbox and /elements/count work. A query takes 15 to 25 seconds and the data run about three months behind. Fetch OSM data on the server, cache it per area and build in a retry. Do not use Overpass or Nominatim from a script (robots.txt). Attribution: © OpenStreetMap contributors (ODbL).
- Rijksmuseum: the image is in object → shows (VisualItem) → digitally_shown_by (DigitalObject) → access_point (IIIF on iiif.micr.io). Replace full/max with full/800, for 800 pixels. A few hundred milliseconds between calls. Search on street and place, not just the place.
- Pick stops at least 75 metres apart, otherwise in an old town centre all ten stops end up on one square. Order them 'nearest next' and say the distance is in a straight line.
- Licences: RCE data CC BY 4.0 (credit 'Rijksdienst voor het Cultureel Erfgoed'); photos from the RCE image bank with their own credit; Rijksmuseum per object (mostly public domain).
- Send your own User-Agent on server calls ('my-project/1.0 (+you@example.com)').
Output: a map with numbered stops and a line between them, an expandable card per stop with photo, address, description and link to the monument register, the nearest café with distance, and at the top a carousel of historic images of the place. Sources with date at the bottom.
Try it yourself
The core of the project in a small script. Needs: Python 3.10+ en requests. Tested on 2026-10-17; below is the real output of that run.
# Monumentenwandeling: tien rijksmonumenten rond een startpunt, met adres, beschrijving, foto en een looproute.
# Bronnen: RCE-kaartdienst (WFS) en RCE linked data (SPARQL), OpenStreetMap (ohsome), Rijksmuseum. Geen sleutel nodig.
import math, time, requests
UA = {"User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)"}
START = (52.2513, 6.1591) # breedte, lengte: de Brink in Deventer
STRAAL = 600 # meter
AFSTAND = 75 # minstens zoveel meter tussen twee stops
AANTAL = 10
def meter(a, b): # afstand tussen twee punten (breedte, lengte) in meter
dy = (a[0] - b[0]) * 111_320
dx = (a[1] - b[1]) * 111_320 * math.cos(math.radians(a[0]))
return math.hypot(dx, dy)
# 1. Alle monumentpunten in een vak rond het startpunt. Let op: in WFS 2.0 met EPSG:4326 is de volgorde breedte,lengte.
db = STRAAL / 111_320; dl = db / math.cos(math.radians(START[0]))
vak = f"{START[0]-db},{START[1]-dl},{START[0]+db},{START[1]+dl},urn:ogc:def:crs:EPSG::4326"
wfs = requests.get("https://services.rce.geovoorziening.nl/rce/wfs", headers=UA, timeout=60, params={
"service": "WFS", "version": "2.0.0", "request": "GetFeature", "typeNames": "rce:NationalListedMonumentPoints",
"outputFormat": "application/json", "srsName": "EPSG:4326", "bbox": vak, "count": 1000}).json()
punten = []
for f in wfs["features"]:
p = f["properties"]; lon, lat = f["geometry"]["coordinates"]
if p["juridische_status"] == "rijksmonument" and meter(START, (lat, lon)) <= STRAAL:
punten.append({"nr": str(p["rijksmonument_nummer"]), "pos": (lat, lon), "cat": p["hoofdcategorie"], "sub": p["subcategorie"]})
print(f"{wfs['numberMatched']} monumentpunten in het vak, {len(punten)} rijksmonumenten binnen {STRAAL} m")
# 2. Adres, omschrijving en foto uit de linked data. Tel en kies met DISTINCT/SAMPLE: gegevens staan er dubbel in.
nummers = " ".join(f'"{p["nr"]}"' for p in punten)
vraag = f"""PREFIX ceo: <https://linkeddata.cultureelerfgoed.nl/def/ceo#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?nummer (SAMPLE(?adres) AS ?adres) (SAMPLE(?tekst) AS ?omschrijving) (SAMPLE(?foto) AS ?foto) WHERE {{
VALUES ?nummer {{ {nummers} }}
?m ceo:rijksmonumentnummer ?nummer .
OPTIONAL {{ ?m ceo:heeftOmschrijving/ceo:omschrijving ?tekst }}
OPTIONAL {{ ?m ceo:heeftBasisregistratieRelatie/ceo:heeftBAGRelatie/ceo:volledigAdres ?adres }}
OPTIONAL {{ ?m foaf:depiction ?foto }}
}} GROUP BY ?nummer"""
info = {r["nummer"]: r for r in requests.post(
"https://api.linkeddata.cultureelerfgoed.nl/datasets/rce/cho/services/cho/sparql",
data={"query": vraag}, headers={**UA, "Accept": "application/json"}, timeout=60).json()}
print(f"linked data: {len(info)} monumenten, {sum(1 for r in info.values() if r.get('foto'))} met foto, "
f"{sum(1 for r in info.values() if r.get('omschrijving'))} met omschrijving")
# 3. Kies tien monumenten met foto en omschrijving, dichtbij maar niet naast elkaar, en loop van dichtbij naar dichtbij.
kandidaten = []
for p in sorted((p for p in punten if info.get(p["nr"], {}).get("foto") and info[p["nr"]].get("omschrijving")),
key=lambda p: meter(START, p["pos"])):
if len(kandidaten) < AANTAL and all(meter(p["pos"], k["pos"]) >= AFSTAND for k in kandidaten):
kandidaten.append(p)
route, hier, totaal = [], START, 0
while kandidaten:
volgende = min(kandidaten, key=lambda p: meter(hier, p["pos"]))
totaal += meter(hier, volgende["pos"]); hier = volgende["pos"]
route.append(volgende); kandidaten.remove(volgende)
totaal += meter(hier, START)
# 4. OpenStreetMap via ohsome (Overpass is in robots.txt uitgesloten): cafés, bankjes en water in hetzelfde vak.
# Alleen de aggregatie- en bbox-ingangen werken anoniem; /elements/centroid en /elements/geometry gaven HTTP 403.
osm_vak = f"{START[1]-dl},{START[0]-db},{START[1]+dl},{START[0]+db}" # ohsome: lengte,breedte (andersom dan WFS)
osm = {"features": []}
for poging in range(3): # ohsome is soms traag of sluit na 60 s de verbinding: probeer opnieuw
try:
osm = requests.get("https://api.ohsome.org/v1/elements/bbox", headers=UA, timeout=120, params={
"bboxes": osm_vak, "filter": "amenity in (cafe, bench, drinking_water) or ref:rce=*", "properties": "tags"}).json()
break
except (requests.RequestException, ValueError):
time.sleep(10 * (poging + 1))
plekken = []
for f in osm["features"]:
(x0, y0), _, (x1, y1) = f["geometry"]["coordinates"][0][:3]
plekken.append({**f["properties"], "pos": ((y0 + y1) / 2, (x0 + x1) / 2)})
soort = lambda t: [p for p in plekken if p.get("amenity") == t]
met_rce = {p["ref:rce"] for p in plekken if "ref:rce" in p}
print(f"OSM (stand {osm['features'][0]['properties']['@snapshotTimestamp'][:10] if plekken else '?'}): {len(soort('cafe'))} cafés, "
f"{len(soort('bench'))} bankjes, {len(soort('drinking_water'))} watertappunten; "
f"{len(met_rce)} objecten met ref:rce tegen {len(punten)} rijksmonumenten bij de RCE")
print(f"\nRoute langs {len(route)} monumenten, {totaal/1000:.1f} km hemelsbreed (terug naar de Brink)\n")
for i, p in enumerate(route, 1):
r = info[p["nr"]]
print(f"{i:2}. {r.get('adres') or '(geen adres)'} · monument {p['nr']} · {p['sub']}")
print(f" {r['omschrijving'][:100]}")
if soort("cafe"):
cafe = min(soort("cafe"), key=lambda c: meter(p["pos"], c["pos"]))
print(f" café het dichtstbij: {cafe.get('name', '(zonder naam)')}, {meter(p['pos'], cafe['pos']):.0f} m")
print(f"\nFoto bij stop 1: {info[route[0]['nr']]['foto']}")
# 5. Historische beelden van de plek uit het Rijksmuseum (zoek-API en Linked Art, geen sleutel).
def la(uri): # Linked Art-gegevens van een Rijksmuseum-identifier; rustig aan, er volgen veel kleine aanroepen
time.sleep(0.3)
return requests.get(uri, params={"_profile": "la-framed"}, headers=UA, timeout=60).json()
zoek = requests.get("https://data.rijksmuseum.nl/search/collection", headers=UA, timeout=60,
params={"title": "Brink Deventer", "imageAvailable": "true"}).json()
print(f"\nRijksmuseum: {zoek['partOf']['totalItems']} objecten met 'Brink Deventer' in de titel en een afbeelding")
for item in zoek["orderedItems"][:3]:
obj = la(item["id"])
titel = next(x["content"] for x in obj["identified_by"] if x["type"] == "Name")
nummer = next(x["content"] for x in obj["identified_by"] if x["type"] == "Identifier")
jaar = obj.get("produced_by", {}).get("timespan", {}).get("identified_by", [{}])[0].get("content", "?")
# Het beeld: object -> shows (VisualItem) -> digitally_shown_by (DigitalObject) -> access_point (IIIF).
vis = la(obj["shows"][0]["id"])
dig = la(vis["digitally_shown_by"][0]["id"])
beeld = dig["access_point"][0]["id"].replace("/full/max/", "/full/800,/") # 800 pixels breed
print(f" {nummer} · {titel} · {jaar} · {beeld}")
519 monumentpunten in het vak, 503 rijksmonumenten binnen 600 m
linked data: 503 monumenten, 329 met foto, 503 met omschrijving
OSM (stand 2026-07-27): 26 cafés, 75 bankjes, 6 watertappunten; 21 objecten met ref:rce tegen 503 rijksmonumenten bij de RCE
Route langs 10 monumenten, 1.0 km hemelsbreed (terug naar de Brink)
1. Brink 66 · monument 12515 · Werk-woonhuis
Onderkelderd pand met lijstgevel. Getoogde dakkapel; strekken; oorspronkelijk hoog voorhuis; gesnede
café het dichtstbij: Zuiderlicht, 79 m
2. Kleine Overstraat 50 · monument 12628 · Woonhuis(K)
Onderkelderd huis met gepleisterde lijstgevel. Nok van het dak evenwijdig aan rooilijn. Voordeuromli
café het dichtstbij: Hans en Grietje, 67 m
3. Brink 78 · monument 12524 · Woonhuis(K)
Onderkelderd huis met klokgevel met natuursteen afgedekt en natuurstenen kuifstuk in rococotrant als
café het dichtstbij: De Waagschaal, 4 m
4. Brink 37 · monument 12500 · Woonhuis(K)
Onderkelderd hoekpand met omstreeks 1860/1870 gepleisterde lijstgevel; de schuifvensters van de verd
café het dichtstbij: Hans en Grietje, 74 m
5. Menstraat 9 · monument 12666 · Woonhuis(K)
Onderkelderd huis met klokgevel, waarvan de top aanzetvoluten heeft en met natuursteen is gedekt. Hi
café het dichtstbij: de Buren, 67 m
6. Spijkerboorsteeg 12 · monument 12808 · Woonhuis(K)
Huis met in- en uitgezwenkte topgevel, in jaarankers gedateerd 1627, bekroond door vijf pinakels, di
café het dichtstbij: Stefano's Panninibar, 17 m
7. Assenstraat 6 · monument 12400 · Onderdeel woningen e.d.
Poortje met geprofileerd kalf, waarop gebeeldhouwde zandstenen vaas staat. Tweede/derde kwart achtti
café het dichtstbij: Toast, 12 m
8. Assenstraat 50 · monument 12409 · Woonhuis(K)
Onderkelderd huis met hoge gepleisterde lijstgevel, in jaarankers gedateerd 1617. Waterlijst. Zevent
café het dichtstbij: Toast, 90 m
9. Polstraat 53 · monument 12751 · Woonhuis(K)
Onderkelderd hoekhuis onder kap met wolfschild en twee dakkapellen in de Assenstraat en eindigend te
café het dichtstbij: Rio, 117 m
10. Polstraat 66 A · monument 12769 · Woonhuis(K)
Onderkelderd pand met gepleisterde rechte gevel; dakkapel. Hoog voorhuis, schuifvensters, XVII/XVIII
café het dichtstbij: Zuiderlicht, 77 m
Foto bij stop 1: https://images.memorix.nl/rce/thumb/640x480/0bb573f0-9ee6-4087-b82f-21669cc2347b.jpg
Rijksmuseum: 9 objecten met 'Brink Deventer' in de titel en een afbeelding
RP-F-00-66 · De Brink te Deventer · 1873 · https://iiif.micr.io/etNFF/full/800,/0/default.jpg
RP-F-F17927 · De Brink in Deventer · 1850 - 1880 · https://iiif.micr.io/ZHeyA/full/800,/0/default.jpg
RP-F-F17929 · Gezicht op de Brink in Deventer · ca. 1850 - ca. 1900 · https://iiif.micr.io/yzEsD/full/800,/0/default.jpg
Where it goes wrong
- Axis order in the WFS: with urn:ogc:def:crs:EPSG::4326 the bbox is latitude,longitude; with EPSG:4326 longitude,latitude. The same box gave 289 or 0 points. ohsome always wants longitude,latitude. An empty map without an error usually means the order is swapped.
- In an old town centre hundreds of monuments stand close together (Deventer: 503 within 600 metres). The ten nearest were all on the Brink, a 200-metre route. Pick stops with a minimum distance between them.
- The map service has no name and no address, the linked data do, but there data appear more than once (several graphs). Without SAMPLE or DISTINCT you get several rows per monument. Not every monument has a photo: 329 of 503 in Deventer.
- OpenStreetMap is not a monument register: in the centre of Deventer 21 OSM objects had a monument number (ref:rce) against 503 listed monuments at the RCE. Use OSM for the amenities around them.
- ohsome is slow and not always reachable: on 16 October 2026 the server closed every query after 60 seconds for an hour, the next day a query took 17 to 25 seconds. /elements/centroid and /elements/geometry returned HTTP 403. Cache per area and let the app work without the OSM layer.
- The Rijksmuseum IIIF image is not always in the same place. For RP-F-00-66 it was in the object's subject_of, for RP-F-F17927 it was not. The route via shows and digitally_shown_by worked for all three.
Take it further
- Turn it into a real walking route with a router over the street network, for example your own OSRM or GraphHopper on the Geofabrik extract of the Netherlands, instead of straight-line distances.
- Make themed walks: filter on main category (churches, windmills, fortifications) or on the date of registration (ceo:datumInschrijvingInMonumentenregister).
- Add year built and floor area from the BAG through the address object ids in the linked data (ceo:heeftBAGRelatie), and show which monuments are the oldest buildings in the street.
- Show 'then and now': the old Rijksmuseum image next to today's RCE photo, with a slider between them.
More with this data
National monuments: highest in Noord-Holland (14,052 national monuments), lowest in Flevoland (110 national monuments)
National monuments per province, October 2026, in national monuments. Netherlands as a whole: 63,098. 12 provinces with a figure.
Rijksmuseum objects with and without a digital image (figures from the Rijksmuseum API): with an image is the largest part, 87% in October 2026
Breakdown in October 2026: with an image 87%, without an image 13%. Total: 841,378 objects.
The sources3

Register of national monuments
The register of the Cultural Heritage Agency: 63,098 national monuments on 15 October 2026, of which 61,637 built and 1,461 archaeological. With number, category, registration date, BAG address and map point or outline. Also the protected townscapes and world heritage. As a map service (WFS), download and linked data with SPARQL.

OpenStreetMap
Roads, buildings, shops, benches and cycle paths, mapped by volunteers. Very complete in the Netherlands, partly because the BAG was imported.

Rijksmuseum collection
The Rijksmuseum shares its collection data through six services without a key (plus the deprecated SRU): a search API, a resolver for its persistent identifiers (Linked Art), OAI-PMH, a change stream (LDES), IIIF for images and data dumps. On 16 October 2026 the search API counted 841,378 objects, 735,784 of them with a digital image, 425,961 under prints and 5,337 paintings.
Family tree finder: from one record to your great-grandparents