Release v2.3 - Obsidian removed, rapport opgeslagen in MkDocs /root/mkdocs/docs/docs/Huizenjacht/
This commit is contained in:
+23
-40
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user