webgis原理剖析系列-以openlayers为例 -03以 canvas来绘制地图,并绘制到固定的区域

上一节写到用canvas来绘制地图,但是没有画成与demo一致的效果。起初观察感觉是用的padding或者margin什么的。后来看代码发现canvas的宽高与map承载元素的宽高相同。因此学习了如何用js来获取元素的宽高,并赋值给canvas。为了让元素居中,动态计算canvas的绘制点,并实现了在横轴方向上的重复。(这里即可开放一个参数,是否重叠绘制,也就是warpX)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Using Parcel with OpenLayers</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #map {
            width: 100%;
            height: 800px;
            overflow: hidden;
        }
    </style>
</head>
<body>
<div id="map"></div>

<script >
    var oDiv=document.getElementById("map")

    var disTop=(oDiv.offsetHeight-256*1)/2
    //oDiv.style.paddingTop=disTop
    //console.log()
    var canvas = document.createElement('canvas');
    oDiv.appendChild(canvas);
    canvas.id="myCanvas"
   // console.log(oDiv.getBoundingClientRect().width)
    canvas.width=oDiv.getBoundingClientRect().width
    canvas.height=oDiv.getBoundingClientRect().height
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    var img = new Image();
    img.src = "https://c.tile.openstreetmap.org/0/0/0.png";
    console.log(disTop)
    img.onload = function(){
        for(let i=0;i<=canvas.width/256;i++){
            ctx.drawImage(img,i*256, disTop);
        }

    };

</script>
</body>
</html>

实际的效果有一点差异,就是在缩小窗口后,再刷新网页,再放大网页,右边的部分没有绘制,因此我们需要监听窗口是否变化这个事件,每次改变都重新计算宽高,并重新绘制。下一节考虑在vue中进行开发了,因为双向绑定可以取消很多逻辑判断。

webgis原理剖析系列-以openlayers为例 -03以 canvas来绘制地图,并绘制到固定的区域

 

监听窗口改变事件,进行重新设置canvas的宽高,再进行重绘。

window.onresize = function(){
    canvas.width=oDiv.getBoundingClientRect().width
    canvas.height=oDiv.getBoundingClientRect().height
    for(let i=0;i<=canvas.width/256;i++){
        ctx.drawImage(img,i*256, disTop);
    }
}

本来想着可能会在一个区域重复绘制,但是实际上canvas再重新绘制时,

将之前绘制的图片清空了。因为由于canvas每当高度或宽度被重设时,画布内容就会被清空。因此不用再刻意去清空了