Exemple #1
0
    // 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)));
    }
Exemple #2
0
    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)));
    }
Exemple #3
0
    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);
                }
            }
        }
    }
Exemple #4
0
    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);
    }