package main import ( "encoding/binary" "fmt" "os" "strconv" ) func loadSRTM(lat, lon int) ([][]int16, error) { // Budeme pro jednoduchost předpokládat, že jsme v N/E kvadrantu filename := fmt.Sprintf("N%02dE%03d.hgt", lat, lon) file, err := os.Open(filename) if err != nil { return nil, fmt.Errorf("Cannot open file '%s': %v", filename, err) } data := make([][]int16, 3601) // Data ze souboru čteme od severu k jihu, ale nám se více hodí, aby // y=0 odpovídalo spodku čtverce, y tedy jedeme odzadu for y := 3600; y >= 0; y-- { data[y] = make([]int16, 3601) err := binary.Read(file, binary.BigEndian, data[y]) if err != nil { return nil, err } } return data, nil } func main() { if len(os.Args) != 3 { fmt.Fprintf(os.Stderr, "Usage: %s \n", os.Args[0]) os.Exit(1) } lat, _ := strconv.Atoi(os.Args[1]) lon, _ := strconv.Atoi(os.Args[2]) // 1. Načteme data srtm, err := loadSRTM(lat, lon) if err != nil { fmt.Fprintf(os.Stderr, "Cannot load SRTM data: %v", err) os.Exit(1) } // 2. Najdeme bod s největší výškou var maxHeight int16 var maxX, maxY int for y, line := range srtm { for x, point := range line { if point > maxHeight { maxHeight = point maxX, maxY = x, y } } } // 3. Přepočteme bod na souřadnice a vypíšeme ho step := 1.0 / 3600 maxLat := step*float64(maxY) + float64(lat) maxLon := step*float64(maxX) + float64(lon) fmt.Printf("Maximal height %dm at N%f E%f: https://mapy.cz/turisticka?x=%f&y=%f&z=15\n", maxHeight, maxLat, maxLon, maxLon, maxLat) }