• OpenaLayer学习之图层探查


    等待是最痛苦的事,有时候真的很迷茫,这学上的怀疑人生,这辈子遇见对的人真的很关键,唉,废话不说了开车,开车

    一、图层探查是一个功能型的小插件,当map加载多个图层的时候,有的图层被覆盖掉了,我们如果想看到图层就可以通过探查图层小插件,相当于将上面的图层裁剪一块。

    二、实现思路主要的运用图层的事件(precompose: 准备渲染,未渲染。postrender: 渲染全部结束。)

    三、图层代码

                //天地图底图
                var source =new ol.source.XYZ({
                    url: "http://t4.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}"
                });
                var tileLayer =new  ol.layer.Tile({
                    title:"天地图",
                    source:source
                });
                //标注图层
                var sourceMark = new ol.source.XYZ({ url: 'http://t3.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}' });
                var tileMark = new ol.layer.Tile({
                    title:"标注图层",
                    source: sourceMark,
                    
                });
                //卫星图像
                var sourceSatellite = new ol.source.XYZ({ url: 'http://t3.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}' });
                var tileSatellite = new ol.layer.Tile({
                    title: "卫星图",
                    source:sourceSatellite
    
                });
                map = new ol.Map({
                    layers: [
                        tileLayer,
                        tileMark,
                        tileSatellite
    
                    ],
                    view: new ol.View({
                        zoom: 11,
                        center:ol.proj.transform( [116.40769, 39.89945], 'EPSG:4326', 'EPSG:3857')
                    }),
                    

    四、事件驱动(注意是给那个图层添加的事件,这里ttileLayer在最上层,tileSatellite被覆盖)

    //图层探查
                var radius = 75;//圆的半径
                //通过keydown 事件实现在键盘上通过Up和Down按键改变圆的半径
                $(document).keydown(function (evt) {
                    //按键事件无论,元素是否得到焦点都会被触发
                    if (evt.which==38) {
                        //指示按了那个键,或按钮,当按下Up键时半径扩大五个像素,最大半径150
                        radius = Math.min(radius + 5, 150);
                        map.render();//渲染地图
    
                    }
                    if (evt.which == 40) {
                        //指示按了那个键,或按钮,当按下Down键时半径减小五个像素,最小半径25
                        radius = Math.min(radius -5, 25);
                        map.render();//渲染地图(重新刷新的意思)
                    }
                    
                });
                //在每次鼠标发生移动时获取当前像素的位置
                var mousePosition = null;
                //通过on方法为地图视图绑定mousemove与mouseout事件
                $(map.getViewport()).on('mousemove', function (evt) {
                    //获取当前鼠标位置的像素
                    mousePosition = map.getEventPixel(evt.originalEvent);
                    map.render();
    
                }).on('mouseout', function () {
                    mousePosition = null;//鼠标移走将该点的坐标清零
                    map.render();
                });
                //在影像图层绘制(渲染)前进行一部分裁剪
                tileSatellite.on('precompose', function (event) {
                    var ctx = event.context;//影像图层画布
                    var pixelRatio = event.frameState.pixelRatio; //像素比
                    ctx.save();
                    ctx.beginPath();
                    if (mousePosition) {
                        // 只显示以鼠标当前位置为圆心的一个圆圈
                        ctx.arc(mousePosition[0] * pixelRatio, mousePosition[1] * pixelRatio,
                            radius * pixelRatio, 0, 2 * Math.PI); //设置画布区域为一个圆
                        ctx.lineWidth = 5 * pixelRatio;  //圆边框的宽,设置为5个像素单位
                        ctx.strokeStyle = 'rgba(0,0,0,0.5)'; // 圆边框样式(颜色)
                        ctx.stroke();
                    }
                    ctx.clip();//裁剪画布
                });
                // 影像图层绘制后还原画布背景( the canvas context)
                tileSatellite.on('postcompose', function (event) {
                    var ctx = event.context;
                    ctx.restore();//还原画布
                    //postcompose:地图渲染中。
                    //precompose: 准备渲染,未渲染。
                    //postrender: 渲染全部结束。
                })

    至于那个画布问题,看不懂的可以看看HTML5中的canvas特性标签

    五、效果

    六、总结,代码很少,也很简单,参考了郭明强的书,生命不息,学习不止

  • 相关阅读:
    JVM
    Java并发II
    Nlpir大数据知识图谱的落地指南
    灵玖软件:NLPIR大数据提供智能挖掘技术方案
    灵玖软件:NLPIR大数据中文挖掘平台为各个行业赋能
    NLPIR大数据从分词到知识图谱展现智能实现
    纠文网为毕业论文智能修改内容格式
    纠文网论文智能核查融合人工智能和规则技术
    纠文网智能论文修改融合人工智能和规则知识技术
    纠文网智能语义自动解决毕业论文内容格式难题
  • 原文地址:https://www.cnblogs.com/tuboshu/p/10752367.html
Copyright © 2020-2023  润新知