GoBlog/geoMap.go

128 lines
3.3 KiB
Go
Raw Permalink Normal View History

2021-07-06 19:06:39 +00:00
package main
import (
2024-04-22 13:49:22 +00:00
"cmp"
2021-07-06 19:06:39 +00:00
"net/http"
)
const defaultGeoMapPath = "/map"
2021-07-06 19:06:39 +00:00
func (a *goBlog) serveGeoMap(w http.ResponseWriter, r *http.Request) {
blog, bc := a.getBlog(r)
2021-07-06 19:06:39 +00:00
2024-04-22 13:49:22 +00:00
mapPath := bc.getRelativePath(cmp.Or(bc.Map.Path, defaultGeoMapPath))
2021-11-22 16:19:07 +00:00
canonical := a.getFullAddress(mapPath)
allPostsWithLocationRequestConfig := &postsRequestConfig{
blog: blog,
anyParams: []string{a.cfg.Micropub.LocationParam, gpxParameter},
fetchParams: []string{a.cfg.Micropub.LocationParam, gpxParameter},
}
allPostsWithLocationRequestConfig.status, allPostsWithLocationRequestConfig.visibility = a.getDefaultPostStates(r)
allPostsWithLocation, err := a.db.countPosts(allPostsWithLocationRequestConfig)
2021-07-06 19:06:39 +00:00
if err != nil {
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
return
}
if allPostsWithLocation == 0 {
a.render(w, r, a.renderGeoMap, &renderData{
Canonical: canonical,
Data: &geoMapRenderData{
noLocations: true,
2021-07-06 19:06:39 +00:00
},
})
return
}
a.render(w, r, a.renderGeoMap, &renderData{
Canonical: canonical,
Data: &geoMapRenderData{
locations: "url:" + canonical + geoMapLocationsSubpath,
tracks: "url:" + canonical + geoMapTracksSubpath,
attribution: a.getMapAttribution(),
minZoom: a.getMinZoom(),
maxZoom: a.getMaxZoom(),
},
})
}
const geoMapTracksSubpath = "/tracks.json"
func (a *goBlog) serveGeoMapTracks(w http.ResponseWriter, r *http.Request) {
blog, _ := a.getBlog(r)
allPostsWithTracksRequestConfig := &postsRequestConfig{
blog: blog,
anyParams: []string{gpxParameter},
fetchParams: []string{gpxParameter},
excludeParameter: showRouteParam,
excludeParameterValue: "false", // Don't show hidden route tracks
}
allPostsWithTracksRequestConfig.status, allPostsWithTracksRequestConfig.visibility = a.getDefaultPostStates(r)
allPostsWithTracks, err := a.getPosts(allPostsWithTracksRequestConfig)
if err != nil {
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
return
2021-07-06 19:06:39 +00:00
}
2021-11-13 19:19:46 +00:00
type templateTrack struct {
Paths [][]*trackPoint
Points []*trackPoint
Post string
2021-11-13 19:19:46 +00:00
}
var tracks []*templateTrack
for _, p := range allPostsWithTracks {
if t, err := a.getTrack(p, true); err == nil && t != nil {
2021-11-13 19:19:46 +00:00
tracks = append(tracks, &templateTrack{
Paths: t.Paths,
Points: t.Points,
Post: p.Path,
2021-11-13 19:19:46 +00:00
})
}
}
2023-11-11 18:13:50 +00:00
a.respondWithMinifiedJson(w, tracks)
}
2021-07-06 19:06:39 +00:00
const geoMapLocationsSubpath = "/locations.json"
func (a *goBlog) serveGeoMapLocations(w http.ResponseWriter, r *http.Request) {
blog, _ := a.getBlog(r)
allPostsWithLocationRequestConfig := &postsRequestConfig{
blog: blog,
anyParams: []string{a.cfg.Micropub.LocationParam},
fetchParams: []string{a.cfg.Micropub.LocationParam},
}
allPostsWithLocationRequestConfig.status, allPostsWithLocationRequestConfig.visibility = a.getDefaultPostStates(r)
allPostsWithLocations, err := a.getPosts(allPostsWithLocationRequestConfig)
if err != nil {
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
return
}
type templateLocation struct {
Lat float64
Lon float64
Post string
}
var locations []*templateLocation
for _, p := range allPostsWithLocations {
for _, g := range a.geoURIs(p) {
locations = append(locations, &templateLocation{
Lat: g.Latitude,
Lon: g.Longitude,
Post: p.Path,
})
2021-11-13 19:40:25 +00:00
}
2021-07-06 19:06:39 +00:00
}
2023-11-11 18:13:50 +00:00
a.respondWithMinifiedJson(w, locations)
2021-07-06 19:06:39 +00:00
}