anamnesis_GIS_TOOLS / map_utils.py
threeorfour's picture
Upload 16 files
e1ec339 verified
# file: map_utils.py
import json
import gradio as gr # <-- Add this import
from api_clients import AVAILABLE_BASEMAPS
def render_map_html_structure(geojson_str: str):
# ... (this function is unchanged) ...
if not geojson_str:
return "<div style='width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#1f2937;color:#6b7280;'>Run a query to display the map.</div>"
return '<div id="map" style="height:100%; width: 100%; background-color:#1f2937;"></div>'
def get_map_init_script(basemap_name: str, geojson_str: str) -> str:
# ... (this function is unchanged) ...
if not basemap_name or not geojson_str: return ""
basemap_info = AVAILABLE_BASEMAPS.get(basemap_name)
if not basemap_info: return "alert('Basemap not found!');"
native_zoom = basemap_info.get("native_zoom", 16)
parcel_json_str = json.dumps(json.loads(geojson_str))
return f"""
var container = L.DomUtil.get('map');
if(container != null){{ container._leaflet_id = null; }}
var map = L.map('map').setView([47.4, -122.5], 9);
L.tileLayer('{basemap_info['url']}', {{
maxZoom: 22, maxNativeZoom: {native_zoom}, attribution: '{basemap_info['attribution']}'
}}).addTo(map);
var p_data = {parcel_json_str};
if (p_data && p_data.type) {{
var p_layer = L.geoJSON(p_data, {{ style: () => ({{ color: "#e60000", weight: 3, opacity: 0.9, fillColor: "#e60000", fillOpacity: 0.2 }}) }}).addTo(map);
map.fitBounds(p_layer.getBounds().pad(0.1), {{ maxZoom: 19 }});
}}
"""
def handle_map_type_change(basemap_name, geojson_str):
new_html = render_map_html_structure(geojson_str)
new_script = get_map_init_script(basemap_name, geojson_str)
# --- THIS IS THE FIX ---
# Return two gr.update objects directly, not dictionaries.
return gr.update(value=new_html), gr.update(value=new_script)