// Check if a tile is covered by other tiles with a smaller zoom private bool IsCoveredByLargerTile(int zoomLevel, int tileX, int tileY, int tileZ) { tileZ--; tileX /= 2; tileY /= 2; return(tilesMap.ContainsKey(MapTileId.ToId(tileX, tileY, zoomLevel, layerId)) || (zoomLevel < tileZ && IsCoveredByLargerTile(zoomLevel, tileX, tileY, tileZ))); }
private bool IsCoveredBySmallerTile(int zoomLevel, int tileX, int tileY, int tileZ) { var id = MapTileId.ToId(tileX, tileY, tileZ, layerId); return(tilesMap.ContainsKey(id) || (zoomLevel == tileZ && !requestedTiles.Contains(id)) || (zoomLevel > tileZ && IsCoveredBySmallerTiles(zoomLevel, tileX, tileY, tileZ))); }
private void CleanUpOldTiles(int mapZoomLevel, MapTileBounds mapBounds) { // Remove tiles that are 3 levels higher than current zoom level int mapZoomLevelThreshold = mapZoomLevel - MaxZoomLevelDifference; MapTileId anchorId = map.Anchor; float anchorScale = map.TilesToUnits; Vector2 anchorOffset = map.AnchorOffsetInUnits; for (int i = oldTilesList.Count - 1; i >= 0; i--) { var tileId = oldTilesList[i].Id; if (tilesMap.ContainsKey(MapTileId.ToId(tileId.X, tileId.Y, tileId.Z, layerId))) { RemoveTile(oldTilesMap, oldTilesList, i); } else { // Calculate the tile bounds in the map's zoom level float toMapZoom = Mathf.Pow(2, mapZoomLevel - tileId.Z); int tileWest = (int)(tileId.X * toMapZoom); int tileEast = (int)((tileId.X + 1) * toMapZoom); int tileNorth = (int)(tileId.Y * toMapZoom); int tileSouth = (int)((tileId.Y + 1) * toMapZoom); bool inFrustum = tileEast > mapBounds.West && tileWest <mapBounds.East && tileSouth> mapBounds.North && tileNorth < mapBounds.South; if (!inFrustum || tileId.Z < mapZoomLevelThreshold) { RemoveTile(oldTilesMap, oldTilesList, i); } else if (tileId.Z != mapZoomLevel) { if ((tileId.Z > mapZoomLevel && IsCoveredByLargerTile(mapZoomLevel, tileId.X, tileId.Y, tileId.Z)) || (tileId.Z < mapZoomLevel && IsCoveredBySmallerTiles(mapZoomLevel, tileId.X, tileId.Y, tileId.Z))) { RemoveTile(oldTilesMap, oldTilesList, i); } else { MapTile tile = oldTilesList[i]; tile.UpdateTile(anchorId, anchorScale, anchorOffset, Mathf.Pow(2, map.zoom - tile.ZoomLevel), 0.0001f); } } else { MapTile tile = oldTilesList[i]; tile.UpdateTile(anchorId, anchorScale, anchorOffset, Mathf.Pow(2, map.zoom - tile.ZoomLevel), 0.0001f); } } } }
public override void SaveToBookmark(BinaryWriter bw, string bookmarkPath) { bw.Write(longitude); bw.Write(latitude); bw.Write(zoom); bw.Write(zoomLevel); bw.Write(tilesToUnits); bw.Write(unitsToTiles); bw.Write(pixelsToUnits); bw.Write(unitsToPixels); bw.Write(unitsToMeters); bw.Write(metersToUnits); bw.Write(currentLevel); bw.Write(currentMeters.x); bw.Write(currentMeters.y); bw.Write(viewBounds.x); bw.Write(viewBounds.y); bw.Write(viewBounds.width); bw.Write(viewBounds.height); bw.Write(mapCoordBounds.west); bw.Write(mapCoordBounds.east); bw.Write(mapCoordBounds.north); bw.Write(mapCoordBounds.south); bw.Write(mapTileBounds.West); bw.Write(mapTileBounds.East); bw.Write(mapTileBounds.North); bw.Write(mapTileBounds.South); bw.Write(anchor.ToId()); bw.Write(anchorOffsetInUnits.x); bw.Write(anchorOffsetInUnits.y); }