package main import ( "encoding/json" "fmt" "html/template" "net/http" "net/url" ) type NominatimResponse struct { Lat string `json:"lat"` Lon string `json:"lon"` } func geocodeQuery(query string) (latitude, longitude string, found bool, err error) { // URL encode the query query = url.QueryEscape(query) // Construct the request URL urlString := fmt.Sprintf("https://nominatim.openstreetmap.org/search?format=json&q=%s", query) // Make the HTTP GET request resp, err := http.Get(urlString) if err != nil { return "", "", false, err } defer resp.Body.Close() // Read the response var result []NominatimResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return "", "", false, err } // Check if there are any results if len(result) > 0 { latitude = result[0].Lat longitude = result[0].Lon return latitude, longitude, true, nil } return "", "", false, nil } func handleMapSearch(w http.ResponseWriter, settings UserSettings, query string, lang string) { // Geocode the query to get coordinates latitude, longitude, found, err := geocodeQuery(query) if err != nil { printDebug("Error geocoding query: %s, error: %v", query, err) http.Error(w, "Failed to find location", http.StatusInternalServerError) return } // Use a template to serve the map page data := map[string]interface{}{ "Query": query, "Latitude": latitude, "Longitude": longitude, "Found": found, "Theme": settings.Theme, } tmpl, err := template.ParseFiles("templates/map.html") if err != nil { printErr("Error loading map template: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } tmpl.Execute(w, data) }