File size: 1,992 Bytes
e1ec339
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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)