5

我设法在基本地图上添加了一个图层,它看起来像这样:我通过使用 jQuery -width和. 我不确定这是正确的方法,请告知是否有更好的方法。heightoverflow:hidden

我需要做的是,当我通过鼠标拖动来平移地图时,我希望顶部矩形图层保持在同一位置,但要分别更改内容,以便该矩形看起来像底图顶部的蒙版。如我所见,Leaflet 中的平移正在由

-webkit-transform: translate3d(185px, 178px, 0)(我在 Chrome 中)所以设置top: 0left: 0没有帮助,矩形在平移时随着地图移动,就像它粘在地图上一样。

我相信有人处理过同样的任务,所以请告诉我。

更新:我添加了一个更好地说明我的问题的小提琴:

矩形顶层

4

1 回答 1

5

建议 #1

您可以创建一个clip蒙版并将其更改rect为与平移相反的方向。

类似http://jsfiddle.net/gaby/dgWZk/23/

var overlay = {
    top: 50,
    left: 50,
    width: 200,
    height: 200
}

map.on('move', repositionMask) ;

map.fire('move');


function repositionMask() {
    var po = map.getPixelOrigin(),
        pb = map.getPixelBounds(),
        offset = map.getPixelOrigin().subtract(map.getPixelBounds().min);

    $(layer02._container).css({
        clip: 'rect(' + (overlay.top - offset.y) + 'px,' + (overlay.left + overlay.width - offset.x) + 'px,' + (overlay.top + overlay.height - offset.y) + 'px,' + (overlay.left - offset.x) + 'px)'
    });
}

一个问题是传单方法在惯性平移时不会暴露动画变量,所以我们还不能模仿..所以我禁用inertia了地图..

放大/缩小时的另一个问题是,在动画期间,蒙版也会放大/缩小(但在动画完成后会得到修复,或者您也可以zoomAnimation:false设置


建议#2

另一种解决方案是创建第二张地图并覆盖/同步它

类似http://jsfiddle.net/gaby/dgWZk/24/

<div id="container">
    <div id="map"></div>
    <div id="overlay"></div>
</div>

#container {
    position:relative;
    height:500px;
}
#map {
    height: 500px;
    position:absolute;
    top:0;
    left:0;
    right:0;
    bottom:0;
}
#overlay {
    width: 200px;
    height: 200px;
    position:absolute;
    top:50%;
    left:50%;
    margin-left:-200px;
    margin-top:-200px;
    outline:1px solid green;
    pointer-events:none;
}

var map = new L.map('map',{
    inertia:false
}).setView([51.505, -0.09], 13);
var overlay = new L.map('overlay', {
    zoomControl: false,
    inertia: false,
    keyboard: false,
    dragging: false,
    scrollWheelZoom: false,
    attributionControl:false,
    zoomAnimation:false
}).setView([51.505, -0.09], 13);
var layer01 = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);


var layer02 = L.tileLayer('http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg').addTo(overlay);


map.on('move', function () {
    var offset = overlay._getNewTopLeftPoint(map.getCenter()).subtract(overlay._getTopLeftPoint()).subtract([100,100]);
    overlay.fire('movestart');
    overlay._rawPanBy(offset);
    overlay.fire('move');
    overlay.fire('moveend');
}).on('zoomend', function () {
    overlay.setView(map.getCenter(), map.getZoom(), true);
    map.fire('move');
});

$(window).resize(function () {
    overlay.setView(map.getCenter(), map.getZoom());
    map.fire('move');
});
map.fire('move');
于 2013-05-10T00:24:58.313 回答