import * as L from '@mapgis/leaflet'
// @link https://github.com/Raruto/leaflet-rotate
/**
* L.Renderer
*/
const rendererProto = L.extend({}, L.Renderer.prototype)
L.Renderer.include({
_updateTransform(center, zoom) {
if (!this._map._rotate || this._map._bearing === 0) {
return rendererProto._updateTransform.call(this, center, zoom)
}
// 更新缩放因子
const scale = this._map.getZoomScale(zoom, this._zoom)
// 计算左上角经纬度在当前层级下的像素偏移值
// 注:计算值为相对于像素原点的偏移
const offset = this._map._latLngToNewLayerPoint(this._topLeft, zoom, center)
if (L.Browser.any3d) {
L.DomUtil.setTransform(this._container, offset, scale)
} else {
L.DomUtil.setPosition(this._container, offset)
}
},
_update() {
// 初始状态较小层级下偏移问题,控制不旋转或this._map._bearing === 0时,默认逻辑
if (!this._map._rotate || this._map._bearing === 0) {
this._topLeft = this._map.containerPointToLatLng(
this._map.getSize().multiplyBy(-this.options.padding)
)
return rendererProto._update.call(this)
}
// Update pixel bounds of renderer container (for positioning/sizing/clipping later)
// Subclasses are responsible of firing the 'update' event.
const p = this.options.padding
const map = this._map
const size = this._map.getSize()
const padMin = size.multiplyBy(-p)
const padMax = size.multiplyBy(1 + p)
/// / TODO: Somehow refactor this out into map.something() - the code is
/// / pretty much the same as in GridLayer.
const clip = new L.Bounds([
map.containerPointToLayerPoint([padMin.x, padMin.y]).floor(),
map.containerPointToLayerPoint([padMin.x, padMax.y]).floor(),
map.containerPointToLayerPoint([padMax.x, padMin.y]).floor(),
map.containerPointToLayerPoint([padMax.x, padMax.y]).floor()
])
// min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();
this._bounds = clip
this._topLeft = this._map.layerPointToLatLng(clip.min)
this._center = this._map.getCenter()
this._zoom = this._map.getZoom()
}
})