基于arcgis api的图层透镜

本文分享了使用OpenLayers和ArcGIS JS API实现影像图层透镜效果的方法。通过自定义canvas画布裁剪,作者详细介绍了如何在地图上创建一个可交互的透镜效果,包括事件监听和实时渲染调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了别人用openlayers写的透镜,还有一个别人用arcgis js api写的透镜(他写的实在是看不懂,一个注释都没有)。所以我自己写了一个。
思路是这样的:我这里用的是RasterLayer影像图层,影像图层的绘制原理是一个canvas画布,我们要做的就是根据自己的需要裁剪这个画布。
第一步,先是获取画布

var ctx = lingbeiCluster.getContext ();

第二步,注册事件,写个按钮,点击按钮激活map的mouse-down事件并裁剪图层,mouse-up的时候重新刷新图层,恢复原样。(其实可以写成随鼠标移动而裁剪,但是影像图层的渲染是比较耗内存的不建议这样做);

 onkeydown = function (event) {//控制r大小
                if (event.keyCode == 87) {
                    radius += 2
                    if (radius > 200) {
                        radius = 200
                    }
                }
                if (event.keyCode == 83) {
                    radius -= 2;
                    if (radius < 30) {
                        radius = 30
                    }
                }
                if (event.keyCode == 27) {//esc退出
                    mUse = - 1                    
                     map.enableClickRecenter ();
                    map.enableDoubleClickZoom ();
                    map.enableKeyboardNavigation ();
                    map.enableMapNavigation ();
                    map.enablePan ();
                    map.enablePinchZoom ();
                    map.enableRubberBandZoom ();
                    map.enableScrollWheel ();
                    map.enableScrollWheelPan ();
                    map.enableShiftDoubleClickZoom ();
                    }
 var radius = 50; //透镜半径
            var mUse = 0;//设置mousedown事件是否执行
            on ( dom.byId ( 'layerspy' ), 'click', function () {
                mUse = 1
                radius = 50;
                lingbeiCluster1.hide ();
                resultLayer.hide ();
                map.infoWindow.hide ();
                map.disableClickRecenter ()
                map.disableDoubleClickZoom ();
                map.disableKeyboardNavigation ();
                map.disableMapNavigation ();
                map.disablePan ();
                map.disablePinchZoom ();
                map.disableShiftDoubleClickZoom ();
                map.disableRubberBandZoom ();
                map.disableScrollWheel ();
                map.disableScrollWheelPan ();


            } );//图层透镜
            map.on ( 'mouse-down', function (evt) {

                if (mUse == 1) {

                    var ctx = lingbeiCluster.getContext ();

                    function clearArc(x, y, radius) {//圆心(x,y),半径radius
                        var calcWidth = radius - stepClear;
                        var calcHeight = Math.sqrt ( radius * radius - calcWidth * calcWidth );

                        var posX = x - calcWidth;
                        var posY = y - calcHeight;

                        var widthX = 2 * calcWidth;
                        var heightY = 2 * calcHeight;

                        if (stepClear <= radius) {
                            ctx.clearRect ( posX, posY, widthX, heightY );
                            //ctx.fillStyle = "rgba(0,0,0,0.3)"
                            //ctx.globalAlpha = 0.5
                            //ctx.fill();
                            stepClear += 1;
                            clearArc ( x, y, radius );
                        }
                    }

                    var stepClear = 1;//别忘记这一步
                    var sX = evt.clientX
                    var sY = evt.clientY;
                    clearArc ( sX, sY, radius );
                } else {

                }
            } )
            map.on ( 'mouse-up', function (evt) {
                if (mUse == 1) {

                    lingbeiCluster.refresh ();
                } else {
                }

            } )

实际效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值