Search/map.go

73 lines
1.6 KiB
Go
Raw Permalink Normal View History

package main
import (
"encoding/json"
"fmt"
"html/template"
"log"
"net/http"
"net/url"
)
type NominatimResponse struct {
Lat string `json:"lat"`
Lon string `json:"lon"`
}
2024-05-21 19:22:36 +00:00
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 {
2024-05-21 19:22:36 +00:00
return "", "", false, err
}
defer resp.Body.Close()
// Read the response
var result []NominatimResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
2024-05-21 19:22:36 +00:00
return "", "", false, err
}
// Check if there are any results
if len(result) > 0 {
latitude = result[0].Lat
longitude = result[0].Lon
2024-05-21 19:22:36 +00:00
return latitude, longitude, true, nil
}
2024-05-21 19:22:36 +00:00
return "", "", false, nil
}
func handleMapSearch(w http.ResponseWriter, query string, lang string) {
// Geocode the query to get coordinates
2024-05-21 19:22:36 +00:00
latitude, longitude, found, err := geocodeQuery(query)
if err != nil {
log.Printf("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,
2024-05-21 19:22:36 +00:00
"Found": found,
}
tmpl, err := template.ParseFiles("templates/map.html")
if err != nil {
log.Printf("Error loading map template: %v", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
tmpl.Execute(w, data)
}