openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形

效果如图

1、创建openlayer

var map;
var view;
var tileLayer, source, vector;

function init() {
  tileLayer = new ol.layer.Tile({
    source: new ol.source.TileArcGISRest({
      url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
    }) //
  });
  view = new ol.View({
    center: [113, 23],
    projection: 'EPSG:4326',
    zoom: 10
  });
  map = new ol.Map({
    layers: [tileLayer],
    target: 'map',
    view: view
  });


}

2、添加图层和多变形

function addpolygon() {
  var source = new ol.source.Vector({wrapX: false});
  var vector = new ol.layer.Vector({
    source: source,
  });
  map.addLayer(vector);

  var array = [
    [113.0, 23.0],
    [113.5, 23.0],
    [113.5, 23.5],
    [113.0, 23.0]
  ];
  var p = new ol.geom.Polygon([array]);
  var features = new ol.Feature({
    geometry: p,
    name: 'My Polygon',
    names: 'My Polygon'
  });
  source.addFeature(features);


  //ol-ext插件
  let r3D = new ol.render3D({
    style: new ol.style.Style({
      stroke: new ol.style.Stroke({
        color: 'rgba(142,66,66,0.5)',
        width: 1
      }),
      fill: new ol.style.Fill({
        color: 'rgba(12,45,210,0.8)'
      })
    }),
    /** 初始高度 **/
    height: 0.1,
    //ghost: true,
    /** 最大可视分辨率 **/
    maxResolution: 0.1
  })
  vector.setRender3D(r3D)
  r3D.drawFeature3D_ = drawFeature3D_;//重新改写该函数

}

3、改写ol-ext的render3D中的函数

function drawFeature3D_(ctx, build) {
  var i, j, b, k
  // Construct
  var fillStyle=    ctx.fillStyle;
  for (i = 0; i < build.length; i++) {
    switch (build[i].type) {
      case "MultiPolygon": {
        for (j = 0; j < build[i].geom.length; j++) {
          b = build[i].geom[j]
// 绘制侧边渐变墙
          for (k = 0; k < b.length - 1; k++) {
            ctx.beginPath()
            ctx.moveTo(b[k].p0[0], b[k].p0[1])
            ctx.lineTo(b[k].p1[0], b[k].p1[1])
            ctx.lineTo(b[k + 1].p1[0], b[k + 1].p1[1])
            ctx.lineTo(b[k + 1].p0[0], b[k + 1].p0[1])
            ctx.lineTo(b[k].p0[0], b[k].p0[1])
            var m = [(b[k].p0[0] + b[k + 1].p0[0]) / 2, (b[k].p0[1] + b[k + 1].p0[1]) / 2]
            var h = [b[k].p0[1] - b[k + 1].p0[1], -b[k].p0[0] + b[k + 1].p0[0]]
            var c = ol.coordinate.getIntersectionPoint(
              [m, [m[0] + h[0], m[1] + h[1]]],
              [b[k].p1, b[k + 1].p1]
            )
            var gradient = ctx.createLinearGradient(
              m[0], m[1],
              c[0], c[1]
            )
            //设置渐变色带
            gradient.addColorStop(0, 'rgba(220,29,29,0.5)')
            gradient.addColorStop(0.2, 'rgba(220,29,29,0.5)')
            gradient.addColorStop(0.4, 'rgba(45,222,180,0.5)')
            gradient.addColorStop(0.6, 'rgba(219,194,36,0.5)')
            gradient.addColorStop(0.8, 'rgba(193,36,227,0.5)')
            gradient.addColorStop(1, 'rgba(20,92,238,0.5)')
            ctx.fillStyle = gradient
            ctx.fill()
          }
        }
        break
      }
      case "Point": {
        var g = build[i].geom
        ctx.beginPath()
        ctx.moveTo(g.p0[0], g.p0[1])
        ctx.lineTo(g.p1[0], g.p1[1])
        ctx.stroke()
        break
      }
      default: break
    }
  }

  // Roof
     ctx.fillStyle=fillStyle;

  for (i = 0; i < build.length; i++) {
    switch (build[i].type) {
      case "MultiPolygon": {
        ctx.beginPath()
        for (j = 0; j < build[i].geom.length; j++) {
          b = build[i].geom[j]
          if (j == 0) {
            ctx.moveTo(b[0].p1[0], b[0].p1[1])
            for (k = 1; k < b.length; k++) {
              ctx.lineTo(b[k].p1[0], b[k].p1[1])
            }
          } else {
            ctx.moveTo(b[0].p1[0], b[0].p1[1])
            for (k = b.length - 2; k >= 0; k--) {
              ctx.lineTo(b[k].p1[0], b[k].p1[1])
            }
          }
          ctx.closePath()
        }
        ctx.fill("evenodd")
        ctx.stroke()
        break
      }
      case "Point": {
        b = build[i]
        var t = b.feature.get('label')
        if (t) {
          var p = b.geom.p1
          var f = ctx.fillStyle
          ctx.fillStyle = ctx.strokeStyle
          ctx.textAlign = 'center'
          ctx.textBaseline = 'bottom'
          ctx.fillText(t, p[0], p[1])
          var m = ctx.measureText(t)
          var h = Number(ctx.font.match(/\d+(\.\d+)?/g).join([]))
          ctx.fillStyle = "rgba(255,255,255,0.5)"
          ctx.fillRect(p[0] - m.width / 2 - 5, p[1] - h - 5, m.width + 10, h + 10)
          ctx.strokeRect(p[0] - m.width / 2 - 5, p[1] - h - 5, m.width + 10, h + 10)
          ctx.fillStyle = f
          //console.log(build[i].feature.getProperties())
        }
        break
      }
      default: break
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/587205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法:双指针题目练习

目录 题目一&#xff1a;移动零 题目二&#xff1a;复写零 题目三&#xff1a;快乐数 题目四&#xff1a;盛最多水的容器 题目五&#xff1a;有效三角形的个数 题目六&#xff1a;和为s的两个数字(剑指offer) 题目七&#xff1a;三数之和 题目八&#xff1a;四数之和 常…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言&#xff1a;在练习CSS排版的时候&#xff0c;我们经常会遇到一些排版上的问题&#xff0c;那么我们如何去解决这些问题呢&#xff1f;本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【Windows,亲测有效】手动激活Sublime Text

前言 Sublime Text 是一款非常好用的文本编辑器&#xff0c;但是免费版时不时会跳弹窗 本方法无毒无害&#xff0c;简单易上手 2023/12/22 更新&#xff1a;实测从 4143 支持到 4169 开始 先确保你用的是官方版本的 Sublime Text&#xff0c;还没下的可以去官方下载&#…

题目 2671: 推导部分和

题目描述: 对于一个长度为 N 的整数数列 A1, A2, AN&#xff0c;小蓝想知道下标 l 到 r 的部分和 是多少&#xff1f; 然而&#xff0c;小蓝并不知道数列中每个数的值是多少&#xff0c;他只知道它的 M 个部分和的值。其中第 i 个部分和是下标 li 到 ri 的部分和 &#xf…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是&#xff1a;加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

LiveCD镜像文件的定制化

最近想要定制化一款属于自己的LiveCD镜像文件&#xff0c;并且里边封装好所需要的软件程序&#xff0c;本文将会记录具体的操作步骤&#xff0c;供有需要的人参考借鉴。 环境说明&#xff1a; 环境配置说明配置参数编码环境Centos7.9LiveCD文件CentOS-7-livecd-x86_64.iso 附…

基础安全:CSRF攻击原理与防范

CSRF的概念 CSRF(Cross-Site Request Forgery)中文名为“跨站请求伪造”。这是一种常见的网络攻击手段,攻击者通过构造恶意请求,诱骗已登录的合法用户在不知情的情况下执行非本意的操作。这种攻击方式利用了Web应用程序中用户身份验证的漏洞,即浏览器在用户完成登录后会自…

2024 华东杯高校数学建模邀请赛(B题)| 自动驾驶转弯问题 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;以偏微分方程&#xff0c;中心驱动等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&…

计算机毕业设计python_django宠物领养系统z6rfy

本宠物领养系统主要包括两大功能模块&#xff0c;即管理员模块、用户模块。下面将对这两个大功能进行具体功能需求分析。 &#xff08;1&#xff09;管理员&#xff1a;管理员登录后主要功能包括个人中心、用户管理、送养宠物管理、地区类型管理、失信黑名单管理、申请领养管理…

第12章 软件测试基础(第二部分)

四、测试策略 &#xff08;一&#xff09;概念 测试策略指在一定软件测试标准、测试规范的指导下&#xff0c;依据测试项目的特定环境而规定测试原则和方法的一个集合。 &#xff08;二&#xff09;方法 基于分析的策略基于模型的策略基于标准规范的策略基于自动化的回归测…

2023蓝桥杯学习与刷题建议

前两天天给你们组了队&#xff0c;经过两天发现各位都有这样的问题&#xff1a; 不愿意交流。小组不会规划刷题计划。可能是因为没有人带头和具体刷题计划&#xff0c;所以都处于迷茫&#xff0c;不交流、不刷题。还有可能是大家都不认识&#xff0c;都比较羞涩。同时也有我个…

冯喜运:5.1国际黄金今日行情还会跌吗?黄金原油独家行情分析

【黄金消息面分析】&#xff1a;周三(5月1日)亚市盘中&#xff0c;现货黄金在昨日暴跌近50美元后继续承压&#xff0c;金价目前位于2285美元/盎司附近。FXStreet首席分析师Valeria Bednarik撰文&#xff0c;对黄金技术前景进行分析。Bednarik写道&#xff0c;现货黄金周二面临强…

主营产品需求旺盛,三清互联业绩稳定提升

在全球能源结构转型的大背景下&#xff0c;作为技术创新型的国内知名电力物联网关键技术、核心智能设备和服务提供商&#xff0c;三清互联以卓越技术在业内取得了显著的成绩。公司的主营业务收入主要集中在智能配电终端、智能中高压电气设备和低压电气成套设备三大类产品上&…

Linux内核之虚拟内存区域页分配:alloc_pages_vma用法实例(六十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

ESP32 和 Arduino 之间建立蓝牙连接

ESP32 和 Arduino Uno 可以通过蓝牙进行通信。为此&#xff0c;您必须使用与 Arduino 兼容的蓝牙模块。我们将使用 HC-05&#xff08;06&#xff09; 蓝牙模块。 连接Arduino Uno和HC-05蓝牙模块 将 HC-05 蓝牙模块连接到 Arduino 板。将模块的VCC、GND、RX、TX引脚连接到Ard…

1.4 Java全栈开发前端+后端(全栈工程师进阶之路)-前置课程java基础语法、java面向对象编程

Java核心语法&#xff1a; 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。…

目前全球各类遥感卫星详细介绍

一、高分一号 高分一号&#xff08;GF-1&#xff09;是中国高分辨率对地观测系统重大专项&#xff08;简称高分专项&#xff09;的第一颗卫星。“高分专项”于2010年5月全面启动&#xff0c;计划到2020年建成中国自主的陆地、大气和海洋观测系统。 高分一号&#xff08;GF-1&…

Open Life Science AI (OLSA)

文章目录 关于 Open Life Science ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/16d93b633c8442cc93ee6433ceea38e9.png 500x)关于 Open Life Science AI 关于 Open Life Science Open Life Science 是一个非营利组织。 官网&#xff1a; https://openlifesci…

实习面试算法准备之图论

这里写目录标题 1 基础内容1.1 图的表示1.2图的遍历 2 例题2.1 所有可能的路径2.2 课程表&#xff08;环检测算法&#xff09;2.2.1 环检测算法 DFS版2.2.2 环检测算法 BFS版 2.3 课程表 II &#xff08;拓扑排序算法&#xff09;2.3.1 拓扑排序 DFS版 1 基础内容 图没啥高深的…

【分布式通信】NPKit,NCCL的Profiling工具

NPKit介绍 NPKit (Networking Profiling Kit) is a profiling framework designed for popular collective communication libraries (CCLs), including Microsoft MSCCL, NVIDIA NCCL and AMD RCCL. It enables users to insert customized profiling events into different C…