public Changes Apply(UInt16 width, UInt16 height, Double zoomLevel, GeoPoint center, Boolean recreate) { var previousTiles = new List <GeoTileWithObjects <T> >(GetTiles()); var tileWidth = 360.0 / (1 << (Byte)zoomLevel); var tileHeight = 180.0 / (1 << (Byte)zoomLevel); Width = width; Height = height; Matrix = new GeoTileWithObjects <T> [Height * 2 + 1, Width * 2 + 1]; Matrix[Height, Width] = new GeoTileWithObjects <T>(center, (Byte)zoomLevel); var centerPoint = Matrix[Height, Width].Tile.Point; for (var i = -Width; i <= Width; i++) { for (var j = -Height; j <= Height; j++) { if ((i == 0) && (j == 0)) { continue; } Matrix[j + Height, i + Width] = new GeoTileWithObjects <T>(new GeoTile(new GeoPoint(centerPoint.Latitude + tileHeight * j, centerPoint.Longitude + tileWidth * i), (Byte)zoomLevel)); } } var newTiles = new List <GeoTileWithObjects <T> >(GetTiles()); var notChangedTiles = recreate ? new List <GeoTileWithObjects <T> >() : previousTiles.Intersect(newTiles).ToList(); foreach (var notChangedTile in notChangedTiles) { var previousTile = previousTiles[previousTiles.IndexOf(notChangedTile)]; var newTile = newTiles[newTiles.IndexOf(notChangedTile)]; foreach (var obj in previousTile.Objects) { newTile.Objects.Add(obj); } } var removedTiles = previousTiles.Except(notChangedTiles).ToList(); var addedTiles = GetTiles().Except(notChangedTiles).ToList(); return(new Changes(removedTiles, addedTiles, notChangedTiles)); }
public TileWithNodesData(GeoTileWithObjects <Object> tile, IEnumerable <NodeData> nodesData) { Tile = tile; NodesData = nodesData; }