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

news2024/11/18 5:35:46

使用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.coloradmin.cn/o/1637335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 远程debug

java -agentlib:jdwptransportdt_socket,servery,suspendn,address50050 -Xmx1536m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./ -jar ${JAR_NAME} >/dev/null 2>&1 &参数说明 -agentlib:jdwptransportdt_socket,servery,suspendn,address50050: 这个参数…

Linux:使用匿名管道对进程池的模拟实现

目录 一、Makefile 二、processpool.cc 2.1创建通信管道和子进程 2.2控制子进程 2.3回收进程 三、task.hpp 四、完整代码 接下来我们将模拟实现一个进程池&#xff0c;进程池广泛应用与各个领域和方向&#xff0c;比如我们打开电脑后同时打开很多个进程&#xff08;也就是软…

python公务用车医院校园企业车辆管理系统

本 Python版本&#xff1a;python3.7 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask都有,都支持 后端&#xff1a;python 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 公务用车管理智慧云服务监管平台有管理员和用户…

托普利兹矩阵(T矩阵)及其应用(Matlab demo测试)

托普利兹矩阵&#xff08;T矩阵&#xff09;及其应用&#xff08;Matlab demo测试&#xff09; 1. 概念2. Matlab简单测试2.1 生成测试2.2 基本性质及原理2.3 性质验证 3. 其他应用总结3.1 其他性质3.2 文献阅读看到的 参考资料 1. 概念 托普利兹矩阵&#xff0c;简称为T型矩阵…

O2OA开发平台前端源码级二次开发(Vue3,React)

在使用O2OA进行项目定制化开发时&#xff0c;我们可以开发新的前端组件&#xff08;x_component&#xff09;以扩展O2OA来实现更多的业务。这种新增前端组件或者前端业务的开发通常会配合后端自定义应用实现的服务来完成系统内数据的交互。在当系统默认的界面不符合系统UI/UE设…

Sentinel 控制台学习

引言 上篇文章已经讲过 SpringCloud Sentinel集成到微服务项目中&#xff0c;接下来我们继续学习怎么使用sentinel控制台对微服务进行限流&#xff0c;熔断&#xff0c;降级等一系列操作。 控制台 接下来我们单独讲解每一个菜单按钮 实时监控 实时监控&#xff1a; 可以看到…

Leetcode 145:二叉树的后序遍历(迭代法)

给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 思路&#xff1a; 迭代法的思路是&#xff0c;使用栈&#xff0c;一层一层的将树节点遍历入栈。 比如下面这个树&#xff0c;使用迭代法&#xff0c;1&#xff09;第一层&#xff0c;让根节点入栈。2&a…

2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛A题&#xff08;东三省数学建模竞赛A题&#xff0…

2024五一杯数学建模A题思路分析-钢板最优切割路径问题

文章目录 1 赛题选题分析 2 解题思路3 最新思路更新 1 赛题 A题 钢板最优切割路径问题 提高钢板下料切割过程中的工作效率&#xff0c;是模具加工企业降低成本和增加经济效益的重要途径&#xff0c;其中钢板切割的路径规划是钢板切割过程的一个关键环节。 钢板切割就是使用特殊…

附录6-1 黑马优购项目-组件与过滤器

目录 1 过滤器-格式化价格 2 组件-搜索框 3 组件-数量框 4 组件-商品概况 4.1 格式化价格 4.2 选择性使用勾选框和数量框 4.3 源码 1 过滤器-格式化价格 这个项目中仅用到格式化价格这一种过滤器。过滤器文件位置为store/filter.wxs 文件内容是这样的&#xf…

【嵌入式DIY实例】-植物自动浇水机

DIY自动植物浇水机 文章目录 DIY自动植物浇水机1、硬件准备与接线2、代码实现智能灌溉系统是一种先进的、新技术的灌溉技术,可以减少人力、时间等。在本文中,将介绍如何实现一个植物自动浇水机。通过这个项目,可以给我们身边的一些植物,所有花盆都安装这一系统。这个系统由…

【JavaEE初阶系列】——理解tomcat 带你实现最简单的Servlet的hello world程序(七大步骤)

目录 &#x1f6a9;认识Tomcat &#x1f6a9;运用Tomcat &#x1f6a9;Servlet &#x1f393;完成简单的Servlet的hello world程序 &#x1f388;创建项目Maven &#x1f388;引入依赖 &#x1f388;创建目录 &#x1f388;编写代码 &#x1f388;打包程序 &#x1…

关于用户体验和设计思维

介绍 要开发有效的原型并为用户提供出色的体验&#xff0c;了解用户体验 (UX) 和设计思维的原则至关重要。 用户体验是用户与产品、服务或系统交互并获得相应体验的过程。 设计思维是一种解决问题的方法&#xff0c;侧重于创新和创造。 在启动期实现用户体验和设计思维时&#…

头歌:SparkSQL简单使用

第1关&#xff1a;SparkSQL初识 任务描述 本关任务&#xff1a;编写一个sparksql基础程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1. 什么是SparkSQL 2. 什么是SparkSession。 什么是SparkSQL Spark SQL是用来操作结构化和半结构化数据的接口。…

Tuxera NTFS使用教程 轻松实现磁盘格式转换的教程分享 ntfsMac软件怎么用

NTFS for Mac是Mac电脑里非常重要的工具之一&#xff0c;因为它太实用了&#xff0c;解决了NTFS移动硬盘在Mac上的写入问题。但是&#xff0c;小伙伴在安装完软件之后&#xff0c;通常再也不会关注它&#xff0c;甚至时间长了&#xff0c;也就忘了Mac里还有这么一个软件。 在Tu…

GB32960解析工具

几年前搞了一个用Qt开发的国标32960报文解析工具。分享给大家&#xff0c;只用1积分便可以下载。 国标32960新能源车协议解析工具资源-CSDN文库

(附源码)超级简单的SSM图书交易系统,包含技术栈、架构图、设计图、教程

先看首页效果&#xff0c;包含买家、卖家、管理员三个端口。启动有问题可以联系我解决&#xff0c;微信&#xff1a;keepgoing4u 架构图&#xff1a; 用到软件 Jdk1.8 Mysql IntelliJ IDEA Maven 项目技术&#xff1a; Spring Boot SSM JSP mybatis Maven B/S模式 配置…

云服务器的主要用途有哪些,使用云服务器具有哪些方面的优势

随着科技的飞速发展&#xff0c;云计算已经成为现代企业和个人用户不可或缺的技术支持&#xff0c;云计算技术已经逐渐渗透到我们生活的方方面面。云服务器作为云计算的核心组成部分&#xff0c;正在逐步改变我们的数据存储和处理方式&#xff0c;成为各类互联网用户实现综合业…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐初始化npm项目&#x1f496;type为module&#x1f496;rollup.config.js ⭐封装fmp耗时计算的class&#x1f496;npm build打包class对象 ⭐发布npm的beta版本&#x1f496; npm发布beta版本 ⭐安装web-performance-tool的beta版本…

2024年第二十一届 五一杯 (B题)大学生数学建模挑战赛 | 最大流问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 第一个问题…