html - 传单JS : How to flip tiles vertically on-the-fly?

标签 html css leaflet mandelbrot symmetry

背景: 我制作了 Mandelbrot Set 的 1 太像素渲染图我正在使用 LeafletJS以交互方式在其中缩放和平移。它很好用。但由于 Mandelbrot 集沿实轴对称,我目前使用的平铺图像数量是必要的两倍。

问题: 我怎样才能挂接到 LeafletJS 的显示时间代码(使用一些回调?),以便每当通过 HTTP 加载图 block 时,它要么不变地通过,要么垂直翻转?这将使我能够在更高的缩放级别上将数据减少数十 GB。

示例:这是缩放级别 1 中的四个图 block (此处显示为以一个像素分隔)。我想扔掉底部的两个图 block 图像并将它们加载为顶部两个图 block 的垂直翻转版本。这可以用 LeafletJS 即时完成吗?

Zoom Level 1 tiles

更具体地说:如果我知道缩放级别 z 和图 block 坐标 xy,我想垂直翻转图 block 当 y 小于 2^(z–1) 时加载时间。例如,在缩放级别 z=10 时,我想垂直翻转所有 y < 512 的图 block 。

我想答案将涉及设置 transform 之类的事情, -moz-transform , -o-transform , 和 -webkit-transform <img> 的属性标记为 scaleY(-1)也许filter-ms-filterFlipV ,但我不知道在哪里/如何在 LeafletJS 上下文中定义它们。

最佳答案

您只需要修改 L.TileLayer._loadTile method 中底部图 block 的 y 数量| , 在它应用到图像 URL 之前。

至于翻转图像本身,不幸的是我们不能使用类,因为 Leaflet 已经将 transform 属性直接应用于图 block (图像),因此它会覆盖任何 transform 在类里面。然后我们必须在 tile.style附加任何transform-moz-transform 等。

L.HalfTileLayer = L.TileLayer.extend({
    _loadTile: function (tile, tilePoint) {

        tile._layer  = this;
        tile.onload  = this._tileOnLoad;
        tile.onerror = this._tileOnError;

        this._adjustTilePoint(tilePoint);

        //////////////////
        var limit = Math.pow(2, tilePoint.z - 1),
            y = tilePoint.y;

        if (y >= limit) { // modify for bottom tiles, i.e. higher y
            tilePoint.y = 2 * limit - y - 1; // y starts at 0
            tile.style.transform += " scaleY(-1)"; // append
            // apply more transforms for cross-browser
        }
        /////////////////

        tile.src     = this.getTileUrl(tilePoint);

        this.fire('tileloadstart', {
            tile: tile,
            url: tile.src
        });
    }
});

(new L.HalfTileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png')).addTo(map);

演示:http://jsfiddle.net/ve2huzxw/73/

请注意,在默认配置中,y = 0 是顶部,y = 2^z - 1 是底部。

关于html - 传单JS : How to flip tiles vertically on-the-fly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34014172/

相关文章:

html - 在图像顶部设置 div 样式时出现问题 (css)

javascript - 如果 DOM 元素包含一个类,我如何检查 JavaScript?

javascript - 有没有办法让 CSS 动画在动画对象不可见之前不运行?

javascript - 标记簇 - 传单 - 无法正常工作

leaflet - 如何缩放到 cql_filter 功能?

php - 当按下第二个提交按钮时,变量中的值消失

html - 2 张图片并排 - Bootstrap

jquery - 图像 map 上的悬停和单击效果

javascript - 传单: map invalidatesize 不起作用

javascript - 当用户输入文本时,如何防止重新调整 div 的大小?