首页 > 其他分享 >Openlayers 通过canvas渲染部分地图

Openlayers 通过canvas渲染部分地图

时间:2023-02-14 16:58:28浏览次数:55  
标签:map canvas const 渲染 coords Openlayers evt

效果图

image

实现原理简单描述

Openlayers 图层的渲染大多数都是通过 canvas实现,在图层渲染前后事件中通过canvas控制渲染区域即可实现。

代码

点击查看代码
componentDidMount() {
    this.map = this.mapRef.getMap();
    this.init();
  }

  init = () => {
    let geoJson = new GeoJSON();
    this.creatPolygonClip(this.map, this.mapRef.basicLayer, geoJson.readFeatures(JSON.stringify(mostchinaJson))[0].getGeometry());
  }

  creatPolygonClip = (map, layer, polygonGeometry) => {
    layer.on('prerender', (evt) => {
      const canvas = evt.context;
      canvas.save();
      canvas.beginPath();
      const coords = polygonGeometry.getCoordinates()[0];
      this.createClip_(map, coords, canvas);
      canvas.clip();
    });

    layer.on('postrender', function (evt) {
      const canvas = evt.context;
      canvas.restore();
    });
  }

  createClip_ = (map, coords, canvas) => {
    for (let i = 0, cout = coords.length; i < cout; i++) {
      const screenCoord = map.getPixelFromCoordinate(coords[i]);
      const x = screenCoord[0],
        y = screenCoord[1];
      if (i === 0) {
        canvas.moveTo(x, y);
      } else {
        canvas.lineTo(x, y);
      }
    }
    canvas.closePath();
    canvas.strokeStyle = "rgba(0,0,0,0)";
    canvas.stroke();
  }
给定一个Polygon要素,通过坐标转换获展现在画布的坐标再绘制即可。

小问题

个人测试不能使用 MultiPolygon,所以效果图上其实漏了台湾、海南和南海的地方。
只能用笨办法多渲染几个图层实现效果,如果有更好的方法希望能分享一下。

标签:map,canvas,const,渲染,coords,Openlayers,evt
From: https://www.cnblogs.com/yindan998/p/17120106.html

相关文章

  • Android 中Canvas的save(),saveLayer()和restore()解析
    1、save()方法:用来保存Canvas的状态,save()方法之后的代码,可以调用Canvas的平移、放缩、旋转、裁剪等操作!2、restore()方法:用来恢复Canvas之前保存的状态(可以想成是......
  • vue-day02——插值语法、文本指令、属性指令、事件指令、class和style、条件渲染、列
    目录昨日回顾今日内容1插值语法1.1mvvm演示1.1插值语法2文本指令3属性指令4事件指令5class和style6条件渲染7列表渲染补充:作业昨日回顾#1put,post提交的jso......
  • python canvas画布的介绍
    1、在画布上绘制对象,通常用create_xxxx,xxxx=对象类型。2、每次调用create_xxx,都会返回创建组件的ID,也可以用tag属性指定标签。3、通过调用canvas.move实现一次性动作。实例#......
  • UE4/UE5移动端延迟渲染
    移动端延迟渲染的支持情况①UE4.26不支持OpenGLES,使用4个inputattachments②UE4.27将inputattachments降到了3个,可以支持更多的设备。   另外增加了更多功能......
  • 使用PHP和jq一起渲染页面时,可根据接口返回值改变php渲染的数据状态
    /*收藏院校1-专业2-文章3*//**e:this,当前对象*_id:接口请求所需的id(收藏时传递当前列表的id,取消收藏时传递收藏后的列表id(接口会返回))*_title:'收藏的列表标题'......
  • HTML5 canvas画一个折线图
    <body><canvasid="drawing"style="border:1pxsolid;"width="600"height="400"></canvas><scripttype="text/javascript">letdrawing=document.query......
  • HTML5 canvas基础使用
    <body> <!-- 1,canvas的宽和高要在标签中写,写在style中将会使画布拉伸到指定宽和高,不是真正的宽高。 --> <canvasid='drawing'width="300"height="700"......
  • vue原理:diff、模板编译、渲染过程等
    一、虚拟DOM:因为DOM操作非常消耗性能,在操作DOM时,会出现DOM的回流(Reflow:元素大小或者位置发生改变)与重绘(元素样式的改变)使DOM重新渲染。现在的框架Vue和React很少直接操作......
  • echarts 从后端获取数据,动态渲染图表
    echarts从后端获取数据,动态渲染图表简介echarts的数据是在初始化后setOption中直接填入的,但是很多时候可能数据需要异步加载后再填入。ECharts中实现异步数据的更新非......
  • vue原理:diff、模板编译、渲染过程等
    一、虚拟DOM:因为DOM操作非常消耗性能,在操作DOM时,会出现DOM的回流(Reflow:元素大小或者位置发生改变)与重绘(元素样式的改变)使DOM重新渲染。现在的框架Vue和React很少直接操作......