--- name: adres-analyse description: Genereer uitgebreide adresrapporten met geocodering, isochronen (bereikbaarheidskaarten), en andere locatie-gerelateerde analyses voor Nederlandse adressen. tags: [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):** ```bash diff ~/.hermes/skills/research/adres-analyse/scripts/rapport.py /root/adres-analyse/rapport.py ``` Als er output is, synchroniseer onmiddellijk: ```bash cp ~/.hermes/skills/research/adres-analyse/scripts/rapport.py /root/adres-analyse/rapport.py ``` **Daarna pas uitvoeren:** ```bash 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): ```bash 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: ```bash 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_ ```