MapTalks地图滤镜使用

背景

    最近看到ArcGIS Maps SDK for JavaScript官网有个聚焦效果的例子,于是想在MapTalks上也试试。

屏幕截图 2023-03-05 102128.png

原理

    滤镜的原理主要是用的canvas的cssfilter属性,让它整体有模糊或者高亮的功能。另外高亮区域使用的是canvas的裁剪。

方案一

    使用maptalks原生api,对底图进行模糊和蒙版操作,由于这里要两种滤镜,所以需要有两个底图方便处理,一个进行模糊处理,一个设置蒙版。

设置模糊滤镜效果

var map = new maptalks.Map('map', {
  center:     [109.191369116306319, 19.736612649767874],
  zoom:  16,
  pitch : 0,
  dragPitch:false,
  baseLayer :  new maptalks.TileLayer('tile1', {
    urlTemplate: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
    cssFilter : 'blur(10px)  grayscale(1.2)',
  })
});

    设置模蒙版和高亮滤镜效果

var boundary = [ [ [ 109.191369116306319, 19.736612649767874 ], [ 109.191347658634214, 19.736794423924326 ], [ 109.19259220361711, 19.736531861187487 ], [ 109.195274412632031, 19.735562395035053 ], [ 109.209500849247036, 19.730068642352247 ], [ 109.209565222263379, 19.72653395894347 ], [ 109.209264814853711, 19.726453165265738 ], [ 109.209028780460415, 19.726069394738637 ], [ 109.203707277774839, 19.726089593210407 ], [ 109.203664362430601, 19.726594554174969 ], [ 109.202827513217969, 19.727099513543749 ], [ 109.201840460300488, 19.728028634612741 ], [ 109.2000594735146, 19.728715372799819 ], [ 109.195961058139844, 19.730270621899336 ], [ 109.192656576633482, 19.731401702643819 ], [ 109.192999899387388, 19.731745064856661 ], [ 109.192849695682554, 19.732048030902128 ], [ 109.192163050174742, 19.73196724001286 ], [ 109.191154539585142, 19.732674158908559 ], [ 109.19169098138812, 19.735461408639065 ], [ 109.191369116306319, 19.736612649767874 ] ] ]
var mask = new maptalks.Polygon(boundary, {
  'symbol' : [
    {

      'polygonOpacity': 1,
      'polygonFill': 'rgb(0,0,0)',
      'lineColor': 'rgb(0,0,0)',
      'lineWidth': 1,
    }
  ]
});

var maskedLayer = new maptalks.TileLayer('tile2', {
  zIndex:100,
  urlTemplate: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
  cssFilter : 'drop-shadow(0px 0px 20px  black) brightness(1.0)',
})
  .setMask(mask) // set boundary as the mask to the tilelayer
  .addTo(map);

    由于底图的drop-shadow滤镜效果不太明显,需要绘制一个vectorlayer

var outline = new maptalks.Polygon(boundary, {
  'symbol' : [
    {
      'polygonOpacity': 1,
      'polygonFill': 'rgb(0,0,0)',
      'lineColor': 'rgb(0,0,0)',
      'lineWidth': 1,
    }
  ]
});
new maptalks.VectorLayer('v', [outline],{
  enableSimplify:false,
  cssFilter : 'drop-shadow(-6px -6px 16px  black)',
  }
).addTo(map);

    优点:二三维均可使用,图形绘制简单。缺点:一个图层使用cssfilter影响过大

方案二

    使用底图监听绘制事件,绘制完成以后,通过canvas上下文获取到图片,对图片进行上述模糊蒙版高亮等处理。

 function onRenderEnd(e) {
   console.time('draw')
 
   // map's canvas context
   var ctx = e.context;
   ctx.filter= 'drop-shadow(-6px -6px 16px black)';
   var c=ctx.canvas;
   var imgData=ctx.getImageData(0,0,c.width,c.height);
   ctx.drawImage(createBg(imgData, c.width,c.height,'blur(10px) '),0,0);
   ctx.drawImage(createMagCircle(imgData,c.width,c.height,boundary), 0, 0);
   console.timeEnd('draw')
 }

 map.on('renderend', onRenderEnd);

    新建canvas,转换坐标后绘制图形,接着绘制当前底图图片,返回canvas元素

function createMagCircle(imageData,width,height,coords) {
  var magImg = document.createElement('canvas');
  var magCircle = document.createElement('canvas');
  //console.log(sw,sh)
  magImg.width = magCircle.width =width
  magImg.height =  magCircle.height = height
  magImg.getContext('2d').putImageData(imageData, 0, 0);
  var ctx = magCircle.getContext('2d');
  ctx.beginPath();
  for(let i=0;i<coords[0].length;i++){
    var center = new maptalks.Coordinate(coords[0][i]);
    let  containerPoint = map.coordinateToContainerPoint(center).round();
    let cx = containerPoint.x
    let cy = containerPoint.y
    if(i==0){
      ctx.moveTo(cx,cy);
    }else{
      ctx.lineTo(cx,cy);
    }
  }
  ctx.stroke();
  ctx.clip();
  ctx.drawImage(magImg, 0, 0);
  return magCircle;
}

    新建canvas元素,绘制绘制当前底图图片,进行模糊滤镜处理

function createBg(imageData, width,height,cssfilter) {
  var magImg = document.createElement('canvas');
  var magCircle = document.createElement('canvas');

  magImg.width =width
    magImg.height = height
      magCircle.width = width
        magCircle.height = height;
  magImg.getContext('2d').putImageData(imageData, 0, 0);

  var ctx = magCircle.getContext('2d');
  ctx.filter= cssfilter
  ctx.drawImage(magImg, 0, 0);

  return magCircle;
}

    优点:只要一个地图并且不用再绘制vectorlayer。缺点:只能二维使用,三维没有处理所以不可用,图形绘制处理比较复杂需要知道一些canvas知识

效果

屏幕截图 2023-03-05 101534.png
屏幕截图 2023-03-05 101741.png

参考资料:

ArcGIS Maps SDK for JavaScript滤镜例子

css滤镜使用文档

滤镜使用文档

地图放大镜

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容