Files
adres-analyse/SKILL.md
T

7.7 KiB

name, description, tags
name description tags
adres-analyse Genereer uitgebreide adresrapporten met geocodering, isochronen (bereikbaarheidskaarten), en andere locatie-gerelateerde analyses voor Nederlandse adressen.
geocoding
isochrone
routing
maps
locatie-analyse
pdok
ors

Adres Analyse

Genereer modulaire rapporten voor Nederlandse adressen. Elk onderdeel wordt als aparte sectie toegevoegd aan het rapport.

Rapport generatie

Hoofdscript: scripts/rapport.py (ook geïnstalleerd op /root/adres-analyse/rapport.py)

⚠️ Let op: de geïnstalleerde versie kan achterlopen op de skill-template. Hele functies kunnen ontbreken (bijv. Obsidian-integratie). Voer altijd eerst de sync-check uit:

Sync-check (voor elke sessie):

diff ~/.hermes/skills/research/adres-analyse/scripts/rapport.py /root/adres-analyse/rapport.py

Als er output is, synchroniseer onmiddellijk:

cp ~/.hermes/skills/research/adres-analyse/scripts/rapport.py /root/adres-analyse/rapport.py

Daarna pas uitvoeren:

python3 /root/adres-analyse/rapport.py "Adres Plaats"

Output is markdown formaat, direct naar stdout (voor Telegram) én wordt opgeslagen in Obsidian vault (map: huizenjacht).

Huidige onderdelen

1. Bereikbaarheid (Isochroon)

  • Auto profiel: driving-car, 20 minuten, blauw op de kaart
  • Fiets profiel: cycling-regular, 30 minuten, groen op de kaart
  • Metrics: Oppervlakte (km²), reach factor, geografisch bereik
  • Data bron: ORS op 192.168.1.71:9080
  • Interactieve kaart: Het script genereert automatisch een zelf-contained HTML kaart (Leaflet + OpenStreetMap) met beide isochronen en het adres als marker. Deze wordt opgeslagen in Obsidian naast het markdown rapport. In Obsidian verschijnt een link [Bekijk interactieve isochroon kaart](huizenjacht/...html) — klik erop om in je browser te openen, zoomen en pannen.

2. Voorzieningen in de buurt

  • Bron: lokale PostGIS database met geselecteerde POI's uit heel Nederland OSM extract
  • Docker: postgis/postgis op poort 5433, database adresanalyse
  • Import: import-osm.sh downloadt netherlands-latest.osm.pbf en osm-poi-import.py importeert alleen shop=supermarket en amenity=school
  • Routeverrijking: ORS Matrix voor driving-car en cycling-regular
  • Output: top 5 supermarkten en top 5 scholen in rapport

3. (Toekomstige onderdelen)

  • OV bereikbaarheid
  • Luchtkwaliteit
  • Demografie
  • Vastgoeddata

Workflow (intern)

Stap 1: Geocoding (adres → coördinaten)

Gebruik PDOK Locatieserver (gratis, geen API key nodig):

curl -s "https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q={adres}&rows=5&fl=centroide_ll,weergavenaam,postcode,woonplaatsnaam,type,huisnummer"

Parsing:

  • Zoek naar type=adres voor exacte adres match (niet straat)
  • centroide_ll is in formaat POINT(lon lat) → split op spatie, coords[0]=lon, coords[1]=lat
  • Fallback naar eerste resultaat als geen adres match

Stap 2: Isochroon ophalen

POST naar ORS:

curl -s -X POST "http://192.168.1.71:9080/ors/v2/isochrones/driving-car" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [[lon, lat]],
    "range": [1200],
    "attributes": ["area","reachfactor","total_pop"]
  }'

Parameters:

  • range in seconden (20 min = 1200)
  • Response bevat GeoJSON FeatureCollection met polygon geometrie
  • GeoJSON wordt opgeslagen in /tmp/isochroon_{timestamp}.geojson

Stap 3: Interactieve kaart + screenshot genereren (automatisch)

Het script genereert twee bestanden:

  1. HTML kaart (Leaflet + OpenStreetMap) met inline GeoJSON — opgeslagen in Obsidian als .html. In Obsidian verschijnt een link om de kaart in de browser te openen voor zoomen/pannen.
  2. JPEG screenshot van de kaart — direct gebase64-embed in het markdown rapport. Je ziet de kaart direct in Obsidian zonder te klikken.

Vereisten voor screenshot:

  • playwright (pip install playwright; playwright install chromium)
  • Pillow (pip install Pillow)

Als playwright niet geïnstalleerd is, wordt de screenshot overgeslagen met een waarschuwing; de rest van het rapport werkt gewoon.

Pitfalls

  1. Geocoding exactheid: PDOK zoekt op straatnaam als huisnummer niet exact matcht - altijd checken of type=adres in response. Zoek door eerste 5 resultaten voor adres match.

  2. ORS cycling profielen niet geactiveerd: Alleen driving-car werkt momenteel. Fietsprofielen geven error "RoutingProfile.getGraphhopper() is null". Zie references/ors-setup.md voor activatie-instructies.

  3. Coördinaten volgorde: PDOK geeft POINT(lon lat) (WGS84), maar ORS verwacht [[lon, lat]] in array. Let op volgorde bij parsen.

  4. Oppervlakte conversie: ORS geeft area in m², niet km². Deel door 1_000_000 voor km² of 10_000 voor hectare.

  5. PNG screenshot vereist playwright + Pillow: De base64-afbeelding in het markdown wordt gegenereerd met een headless Chromium via Playwright. Zonder deze dependencies wordt de screenshot overgeslagen (het rapport blijft werken). Installeer met: pip install playwright Pillow && playwright install chromium.

  6. Base64-afbeelding maakt markdown groter: De JPEG is ~80-120KB base64. Dit is acceptabel voor een enkel rapport, maar het markdown bestand wordt merkbaar groter dan tekst-alleen.

  7. Obsidian HTML links: Obsidian opent .html bestanden in de systeembrowser (niet in de Obsidian viewer). De link werkt alleen als het HTML bestand in dezelfde vault staat.

  8. Obsidian API: Vereist dat Obsidian draait met Local REST API plugin ingeschakeld. Token en host staan in script. Bestandsnaam wordt gegenereerd met timestamp om collisions te voorkomen.

  9. Script drift — skill vs. installed: Het geïnstalleerde script op /root/adres-analyse/rapport.py kan achterlopen op de skill-template (scripts/rapport.py). Dit is niet alleen kleine drift — hele functies kunnen ontbreken (bijv. schrijf_naar_obsidian(), Obsidian-config, token-definities). Altijd eerst diff uitvoeren. Als de Obsidian-opslag niet werkt, is dit de eerste plek om te checken. Zie references/script-drift.md.

  10. Token patching via patch tool: Bij het bewerken van scripts die API tokens bevatten (zoals OBSIDIAN_TOKEN) met de patch tool, kan de security scan het token maskeren of splitsen. Dit resulteert in een kapotte string concatenatie en 401 Unauthorized errors. Workaround: gebruik read_file om de exacte regel te zien, schrijf dan het volledige token expliciet met write_file, of synchroniseer het hele skill-script. Verifieer altijd na patchen dat het script syntactisch correct is (python3 -m py_compile script.py). Zie references/token-patching.md.

Uitbreiding

Nieuwe onderdelen toevoegen:

  1. Voeg functie toe aan /root/adres-analyse/rapport.py
  2. Roep aan in genereer_rapport() na geocoding
  3. Update deze skill met nieuwe sectie onder "Huidige onderdelen"
  4. Verhoog onderdeel teller in output footer

Voorbeeld rapport

📍 **Adres Analyse Rapport**
Gegenereerd: 19-06-2026 18:42

🔍 Geocoding...
**Adres:** Griendvelden 14, 5685JL Best
**Coördinaten:** 51.505547, 5.370553

🚗 **Bereikbaarheid (Auto 20 min)**
**Oppervlakte:** 316.8 km²
**Reach factor:** 0.091
**Bereik:** 51.378°-51.679°N, 5.128°-5.530°E

🚲 **Bereikbaarheid (Fiets 30 min)**
**Oppervlakte:** 145.9 km²
**Reach factor:** 0.826
**Bereik:** 51.440°-51.570°N, 5.251°-5.486°E

🏙️ **Voorzieningen dichtbij**
...

🗺️ **[Bekijk interactieve isochroon kaart](huizenjacht/Griendvelden-14-5685JL-Best_20260622_111308.html)**

**🗺️ Isochroon kaart (auto + fiets):**
![Isochroon kaart](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...)

💾 Ruwe isochroondata: `/tmp/isochronen_20260622_111308.geojson`

---
_Onderdelen: geocoding, isochronen, voorzieningen_