#!/usr/bin/env python3
"""
import os
import sys
from shapely.geometry import box, Point, Polygon
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
from geopy.geocoders import Nominatim
import time
# --- Settings ---
OUTFILE = "jerv_kartskisse.png"
WIDTH = 1200 # px
HEIGHT = 900
DPI = 150
# Stedsnavn som skal lokaliseres (Nominatim): vi bruker Lesja + Lordalen og Dalsida som søk
GEOCODER_USER_AGENT = "jerv_map_generator"
SEARCH_NAMES = ["Lordalen, Lesja, Norway", "Dalsida, Lesja, Norway", "Lesja, Norway"]
# Buffer (grader) rundt funnet punkt for kartutsnitt (tilpasses automatisk)
BUFFER_DEG = 0.08 # ~8 km (omtrentlig) - juster ved behov
# Farger for soner
COLOR_HIGH = "#e31a1c" # rød
COLOR_MODERATE = "#ffcc00" # gul
COLOR_CORRIDOR = "#2ca25f" # grønn
# --- Funksjoner ---
def geocode_first(names):
geolocator = Nominatim(user_agent=GEOCODER_USER_AGENT, timeout=10)
for name in names:
try:
loc = geolocator.geocode(name, exactly_one=True)
if loc:
print(f"Found: {name} -> {loc.latitude:.5f}, {loc.longitude:.5f}")
return loc.latitude, loc.longitude
except Exception as e:
print("Geocode error:", e)
time.sleep(1)
raise RuntimeError("Klarte ikke geokode noen av stedsnavnene. Sjekk internett eller juster navn.")
def make_bbox(lat, lon, buffer_deg):
minx = lon - buffer_deg
maxx = lon + buffer_deg
miny = lat - buffer_deg
maxy = lat + buffer_deg
return box(minx, miny, maxx, maxy)
def main():
print("Starter kartgenerering...")
# 1) Finn senter i området via geokoding
lat, lon = geocode_first(SEARCH_NAMES)
# 2) Lag bbox og GeoDataFrame
bbox_geom = make_bbox(lat, lon, BUFFER_DEG)
gdf_bbox = gpd.GeoDataFrame({"geometry": [bbox_geom]}, crs="EPSG:4326")
# 3) Lag hensynssoner (skjematiske polygonelementer)
# Rød sone: sentrale Lordalen/Reinheimen (større rundbuffer mot NØ/SV for å indikere sårbar kjerne)
red_poly = bbox_geom.buffer(0.035) # omtrent
# Gul sone: Dalsida-modul (noe mindre, litt forskjøvet vestover)
yellow_poly = box(lon - 0.06, lat - 0.04, lon + 0.02, lat + 0.04)
# Grønn korridor: tynn stripe langs nederste/nordlige kant av bbox
green_poly = box(lon - 0.12, lat + 0.025, lon + 0.12, lat + 0.045)
gdf_zoner = gpd.GeoDataFrame({
"navn": ["Høyhensyn (villrein)", "Moderat hensyn (jerv/sporing)", "Fly-korridor / lavt hensyn"],
"geometry": [red_poly, yellow_poly, green_poly],
"farge": [COLOR_HIGH, COLOR_MODERATE, COLOR_CORRIDOR]
}, crs="EPSG:4326")
# 4) Snu til WebMercator for bakgrunnskart
gdf_bbox_wm = gdf_bbox.to_crs(epsg=3857)
gdf_zoner_wm = gdf_zoner.to_crs(epsg=3857)
# 5) Tegn kart
fig, ax = plt.subplots(1, 1, figsize=(WIDTH/DPI, HEIGHT/DPI), dpi=DPI)
# Hent ut utstrekning fra bbox (i meters etter projeksjon)
minx, miny, maxx, maxy = gdf_bbox_wm.total_bounds
pad_x = (maxx - minx) * 0.08
pad_y = (maxy - miny) * 0.08
ax.set_xlim(minx - pad_x, maxx + pad_x)
ax.set_ylim(miny - pad_y, maxy + pad_y)
# Tegn soner (med gjennomsiktighet)
for _, row in gdf_zoner_wm.iterrows():
ax.add_geometries([row.geometry], crs=None, fc=row.farge, ec="k", alpha=0.35, linewidth=0.6)
# Legg på grenser og tittel
# Sett tittel og kilder
ax.set_title("Kartskisse: Lordalen og Dalsida statsallmenning – foreslåtte hensynssoner", fontsize=12, pad=12)
# Legende - lager manuell patch-legend
import matplotlib.patches as mpatches
red_patch = mpatches.Patch(color=COLOR_HIGH, label="Høyhensyn: Villrein (unngå fly/skogning)", alpha=0.5)
yellow_patch = mpatches.Patch(color=COLOR_MODERATE, label="Moderat hensyn: Sporings-/fangstområder", alpha=0.5)
green_patch = mpatches.Patch(color=COLOR_CORRIDOR, label="Fly-korridor / lavere hensyn", alpha=0.5)
ax.legend(handles=[red_patch, yellow_patch, green_patch], loc="lower left", fontsize=9)
# Legg på bakgrunnskart fra contextily
try:
ctx.add_basemap(ax, source=ctx.providers.Stamen.TerrainBackground, crs='EPSG:3857')
except Exception as e:
print("Warning: kunne ikke hente bakgrunnskart fra contextily:", e)
print("Kartet vil likevel bli laget uten online-bakgrunn.")
# Tekstboks med kilde og referanser (saksdokument + e-post)
props = dict(boxstyle='round', facecolor='white', alpha=0.8)
citation_text = ("Kilde: NINA søknad (20.11.2025) og e-postkorrespondanse (nov 2025)."
"\nSe saksframlegg for detaljer.")
ax.text(0.99, 0.01, citation_text, ha='right', va='bottom', transform=ax.transAxes, fontsize=8, bbox=props)
ax.axis("off")
plt.tight_layout()
# Lagre til PNG
print("Lagrer kart til", OUTFILE)
plt.savefig(OUTFILE, dpi=DPI)
plt.close()
print("Ferdig. Fil:", OUTFILE)
if __name__ == "__main__":
main()