# lugar_3.py # Gradio 6.2.0 # Layout FULL PAGE (sem margens laterais) # ✔ Busca por nome e coordenadas # ✔ Mapa Leaflet # ✔ Google Street View (fallback automático) # ✔ Apple Maps import re import html import requests import gradio as gr # ---------------------------- # Parsing / Geocoding # ---------------------------- _COORD_RE = re.compile( r""" ^\s* (?:lat\s*[:=]?\s*)?(-?\d+(?:\.\d+)?) (?:\s*[,;]\s*|\s+) (?:lon|lng|long)?\s*[:=]?\s*(-?\d+(?:\.\d+)?) \s*$ """, re.IGNORECASE | re.VERBOSE ) def parse_coords(text: str): if not text: return None m = _COORD_RE.match(text.strip()) if not m: return None lat = float(m.group(1)) lon = float(m.group(2)) if not (-90 <= lat <= 90 and -180 <= lon <= 180): raise ValueError("Coordenadas fora do intervalo válido.") return lat, lon def geocode_by_name(query: str): url = "https://nominatim.openstreetmap.org/search" params = {"q": query, "format": "jsonv2", "limit": 1} headers = {"User-Agent": "GradioMapFullPage"} r = requests.get(url, params=params, headers=headers, timeout=20) r.raise_for_status() data = r.json() if not data: raise ValueError(f"Local não encontrado: {query}") lat = float(data[0]["lat"]) lon = float(data[0]["lon"]) name = data[0].get("display_name", query) return lat, lon, name def resolve_location(mode, place, lat, lon): if mode == "coords": return float(lat), float(lon), f"{lat:.6f}, {lon:.6f}" if mode == "auto": parsed = parse_coords(place) if parsed: la, lo = parsed return la, lo, f"{la:.6f}, {lo:.6f}" return geocode_by_name(place) # ---------------------------- # Map HTML (srcdoc) # ---------------------------- def build_srcdoc(lat, lon, zoom, basemap, title): sv0 = f"https://www.google.com/maps/@?api=1&map_action=pano&viewpoint={lat:.7f},{lon:.7f}" a0 = f"https://maps.apple.com/place?coordinate={lat:.7f},{lon:.7f}" doc = f"""
{lat:.7f}, {lon:.7f}