Cílem cvičení bude implementovat generátor map na základě dat z OSM.
Vytvořte konzolovou aplikaci s názvem OSMMap a knihovnu tříd s názvem OSMMapLib.
V knihovně OSMMapLib vytvořte třídy Tile, Layer a Map.
Třída Tile:
Třída Layer:
Třída Map:
Bude obsahovat veřejnou vlastnost Layer.
Bude obsahovat vlastnosti Lat (double), Lon (double) a Zoom (int). Při čtení vlastnosti Zoom bude vždy vrácena hodnota v rozmezí 1 až MaxZoom z aktuální vrstvy (Layer).
Bude obsahovat neveřejnou vlastnost CenterTileX (int), která bude jen pro čtení a bude vracet výslede tohoto výpočtu: (int)((lon + 180.0) / 360.0 * (1 << zoom))
Bude obsahovat neveřejnou vlastnost CenterTileY (int), která bude jen pro čtení a bude vracet výslede tohoto výpočtu: (int)((1.0 - Math.Log(Math.Tan(lat * Math.PI / 180.0) + 1.0 / Math.Cos(lat * Math.PI / 180.0)) / Math.PI) / 2.0 * (1 << zoom))
V knihovny tříd referencujte knihovnu MapRendererLib.zip (součást zadání).
Třída Map bude obsahovat metodu Render přijímající název souboru do kterého se bude mapa generovat. Tělo této metody bude vypadat následovně:
MapRenderer mapRenderer = new MapRenderer(4, 4);
for (int x = -2; x < 2; x++)
{
for (int y = -2; y < 2; y++)
{
Tile tile = this.Layer[this.CenterTileX + x, this.CenterTileY + y, this.Zoom];
Console.WriteLine(tile);
mapRenderer.Set(x + 2, y + 2, tile.Url);
}
}
mapRenderer.Flush();
mapRenderer.Render(fileName);
Následně otestujte vaši implementaci. Pro otestování vytvořte novou mapu a přiřaďte ji vrstvu. Následně na mapě zavolejte metodu Render.
Zkuste vytvořit další vrstvu (šablona "https://b.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png" a zoom 17). A vykreslit mapu s ní.