Пример #1
0
    private List <OnlineMapsTile> CreateParents(List <OnlineMapsTile> tiles, int zoom)
    {
        List <OnlineMapsTile> newParentTiles = new List <OnlineMapsTile>();

        OnlineMapsBufferZoom parentZoom;

        if (!zooms.ContainsKey(zoom))
        {
            parentZoom  = new OnlineMapsBufferZoom(zoom);
            zooms[zoom] = parentZoom;
        }
        else
        {
            parentZoom = zooms[zoom];
        }

        foreach (OnlineMapsTile tile in tiles)
        {
            if (tile.parent == null)
            {
                CreateTileParent(zoom, tile, parentZoom, newParentTiles);
            }
            else
            {
                newParentTiles.Add(tile.parent);
            }
            tile.used        = true;
            tile.parent.used = true;
        }

        return(newParentTiles);
    }
Пример #2
0
    private void InitTiles(int zoom, OnlineMapsBufferZoom activeZoom, int countX, OnlineMapsVector2i pos, int countY,
                           int maxY, List <OnlineMapsTile> newBaseTiles)
    {
        //IEnumerable<OnlineMapsTile> tiles = OnlineMapsTile.tiles.Where(t => t.provider == api.provider && t.zoom == activeZoom.id && t.type == api.type);
        IEnumerable <OnlineMapsTile> tiles = activeZoom.tiles;

        int maxX = 1 << bufferZoom;

        for (int x = 0; x < countX; x++)
        {
            int px = x + pos.x;
            if (px < 0)
            {
                px += maxX;
            }
            else if (px >= maxX)
            {
                px -= maxX;
            }

            for (int y = 0; y < countY; y++)
            {
                InitTile(zoom, activeZoom, pos, maxY, newBaseTiles, y, tiles, px);
            }
        }
    }
Пример #3
0
    private void CreateTileParent(int zoom, OnlineMapsTile tile, OnlineMapsBufferZoom parentZoom,
                                  List <OnlineMapsTile> newParentTiles)
    {
        int px = tile.x / 2;
        int py = tile.y / 2;

        OnlineMapsTile parent =
            parentZoom.tiles.FirstOrDefault(t => t.x == px && t.y == py);

        if (parent == null)
        {
            parent = new OnlineMapsTile(px, py, zoom, api)
            {
                OnSetColor = OnTileSetColor
            };
            parentZoom.tiles.Add(parent);
        }

        newParentTiles.Add(parent);
        parent.used = true;
        tile.SetParent(parent);
        if (parent.hasColors && tile.status != OnlineMapsTileStatus.loaded)
        {
            parent.SetChildColor(tile);
        }
    }
Пример #4
0
    private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY,
                          List <OnlineMapsTile> newBaseTiles,
                          int y, IEnumerable <OnlineMapsTile> ts, int px)
    {
        int py = y + pos.y;

        if (py < 0 || py >= maxY)
        {
            return;
        }

        OnlineMapsTile tile = null;

        foreach (OnlineMapsTile t in ts)
        {
            if (t.x == px && t.y == py)
            {
                tile = t;
                break;
            }
        }

        if (tile == null)
        {
            OnlineMapsTile parent = null;

            if (!api.useCurrentZoomTiles && zooms.ContainsKey(zoom - 1))
            {
                int ptx = px / 2;
                int pty = py / 2;
                foreach (OnlineMapsTile t in zooms[zoom - 1].tiles)
                {
                    if (t.x == ptx && t.y == pty)
                    {
                        parent      = t;
                        parent.used = true;
                        break;
                    }
                }
            }

            tile = new OnlineMapsTile(px, py, zoom, api, parent)
            {
                OnSetColor = OnTileSetColor
            };
            activeZoom.tiles.Add(tile);
        }
        newBaseTiles.Add(tile);
        tile.used = true;
        if (api.target == OnlineMapsTarget.texture)
        {
            SetBufferTile(tile);
        }
    }
Пример #5
0
    private OnlineMapsBufferZoom GetActiveZoom(int zoom)
    {
        OnlineMapsBufferZoom activeZoom;

        if (zooms == null)
        {
            zooms = new Dictionary <int, OnlineMapsBufferZoom>();
        }

        if (!zooms.ContainsKey(zoom))
        {
            activeZoom  = new OnlineMapsBufferZoom(zoom);
            zooms[zoom] = activeZoom;
            return(activeZoom);
        }
        return(zooms[zoom]);
    }
Пример #6
0
    private List <OnlineMapsTile> CreateParents(List <OnlineMapsTile> tiles, int zoom)
    {
        List <OnlineMapsTile> newParentTiles = new List <OnlineMapsTile>();

        OnlineMapsBufferZoom parentZoom;

        if (!zooms.ContainsKey(zoom))
        {
            parentZoom  = new OnlineMapsBufferZoom(zoom);
            zooms[zoom] = parentZoom;
        }
        else
        {
            parentZoom = zooms[zoom];
        }

        foreach (OnlineMapsTile tile in tiles)
        {
            if (tile.parent == null)
            {
                CreateTileParent(zoom, tile, parentZoom, newParentTiles);
            }
            else
            {
                newParentTiles.Add(tile.parent);
            }
            tile.used        = true;
            tile.parent.used = true;
        }

        if (api.target == OnlineMapsTarget.texture)
        {
            foreach (OnlineMapsTile tile in newParentTiles)
            {
                if (tile.status == OnlineMapsTileStatus.loaded)
                {
                    continue;
                }
                tile.GetColorsFromChilds();
            }
        }

        return(newParentTiles);
    }
Пример #7
0
    private void InitTiles(int zoom, OnlineMapsBufferZoom activeZoom, int countX, OnlineMapsVector2i pos, int countY,
        int maxY, List<OnlineMapsTile> newBaseTiles)
    {
        //IEnumerable<OnlineMapsTile> tiles = OnlineMapsTile.tiles.Where(t => t.provider == api.provider && t.zoom == activeZoom.id && t.type == api.type);
        IEnumerable<OnlineMapsTile> tiles = activeZoom.tiles;

        int maxX = 1 << bufferZoom;
        for (int x = 0; x < countX; x++)
        {
            int px = x + pos.x;
            if (px < 0) px += maxX;
            else if (px >= maxX) px -= maxX;

            for (int y = 0; y < countY; y++) InitTile(zoom, activeZoom, pos, maxY, newBaseTiles, y, tiles, px);
        }
    }
Пример #8
0
    private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY,
        List<OnlineMapsTile> newBaseTiles,
        int y, IEnumerable<OnlineMapsTile> ts, int px)
    {
        int py = y + pos.y;
        if (py < 0 || py >= maxY) return;

        OnlineMapsTile tile = null;

        foreach (OnlineMapsTile t in ts)
        {
            if (t.x == px && t.y == py)
            {
                tile = t;
                break;
            }
        }

        if (tile == null)
        {
            OnlineMapsTile parent = null;

            if (!api.useCurrentZoomTiles && zooms.ContainsKey(zoom - 1))
            {
                int ptx = px / 2;
                int pty = py / 2;
                foreach (OnlineMapsTile t in zooms[zoom - 1].tiles)
                {
                    if (t.x == ptx && t.y == pty)
                    {
                        parent = t;
                        parent.used = true;
                        break;
                    }
                }
            }

            tile = new OnlineMapsTile(px, py, zoom, api, parent) { OnSetColor = OnTileSetColor };
            activeZoom.tiles.Add(tile);
        }
        newBaseTiles.Add(tile);
        tile.used = true;
        if (api.target == OnlineMapsTarget.texture) SetBufferTile(tile);
    }
Пример #9
0
    private OnlineMapsBufferZoom GetActiveZoom(int zoom)
    {
        OnlineMapsBufferZoom activeZoom;

        if (zooms == null) zooms = new Dictionary<int, OnlineMapsBufferZoom>();

        if (!zooms.ContainsKey(zoom))
        {
            activeZoom = new OnlineMapsBufferZoom(zoom);
            zooms[zoom] = activeZoom;
            return activeZoom;
        }
        return zooms[zoom];
    }
Пример #10
0
    private void CreateTileParent(int zoom, OnlineMapsTile tile, OnlineMapsBufferZoom parentZoom,
        List<OnlineMapsTile> newParentTiles)
    {
        int px = tile.x / 2;
        int py = tile.y / 2;

        OnlineMapsTile parent =
            parentZoom.tiles.FirstOrDefault(t => t.x == px && t.y == py);
        if (parent == null)
        {
            parent = new OnlineMapsTile(px, py, zoom, api) {OnSetColor = OnTileSetColor};
            parentZoom.tiles.Add(parent);
        }

        newParentTiles.Add(parent);
        parent.used = true;
        tile.SetParent(parent);
        if (parent.hasColors && tile.status != OnlineMapsTileStatus.loaded) parent.SetChildColor(tile);
    }
Пример #11
0
    private List<OnlineMapsTile> CreateParents(List<OnlineMapsTile> tiles, int zoom)
    {
        List<OnlineMapsTile> newParentTiles = new List<OnlineMapsTile>();

        OnlineMapsBufferZoom parentZoom;
        if (!zooms.ContainsKey(zoom))
        {
            parentZoom = new OnlineMapsBufferZoom(zoom);
            zooms[zoom] = parentZoom;
        }
        else
        {
            parentZoom = zooms[zoom];
        }

        foreach (OnlineMapsTile tile in tiles)
        {
            if (tile.parent == null) CreateTileParent(zoom, tile, parentZoom, newParentTiles);
            else newParentTiles.Add(tile.parent);
            tile.used = true;
            tile.parent.used = true;
        }

        if (api.target == OnlineMapsTarget.texture)
        {
            foreach (OnlineMapsTile tile in newParentTiles)
            {
                if (tile.status == OnlineMapsTileStatus.loaded) continue;
                tile.GetColorsFromChilds();
            }
        }

        return newParentTiles;
    }
Пример #12
0
    private bool UpdateBackBuffer(double px, double py, int zoom, bool fullRedraw)
    {
        const int s      = OnlineMapsUtils.tileSize;
        int       countX = api.width / s + 2;
        int       countY = api.height / s + 2;

        double cx, cy;

        api.projection.CoordinatesToTile(px, py, zoom, out cx, out cy);
        OnlineMapsVector2i pos = new OnlineMapsVector2i((int)cx - countX / 2, (int)cy - countY / 2);

        int maxY = 1 << zoom;

        if (pos.y < 0)
        {
            pos.y = 0;
        }
        if (pos.y >= maxY - countY - 1)
        {
            pos.y = maxY - countY - 1;
        }

        if (api.target == OnlineMapsTarget.texture)
        {
            if (frontBuffer == null || frontBuffer.Length != api.width * api.height)
            {
                frontBuffer = new Color32[api.width * api.height];
                fullRedraw  = true;
            }

            if (backBuffer == null || width != countX * s || height != countY * s)
            {
                width      = countX * s;
                height     = countY * s;
                backBuffer = new Color32[height * width];

                fullRedraw = true;
            }
        }

        if (!updateBackBuffer && !fullRedraw && bufferZoom == zoom && bufferPosition != null && bufferPosition == pos)
        {
            return(false);
        }

        updateBackBuffer = false;

        bufferPosition = pos;
        bufferZoom     = zoom;

        OnlineMapsBufferZoom activeZoom = GetActiveZoom(zoom);

        List <OnlineMapsTile> newBaseTiles = new List <OnlineMapsTile>();

        lock (OnlineMapsTile.tiles)
        {
            foreach (OnlineMapsTile tile in OnlineMapsTile.tiles)
            {
                tile.used = false;
            }

            InitTiles(zoom, activeZoom, countX, pos, countY, maxY, newBaseTiles);

            if (!api.useCurrentZoomTiles)
            {
                List <OnlineMapsTile> newParentTiles = CreateParents(newBaseTiles, zoom - 1);
                if (zoom - 2 > 2)
                {
                    newParentTiles = CreateParents(newParentTiles, zoom - 2);
                    if (zoom - 3 > 2)
                    {
                        CreateParents(newParentTiles, zoom - 3);
                    }
                }
            }

            foreach (OnlineMapsTile tile in newBaseTiles)
            {
                SetBufferTile(tile);
            }

            //if (api.target == OnlineMapsTarget.texture) SetMarkersToBuffer(api.markers);
        }

        needUnloadTiles = true;

        return(true);
    }
Пример #13
0
    private List<OnlineMapsTile> CreateParents(List<OnlineMapsTile> tiles, int zoom)
    {
        List<OnlineMapsTile> newParentTiles = new List<OnlineMapsTile>();

        OnlineMapsBufferZoom parentZoom = zooms.FirstOrDefault(z => z.id == zoom);
        if (parentZoom == null)
        {
            parentZoom = new OnlineMapsBufferZoom(zoom);
            zooms.Add(parentZoom);
        }

        foreach (OnlineMapsTile tile in tiles)
        {
            if (tile.parent == null) CreateTileParent(zoom, tile, parentZoom, newParentTiles);
            tile.parent.used = true;
        }

        foreach (OnlineMapsTile tile in newParentTiles.Where(t=> t.status != OnlineMapsTileStatus.loaded)) tile.GetColorsFromChilds();

        return newParentTiles;
    }
Пример #14
0
    private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY,
        List<OnlineMapsTile> newBaseTiles,
        int y, List<OnlineMapsTile> ts, int px)
    {
        int py = y + pos.y;
        if (py < 0 || py >= maxY) return;
        OnlineMapsTile tile = ts.FirstOrDefault(t => t.x == px && t.y == py);
        if (tile == null)
        {
            OnlineMapsTile parent = OnlineMapsTile.tiles.FirstOrDefault(
                t => t.zoom == zoom - 1 && t.x == px / 2 && t.y == py / 2);

            tile = new OnlineMapsTile(px, py, zoom, api, parent) {OnSetColor = OnTileSetColor};
            activeZoom.tiles.Add(tile);
        }
        newBaseTiles.Add(tile);
        tile.used = true;
        SetBufferTile(tile);
    }
Пример #15
0
    private OnlineMapsBufferZoom GetActiveZoom(int zoom)
    {
        OnlineMapsBufferZoom activeZoom;

        if (zooms == null) zooms = new List<OnlineMapsBufferZoom>();

        lock (zooms)
        {
            activeZoom = zooms.FirstOrDefault(z => z.id == zoom);
            if (activeZoom == null)
            {
                activeZoom = new OnlineMapsBufferZoom(zoom);
                zooms.Add(activeZoom);
            }
        }
        return activeZoom;
    }