三十八、openlayers官网示例Earthquakes with custom symbols——将矢量数据渲染为自定义图形

使用web地图API访问地图服务 相关学习文档官网 阅读详情

官网demo地址:

Earthquakes with custom symbols 

上一篇我们使用星星表示了地震数据,能绘制星星图形主要依靠 openlayers中的RegularShape类,那如果想要绘制自定义图形该怎么写呢,这篇提供了解决方案。

const vector = new VectorLayer({
      source: new VectorSource({
        url: "https://openlayers.org/en/latest/examples/data/kml/2012_Earthquakes_Mag5.kml",
        format: new KML({
          extractStyles: false,
        }),
      }),
      style: styleFunction,
    });

依然是通过样式函数styleFunction设置图形。

styleCache做了一个缓存,以免每次都要重新生成。

从feature中获取自定义属性地震等级大小name决定图形大小。

 const styleFunction = function (feature) {
      const name = feature.get("name");
      const magnitude = parseFloat(name.substr(2));
      const size = parseInt(10 + 40 * (magnitude - 5), 10);
      scale = size / 10;
      let style = styleCache[size];
      if (!style) {
        
        styleCache[size] = style;
      }
      return style;
    };

symbol 是一个坐标数组,定义了一个多边形的形状。scaleFunction 根据当前的缩放比例 scale 对每个坐标进行缩放。

    const symbol = [
      [0, 0],
      [4, 2],
      [6, 0],
      [10, 5],
      [6, 3],
      [4, 5],
      [0, 0],
    ];
    let scale;
    const scaleFunction = function (coordinate) {
      return [coordinate[0] * scale, coordinate[1] * scale];
    };

    new Polygon([symbol.map(scaleFunction)])

 修改后的某一个图形的坐标数组:

如果不修改会怎样?

如果使用缩放前的坐标,每个图形会是一样大的。

vectorContext.drawGeometry(new Polygon([symbol]));

 

在一个新的 HTML canvas 元素上绘制一个多边形,并使用这个 canvas 作为图标图像,然后创建一个样式对象。

const canvas = document.createElement("canvas");
        const vectorContext = toContext(canvas.getContext("2d"), {
          size: [size, size],
          pixelRatio: 1,
        });
        vectorContext.setStyle(
          new Style({
            fill: new Fill({ color: "rgba(255, 153, 0, 0.4)" }),
            stroke: new Stroke({ color: "rgba(255, 204, 0, 0.2)", width: 2 }),
          })
        );
        vectorContext.drawGeometry(new Polygon([symbol.map(scaleFunction)]));
        style = new Style({
          image: new Icon({
            img: canvas,
            rotation: 1.2,//设置图标的旋转角度为 1.2 弧度。
          }),
        });

toContext方法获取Canvas 的 2D 渲染上下文,使我们可以使用 OpenLayers 的矢量绘图功能在 Canvas 上绘制图形。比如setStyle、drawGeometry等方法。如果不使用toContext方法则需要使用原生canvas的方法绘制图形 

var context2D = canvas.getContext("2d");
context2D.fillStyle = "rgba(255, 153, 0, 0.4)";
context2D.fillRect(0, 0, 50, 50);

 小细节:

[symbol.map(scaleFunction)]生成出来的坐标数组并不是每个图形相对于整个canvas画布的坐标数组。而是相对于每个feature生成的画布的坐标数组。也就是说这个图形的坐标数组和feature的坐标是不一样的。它是在每个feature上再绘制了一个图形。

 

 原本的feature是已经存在的只不过没有给样式所以显示不出来,这个数组源给的是点坐标,如果在这个函数里返回一个普通的圆圈的样式页面会是这样:

// 测试代码;
      style = new Style({
        image: new CircleStyle({
          radius: 20,
          fill: new Fill({
            color: "red",
          }),
        }),
      });
      return style;

完整代码:

<template>
  <div class="box">
    <h1>Earthquakes Heatmap</h1>
    <div id="map"></div>
  </div>
</template>

<script>
import KML from "ol/format/KML.js";
import Map from "ol/Map.js";
import Polygon from "ol/geom/Polygon.js";
import StadiaMaps from "ol/source/StadiaMaps.js";
import VectorSource from "ol/source/Vector.js";
import View from "ol/View.js";
import { Fill, Icon, Stroke, Style, Circle as CircleStyle } from "ol/style.js";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer.js";
import { toContext } from "ol/render.js";
export default {
  name: "",
  components: {},
  data() {
    return {
      map: null,
    };
  },
  computed: {},
  created() {},
  mounted() {
    const symbol = [
      [0, 0],
      [4, 2],
      [6, 0],
      [10, 5],
      [6, 3],
      [4, 5],
      [0, 0],
    ];
    let scale;
    const scaleFunction = function (coordinate) {
      return [coordinate[0] * scale, coordinate[1] * scale];
    };

    const styleCache = {};
    const styleFunction = function (feature) {
      const name = feature.get("name");
      const magnitude = parseFloat(name.substr(2));
      const size = parseInt(10 + 40 * (magnitude - 5), 10);
      scale = size / 10;
      let style = styleCache[size];
      if (!style) {
        const canvas = document.createElement("canvas");
        const vectorContext = toContext(canvas.getContext("2d"), {
          size: [size, size],
          pixelRatio: 1,
        });
        vectorContext.setStyle(
          new Style({
            fill: new Fill({ color: "rgba(255, 153, 0, 0.4)" }),
            stroke: new Stroke({ color: "rgba(255, 204, 0, 0.2)", width: 2 }),
          })
        );
        vectorContext.drawGeometry(new Polygon([symbol.map(scaleFunction)]));
        //测试代码
        // var context2D = canvas.getContext("2d");
        // context2D.fillStyle = "rgba(255, 153, 0, 0.4)";
        // context2D.fillRect(0, 0, 50, 50);
        style = new Style({
          image: new Icon({
            img: canvas,
            rotation: 1.2, //设置图标的旋转角度为 1.2 弧度。
          }),
        });
        styleCache[size] = style;
      }
      // 测试代码;
      //   style = new Style({
      //     image: new CircleStyle({
      //       radius: 20,
      //       fill: new Fill({
      //         color: "red",
      //       }),
      //     }),
      //   });
      return style;
    };

    const vector = new VectorLayer({
      source: new VectorSource({
        url: "https://openlayers.org/en/latest/examples/data/kml/2012_Earthquakes_Mag5.kml",
        format: new KML({
          extractStyles: false,
        }),
      }),
      style: styleFunction,
    });

    const raster = new TileLayer({
      source: new StadiaMaps({
        layer: "stamen_toner",
      }),
    });

    const map = new Map({
      layers: [raster, vector],
      target: "map",
      view: new View({
        center: [0, 0],
        zoom: 2,
      }),
    });
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
#map {
  width: 100%;
  height: 500px;
}
.box {
  height: 100%;
}
</style>

 

openLayers 加载点线面等基础用法 openLayers 加载点线面等基础用法官方网址:[https://openlayers.org/](https://openlayers.org/) 官方网址:https://openlayers.org/ 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ...... 阅读详情

相关推荐

openlayers常用示例

简单说一下吧,最近做了十来天的的openlayers,然后稍微研究了一下,这里总结并做了一些示例给大家分享一下,应该是相对常用的一部分吧,由于做的时间比较短,这里写了十来个示例了,有实际项目用到的,也有自己想实现的,根据官网的示例改编总结之后的。虽然只有十几个示例,但是代码量还是很大,所以代码就不在这里贴了,我都写在了Gitee上,大家可以拉下来看源码,每个示例都是单独来写,一个组件一个示例(公用的部分抽离了),相对简洁明了。然后看下目前已经做了的示例吧!

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 1299

全网最新版openlayers视频教程

学习关于二维地理图层渲染,投影转换,各种数据类型渲染,OGC服务,各种地图交互

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

OpenLayers 开源的Web GIS引擎

gis

m0_45127388的博客 1万+

Ubuntu18.04环境搭建与疑难解析:从零复现YOLO-6D姿态估计算法

本文详细介绍了在Ubuntu18.04环境下从零开始复现YOLO-6D姿态估计算法的完整流程,包括系统配置、Conda环境搭建、PyTorch安装、依赖项管理、源代码获取、数据集准备以及训练验证过程。针对Singleshotpose算法的特殊需求,提供了详细的疑难解析和性能优化技巧,帮助开发者高效完成算法复现和应用部署。

weixin_30369041的博客 456

【STM32单片机】RS485通信—基于STM32G474芯片

做项目需要用485通信来控制Go电机参考资料:【【STM32F103C8T6系列】10. 实验例程——485(USART串口)通讯实验】 https://www.bilibili.com/video/BV19w411r7ka/?PDF: STM32G474 开发指南 正点原子 DMG474 开发板教程 第28章485只是物理层,代码逻辑还是UART串口通信,相当于是电路有RS485转换芯片,所以还是用UART串口通信方式。

m0_48808835的博客 3647

OpenLayers使用

OpenLayers是Web GIS前端开发的利器,如果你想在浏览器中进行Web GIS的开发,那么OpenLayers可以大大减少你的工作量,让你快速开发出应用。 OpenLayers概览 OpenLayers是一个用于开发WebGIS客户端的JavaScript包。OpenLayers 支持的地图来源包括Google Maps、Yahoo、 Map、微软Virtual Earth 等,用户...

David_jiang 3万+

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

本文介绍了微信小程序集成蓝牙打印机时中文乱码问题的解决方案。由于打印机通常仅支持GBK/GB2312编码,而小程序使用UTF-8,导致中文显示异常。通过引入轻量级iconv-lite库进行编码转换,可高效解决该问题。文章详细说明了从库安装、编码转换到蓝牙发送的实现步骤,并提供了完整代码示例。关键注意事项包括编码验证、分段发送和兼容性测试。该方法经实际验证,能有效保障中文打印的准确性,适用于零售、物流等场景。

canglingyue的专栏 1310

openlayers开源地图开发

openlayers的中文网址:https://openlayers.org/workshop/en/webgl/points.html

Yetian_2000的博客 5135

Raptor码(一):2007RFC5053标准编解码学习

RFC 5053 标准

a_beatiful_knife的博客 3493

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1172

Openlayers技巧之绘制选中要素正方形边框(自定义不规则多边形样式)

首先,在canvas中定义一个正方形边框的路径信息如下:[5, 44], [0, 35], [0, 5], [2.5, 0], [7.5, 0], [10, 5], [10, 35], [5, 44],设置边框宽度为1,颜色为红色,当然你也可以自定义正方形的大小、颜色等属性。最后,使用开源GIS做开发一点好处就是,当你遇到问题无法解决时候,多看看代码,没有效果,自己造,没有想要的功能,自己写,总会实现自己想要的。.RegularShape,重写绘制方法,根据不规则多边形路径绘制,这样就达到了我们的目的。

dreamgis的专栏 1201

36、真核生物RNA PolII启动子预测相关研究

本文综述了真核生物RNA聚合酶II启动子预测的研究进展,涵盖转录调控机制、核心启动子元件(如TATA框、INR、GC框)、转录因子结合位点预测的挑战与方法。介绍了基于权重矩阵、神经网络和隐马尔可夫模型等多种启动子预测算法,并探讨了启动子分类策略及评分加权方法。通过Hertz-Stormo-Hartzell流程和基因微阵列分析实例,展示了如何识别保守调控序列。文章还总结了当前预测技术的局限性,提出了整合多组学数据、开发深度学习模型、加强实验验证等未来研究方向,旨在提升启动子识别的准确性与生物学意义。

palm99的专栏 187

openlayers 中国镜像站

openlayers打不开的同学可以访问这个,不过没有翻译都是英文的 openlayers 中国镜像站http://openlayers.chinadoc.org 目前好像没办法访问例子,API什么的可以访问

yesxcv的博客 2025

浅谈银行内部户治理

为避免该问题的发生,对内部户入账类交易,或内部户是可透支的账户(如系统间往来),可考虑通过异步方式更新账户余额(当然,根本上还是要考虑银行业务量的实际,异步消息接口很多时候没有同步接口方便),另外,在进行内部户余额更新时,可以通过定时的借贷方发生额轧差的方式,将多次的锁请求,简化为一次(当然,发生额明细本身在加工账户交易历史时,是不能汇总的)。内部户在银行系统中,属于业务属性较少,实现相对简单,原理也很容易讲清的系统,但管中窥豹,越是基础的东西,越能看出一家银行业务、内控的专业程度。

银行信息系统应用架构详解 789

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

openlayers_01概览

openlayers 学习路径,框架介绍第一章

w131552的博客 1585

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OpenLayers学习笔记(二)

OpenLayers学习笔记(二) 中级篇 地图的分辨率设置 // 添加一个显示Open Street Map地图瓦片网格的图层 new ol.layer.Tile({ source: new ol.source.TileDebug({ projection: 'EPSG:3857', tileGrid: osmSource.getTileGrid() }) }) OpenLayers 3提供了一个用于调试瓦片的source: ol.source.TileD

易小花的博客 1831

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Openlayers API-Style

Style用于矢量图层的渲染,在添加矢量图层的时候,可以给图层中的几何体设置样式。样式类型包括Circle,Fill,Icon,Image,RegularShape,Stroke,Text,TextPlacement等。在创建Style的对象的时候,可以在构造函数中设置相关的属性参数来设置具体的样式。在渲染适量图层的时候,如果没有指定Style,将使用框架默认的样式信息,如下所示: import {Fill, Stroke, Circle, Style} from 'ol/style'; va

dreamgis的专栏 2813

openlayer3 系列 1 - 简介

1.官网:http://openlayers.org/ 在官网首页上,即可看到相关的介绍,文档,API,以及Examples链接 2.好的中文网站 http://anzhihun.coding.me/ol3-primer/ch01/index.html 3.简介 OpenLayers 3简称ol3,它是一个开源的Web GIS引擎,使用了JavaScript、最新的HTML5技术及CSS...

bitree1的博客 1597

源码分析之Openlayers样式篇RegularShape类

源码分析之Openlayers样式篇RegularShape类

Jinuss的博客 1263

openlayers6 踩坑系列(五)基于openlayers封装的一些通用方法

基于openlayer封装的一些通用方法

qq_39404437的博客 2216

openlayers官方教程(一)Introduction

近期开始学习openlayers,发现国内不少中文资源较老,还是看官方文档方便,根据自己的理解,把核心用博客记录下来,方便自己学习回顾。Setup这版说明是从获取openlayers-workshop-en.zip获取开始,去官网下载https://github.com/openlayers/workshop/releases解压后,dos命令切换到解压后的文件夹。npm install运行上面命...

不平凡之路 2万+

【学习笔记之Openlayers3】初次接触openlayers3(第一篇)

将自己学习到的一些关于openlayers3的知识总结一下,以便自己后期的回顾。 一、 Openlayers3下载:首先下载openlayers3的开发包,步骤如下: 访问openlayers官网 http://openlayers.org/(国外网站,可能访问会比较慢) 选择版本下载:有两种进入下载页面方

凌往昔 1万+

初识开源WebGIS库—OpenLayers

初识开源WebGIS库—OpenLayers OpenLayers 简介配合其他开源软件的使用 OpenLayers 简介 OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问。相比于ESRI的ArcGIS API for JavaScript,OpenLayers 的优点就是免费~~,但是随着开源GIS的发展,OpebLayers的功能也在日益完善,在有些项目中完全可以替代ArcGIS API for JavaScript。 以下

xiao猪仙的博客 1574

转载:OpenLayers学习笔记中级篇(四、地图图标操作)

1、overlay方式添加图标 首先我们定义了一个div用来放置五角星图片,然后我们定义了一个Overlay,在Overlay的元素位置上放上五角星的divid,然后非常重要的一步是给五角星图片设置一个位置,最后把Overlay图层加入到地图上即可! 功能已经完成了,下面我们来分析一下这种方式加载图标的优点和缺点: 缺点: 当图标比较多的情况下,如果采用这种方式,那么我们会加入非常多的...

Handsome2013的博客 1183

OpenLayers官网教程-矢量数据

这一系列翻译自openlayers官网的WorkShop。OL官网提供了多个系列教程供开发者学习参考,其中QuickStart是面向初学者的hello world,Tutorials提供了构建OL应用的一些基础知识,WorkShop(本系列)详细介绍了一些入门向的高阶应用,最后是APIDocs,适合开发时查阅接口。教程中需要下载的资源可以在WorkShop原网站获得链接。

GIS小虫的博客 3140
上一篇: 三十六、openlayers官网示例Earthquake Clusters解析——在聚合图层鼠标触摸显示五角星
下一篇: 三十九、openlayers官网示例Extent Interaction解析——在地图上绘制范围并获取数据
卷新心菜
博客等级 码龄4年 720粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值