-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
148 lines (132 loc) · 4.17 KB
/
main.go
File metadata and controls
148 lines (132 loc) · 4.17 KB
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package main
import (
"flag"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"time"
)
func main() {
city := flag.String("city", "", "City name")
country := flag.String("country", "", "Country name")
latOverride := flag.Float64("latitude", 0, "Override latitude center point")
lonOverride := flag.Float64("longitude", 0, "Override longitude center point")
displayCity := flag.String("display-city", "", "Custom display name for city")
displayCountry := flag.String("display-country", "", "Custom display name for country")
countryLabel := flag.String("country-label", "", "Override country text displayed on poster")
themeName := flag.String("theme", "terracotta", "Theme name")
allThemes := flag.Bool("all-themes", false, "Generate posters for all themes")
distance := flag.Float64("distance", 18000, "Map radius in meters")
width := flag.Float64("width", 12, "Poster width in inches")
height := flag.Float64("height", 16, "Poster height in inches")
listThemesFlag := flag.Bool("list-themes", false, "List all available themes")
flag.Parse()
if *listThemesFlag {
themes, err := getAvailableThemes()
if err != nil {
log.Fatal(err)
}
fmt.Println("\nAvailable Themes:")
fmt.Println(strings.Repeat("-", 60))
for _, t := range themes {
theme, _ := loadTheme(t)
if theme != nil {
fmt.Printf(" %s\n", t)
fmt.Printf(" %s\n", theme.Name)
if theme.Description != "" {
fmt.Printf(" %s\n", theme.Description)
}
fmt.Println()
}
}
return
}
if *city == "" || *country == "" {
fmt.Println("Usage: CartoGo -city <city> -country <country> [options]")
flag.PrintDefaults()
return
}
finalCity := *city
if *displayCity != "" {
finalCity = *displayCity
}
finalCountry := *country
if *displayCountry != "" {
finalCountry = *displayCountry
} else if *countryLabel != "" {
finalCountry = *countryLabel
}
var lat, lon float64
if *latOverride != 0 || *lonOverride != 0 {
lat, lon = *latOverride, *lonOverride
fmt.Printf("✓ Using manual coordinates: %f, %f\n", lat, lon)
} else {
var err error
var displayName string
lat, lon, displayName, err = getCoordinates(*city, *country)
if err != nil {
log.Fatalf("Geocoding failed: %v", err)
}
fmt.Printf("✓ Found: %s\n", displayName)
fmt.Printf("✓ Coordinates: %f, %f\n", lat, lon)
}
maxDim := *height
if *width > maxDim {
maxDim = *width
}
minDim := *height
if *width < minDim {
minDim = *width
}
compensatedDist := *distance * (maxDim / minDim) / 4.0
// Fetch Data once for all themes
fmt.Println("Fetching OSM data (this may take a while)...")
osmData, err := getCachedOSM(lat, lon, compensatedDist)
if err != nil {
log.Printf("Warning: Failed to read cache: %v", err)
}
if osmData == nil {
osmData, err = fetchOSMData(lat, lon, compensatedDist)
if err != nil {
log.Fatalf("Failed to fetch OSM data: %v", err)
}
fmt.Printf("✓ Retrieved %d elements from OSM\n", len(osmData.Elements))
if err := cacheOSM(lat, lon, compensatedDist, osmData); err != nil {
log.Printf("Warning: Failed to cache OSM data: %v", err)
}
} else {
fmt.Println("✓ Using cached OSM data")
}
themesToGenerate := []string{*themeName}
if *allThemes {
themesToGenerate, err = getAvailableThemes()
if err != nil {
log.Fatalf("Failed to get themes: %v", err)
}
}
outputDir := "posters"
if _, err := os.Stat(outputDir); os.IsNotExist(err) {
os.Mkdir(outputDir, 0755)
}
for _, tName := range themesToGenerate {
theme, err := loadTheme(tName)
if err != nil {
log.Printf("Failed to load theme %s: %v", tName, err)
continue
}
timestamp := time.Now().Format("20060102_150405")
citySlug := strings.ToLower(strings.ReplaceAll(*city, " ", "_"))
outputFile := filepath.Join(outputDir, fmt.Sprintf("%s_%s_%s.png", citySlug, tName, timestamp))
fmt.Printf("Rendering poster for theme: %s...\n", tName)
if err := renderPoster(finalCity, finalCountry, lat, lon, compensatedDist, theme, osmData, *width, *height, outputFile); err != nil {
log.Fatalf("Rendering failed: %v", err)
}
fmt.Printf("✓ Done! Poster saved to %s\n", outputFile)
// Small delay to ensure unique timestamps if generating multiple
if *allThemes {
time.Sleep(1 * time.Second)
}
}
}