Release v2.3 - Obsidian removed, rapport opgeslagen in MkDocs /root/mkdocs/docs/docs/Huizenjacht/

This commit is contained in:
Hermes Agent
2026-06-25 08:38:54 +02:00
parent d7ffa382a7
commit 60596c0510
+23 -40
View File
@@ -2,11 +2,12 @@
""" """
Adres Analyse - Rapport generator Adres Analyse - Rapport generator
Gebruikt PDOK voor geocoding, ORS voor isochronen/routes en PostGIS OSM-data voor voorzieningen. Gebruikt PDOK voor geocoding, ORS voor isochronen/routes en PostGIS OSM-data voor voorzieningen.
Slaat rapport ook op in Obsidian vault (map: huizenjacht). Slaat rapport en HTML-kaarten op in /root/mkdocs/docs/docs/Huizenjacht/
""" """
import json import json
import sys import sys
import os
import urllib.request import urllib.request
import urllib.parse import urllib.parse
import re import re
@@ -31,8 +32,7 @@ from voorzieningen import analyse_voorzieningen, format_voorzieningen_markdown
# Config # Config
ORS_BASE = "http://192.168.1.71:9080/ors/v2" ORS_BASE = "http://192.168.1.71:9080/ors/v2"
PDOK_BASE = "https://api.pdok.nl/bzk/locatieserver/search/v3_1" PDOK_BASE = "https://api.pdok.nl/bzk/locatieserver/search/v3_1"
OBSIDIAN_BASE = "http://192.168.1.50:27123" MKDOCS_DIR = "/root/mkdocs/docs/docs/Huizenjacht"
OBSIDIAN_TOKEN = "90ec" + "6de948dc8ef7832fda3516fd900c7a3071dd526edf852ade145aa9daf637"
def geocode_adres(adres): def geocode_adres(adres):
"""Geocode adres naar coördinaten via PDOK Locatieserver""" """Geocode adres naar coördinaten via PDOK Locatieserver"""
@@ -98,28 +98,18 @@ def format_oppervlakte(m2):
else: else:
return f"{m2:.0f} m²" return f"{m2:.0f} m²"
def schrijf_naar_obsidian(rapport_text, adres, subpath="huizenjacht", ext=".md"): def schrijf_naar_mkdocs(content, adres, ext=".md"):
"""Schrijf rapport naar Obsidian vault""" """Schrijf content naar MkDocs docs map als bestand"""
os.makedirs(MKDOCS_DIR, exist_ok=True)
safe_name = re.sub(r'[^a-zA-Z0-9]+', '-', adres) safe_name = re.sub(r'[^a-zA-Z0-9]+', '-', adres)
safe_name = safe_name.strip('-') safe_name = safe_name.strip('-')
filename = f"{subpath}/{safe_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}{ext}" filename = f"{safe_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}{ext}"
filepath = os.path.join(MKDOCS_DIR, filename)
content_type = "text/html" if ext == ".html" else "text/markdown"
req = urllib.request.Request( with open(filepath, 'w', encoding='utf-8') as f:
f"{OBSIDIAN_BASE}/vault/{filename}", f.write(content)
data=rapport_text.encode('utf-8'),
headers={ return filepath, filename
'Authorization': f'Bearer {OBSIDIAN_TOKEN}',
'Content-Type': content_type
},
method='POST'
)
with urllib.request.urlopen(req, timeout=10) as resp:
if resp.status in [200, 204]:
return filename
else:
return None
def genereer_isochroon_html(adres_naam, lat, lon, auto_iso, fiets_iso): def genereer_isochroon_html(adres_naam, lat, lon, auto_iso, fiets_iso):
"""Genereer een zelf-contained HTML kaart met Leaflet""" """Genereer een zelf-contained HTML kaart met Leaflet"""
@@ -156,7 +146,7 @@ var autoLayer = L.geoJSON(autoGeojson, {{
style: {{ color: '#2563eb', weight: 2, fillColor: '#3b82f6', fillOpacity: 0.2 }}, style: {{ color: '#2563eb', weight: 2, fillColor: '#3b82f6', fillOpacity: 0.2 }},
onEachFeature: function(feature, layer) {{ onEachFeature: function(feature, layer) {{
var props = feature.properties; var props = feature.properties;
layer.bindPopup('<b>Auto 20 min</b><br>Oppervlakte: ' + (props.area/1000000).toFixed(1) + ' km\u00b2<br>Reach factor: ' + props.reachfactor.toFixed(3)); layer.bindPopup('<b>Auto 20 min</b><br>Oppervlakte: ' + (props.area/1000000).toFixed(1) + ' km\\u00b2<br>Reach factor: ' + props.reachfactor.toFixed(3));
}} }}
}}).addTo(map); }}).addTo(map);
@@ -164,7 +154,7 @@ var fietsLayer = L.geoJSON(fietsGeojson, {{
style: {{ color: '#16a34a', weight: 2, fillColor: '#22c55e', fillOpacity: 0.2 }}, style: {{ color: '#16a34a', weight: 2, fillColor: '#22c55e', fillOpacity: 0.2 }},
onEachFeature: function(feature, layer) {{ onEachFeature: function(feature, layer) {{
var props = feature.properties; var props = feature.properties;
layer.bindPopup('<b>Fiets 30 min</b><br>Oppervlakte: ' + (props.area/1000000).toFixed(1) + ' km\u00b2<br>Reach factor: ' + props.reachfactor.toFixed(3)); layer.bindPopup('<b>Fiets 30 min</b><br>Oppervlakte: ' + (props.area/1000000).toFixed(1) + ' km\\u00b2<br>Reach factor: ' + props.reachfactor.toFixed(3));
}} }}
}}).addTo(map); }}).addTo(map);
@@ -196,7 +186,6 @@ def maak_isochroon_screenshot(html_content, width=1280, height=900, resize_width
return None, "Pillow niet geïnstalleerd" return None, "Pillow niet geïnstalleerd"
import tempfile import tempfile
import os
# Write HTML to temp file # Write HTML to temp file
with tempfile.NamedTemporaryFile(mode='w', suffix='.html', delete=False, encoding='utf-8') as f: with tempfile.NamedTemporaryFile(mode='w', suffix='.html', delete=False, encoding='utf-8') as f:
@@ -231,7 +220,7 @@ def maak_isochroon_screenshot(html_content, width=1280, height=900, resize_width
return b64, None return b64, None
def print_isochroon_sectie(titel, icoon, iso_data, rapport_lines=None): def print_isochroon_sectie(titel, icoon, iso_data, rapport_lines=None):
"""Print isochroon sectie; optioneel ook toevoegen aan rapport_lines voor Obsidian""" """Print isochroon sectie; optioneel ook toevoegen aan rapport_lines"""
text = f"{icoon} **{titel}**" text = f"{icoon} **{titel}**"
print(text) print(text)
if rapport_lines is not None: if rapport_lines is not None:
@@ -293,15 +282,12 @@ def genereer_rapport(adres_input):
print_line(format_voorzieningen_markdown("🏫 **Scholen**", voorzieningen['scholen'])) print_line(format_voorzieningen_markdown("🏫 **Scholen**", voorzieningen['scholen']))
print_line() print_line()
# Genereer interactieve HTML kaart en upload naar Obsidian # Genereer interactieve HTML kaart en sla op in MkDocs.map
html_content = genereer_isochroon_html( html_content = genereer_isochroon_html(
locatie['adres'], locatie['lat'], locatie['lon'], auto_iso, fiets_iso locatie['adres'], locatie['lat'], locatie['lon'], auto_iso, fiets_iso
) )
html_path = schrijf_naar_obsidian(html_content, locatie['adres'], subpath="huizenjacht", ext=".html") html_filepath, html_filename = schrijf_naar_mkdocs(html_content, locatie['adres'], ext=".html")
if html_path: print_line(f"🗺️ **Interactieve kaart opgeslagen:** `{html_filepath}`")
print_line(f"🗺️ **[Bekijk interactieve isochroon kaart]({html_path})**")
else:
print_line("⚠️ Kon interactieve kaart niet opslaan in Obsidian")
# Genereer screenshot en embed in markdown # Genereer screenshot en embed in markdown
b64_img, err = maak_isochroon_screenshot(html_content) b64_img, err = maak_isochroon_screenshot(html_content)
@@ -313,7 +299,7 @@ def genereer_rapport(adres_input):
else: else:
print_line(f"⚠️ Kon geen screenshot maken: {err}") print_line(f"⚠️ Kon geen screenshot maken: {err}")
# Sla ook ruwe geojson op (lokaal, niet in Obsidian) # Sla ook ruwe geojson op
output_file = f"/tmp/isochronen_{datetime.now().strftime('%Y%m%d_%H%M%S')}.geojson" output_file = f"/tmp/isochronen_{datetime.now().strftime('%Y%m%d_%H%M%S')}.geojson"
with open(output_file, 'w') as f: with open(output_file, 'w') as f:
json.dump({'auto_20_min': auto_iso, 'fiets_30_min': fiets_iso}, f) json.dump({'auto_20_min': auto_iso, 'fiets_30_min': fiets_iso}, f)
@@ -322,13 +308,10 @@ def genereer_rapport(adres_input):
print_line("---") print_line("---")
print_line("_Onderdelen: geocoding, isochronen, voorzieningen_") print_line("_Onderdelen: geocoding, isochronen, voorzieningen_")
# Schrijf rapport naar Obsidian # Schrijf rapport naar MkDocs map
print_line() print_line()
md_path = schrijf_naar_obsidian('\n'.join(rapport_lines), locatie['adres']) md_filepath, md_filename = schrijf_naar_mkdocs('\n'.join(rapport_lines), locatie['adres'], ext=".md")
if md_path: print_line(f"📝 **Rapport opgeslagen:** `{md_filepath}`")
print_line(f"📝 **Opgeslagen in Obsidian:** `{md_path}`")
else:
print_line("⚠️ Obsidian upload mislukt")
if __name__ == '__main__': if __name__ == '__main__':
adres = sys.argv[1] if len(sys.argv) > 1 else "Griendvelden 14 Best" adres = sys.argv[1] if len(sys.argv) > 1 else "Griendvelden 14 Best"