// C# skript, spustitelné například pomocí `dotnet script` // ale jinak je to normální C#, jenom nemá Main using System.IO; short[][] LoadSrtmFile(string path) { var data = new short[3601][]; using (var reader = new BinaryReader(File.OpenRead(path))) { // 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 (int y = 3600; y >= 0; y--) { var line = new short[3601]; for (int x = 0; x <= 3600; x++) { var elevation = reader.ReadInt16(); // Ten BinaryReader čte data little endian, ale my potřebujeme big endian :/ // Kdyžtak v .NET Standard 2.1 už je na to funkce BinaryPrimitives.ReverseEndianness elevation = (short)((elevation >> 8) + (elevation << 8)); line[x] = elevation; } data[y] = line; } } return data; } if (Args.Count != 2) { Console.WriteLine($"Usage: \n"); Environment.Exit(1); } var lat = int.Parse(Args[0]); var lon = int.Parse(Args[1]); // Budeme pro jednoduchost předpokládat, že jsme v N/E kvadrantu a že jsou sobrory v aktuálním adresáři var file = $"N{lat:D2}E{lon:D3}.hgt"; var srtm = LoadSrtmFile(file); var maxHeight = 0; var (maxX, maxY) = (0, 0); for (int y = 0; y < 3601; y++) { for (int x = 0; x < 3601; x++) { if (srtm[y][x] > maxHeight) { maxHeight = srtm[y][x]; (maxX, maxY) = (x, y); } } } // 3. Přepočteme bod na souřadnice a vypíšeme ho var step = 1.0 / 3600.0; var maxLat = step*maxY + lat; var maxLon = step*maxX + lon; Console.WriteLine($"Maximal height {maxHeight}m at N{maxLat} E{maxLon}: https://mapy.cz/turisticka?x={maxLon}&y={maxLat}&z=15");