源码分析之Openlayers中的LinearRing类

news2024/12/27 13:54:33

概述

在 OpenLayers 中,LinearRing 类用于表示封闭的线段集合(即多段线)形成的环状路径。LinearRingSimpleGeometry 的子类,继承自几何图形类。它通常用于描述多边形的外边界或孔洞边界,本质上它就是一个封闭的线段路径,首尾点必须是重合的,形成一个封闭环。

本文主要介绍LinearRing类的源码实现和原理。

源码分析

LinearRing类源码实现

class LinearRing extends SimpleGeometry {
  constructor(coordinates, layout) {
    super();
    this.maxDelta_ = -1;
    this.maxDeltaRevision_ = -1;
    if (layout !== undefined && !Array.isArray(coordinates[0])) {
      this.setFlatCoordinates(layout, coordinates);
    } else {
      this.setCoordinates(coordinates, layout);
    }
  }

  clone() {
    return new LinearRing(this.flatCoordinates.slice(), this.layout);
  }

  closestPointXY(x, y, closestPoint, minSquaredDistance) {
    if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
      return minSquaredDistance;
    }
    if (this.maxDeltaRevision_ != this.getRevision()) {
      this.maxDelta_ = Math.sqrt(
        maxSquaredDelta(
          this.flatCoordinates,
          0,
          this.flatCoordinates.length,
          this.stride,
          0
        )
      );
      this.maxDeltaRevision_ = this.getRevision();
    }
    return assignClosestPoint(
      this.flatCoordinates,
      0,
      this.flatCoordinates.length,
      this.stride,
      this.maxDelta_,
      true,
      x,
      y,
      closestPoint,
      minSquaredDistance
    );
  }

  getArea() {
    return linearRingArea(
      this.flatCoordinates,
      0,
      this.flatCoordinates.length,
      this.stride
    );
  }

  getCoordinates() {
    return inflateCoordinates(
      this.flatCoordinates,
      0,
      this.flatCoordinates.length,
      this.stride
    );
  }

  getSimplifiedGeometryInternal(squaredTolerance) {
    const simplifiedFlatCoordinates = [];
    simplifiedFlatCoordinates.length = douglasPeucker(
      this.flatCoordinates,
      0,
      this.flatCoordinates.length,
      this.stride,
      squaredTolerance,
      simplifiedFlatCoordinates,
      0
    );
    return new LinearRing(simplifiedFlatCoordinates, "XY");
  }

  getType() {
    return "LinearRing";
  }

  intersectsExtent(extent) {
    return false;
  }

  setCoordinates(coordinates, layout) {
    this.setLayout(layout, coordinates, 1);
    if (!this.flatCoordinates) {
      this.flatCoordinates = [];
    }
    this.flatCoordinates.length = deflateCoordinates(
      this.flatCoordinates,
      0,
      coordinates,
      this.stride
    );
    this.changed();
  }
}

LinearRing类的构造函数

LinearRing类的构造函数中定义了两个变量this.maxDelta_this.maxDeltaRevision_,这两个变量都与优化和性能相关,在LinearRing类的管理和更新时,可以避免不必要的计算,具体如下

  • this.maxDelta_:该变量通常用于控制几何形状的精度或处理几何更新时的变化阈值。初始值为-1,表示初始、未定义的状态,还没有设置具体的最大变化量;实际的值通常是在更新几何图形时进行设定;当几何图形的顶点发生变化时,this.maxDelta_会用来判断这些变化是否超出阈值,若没有,这不会触发重新渲染或计算的操作;
  • this.maxDeltaRevision_:初始值也是-1,该变量是用于跟踪几何图形修订版本的变量。它存储了上次更新时的修订版本号,用于判断当前几何形状是否发生了变化。每当几何形状的顶点或属性更新时,this.maxDeltaRevision_ 会被更新。如果当前版本与上次的版本不一致,可能会触发一些操作,比如重新计算、重新渲染或者优化缓存等。该变量有助于优化性能,因为在很多情况下,OpenLayers 需要检查对象是否发生了变化。如果当前修订版本与上次的修订版本一致,那么可以跳过一些不必要的操作。

除了定义上述两个变量外,LinearRing类还会判断构造函数的第二个参数layout是否存在,若不存在,且参数coordinates的第一个值不是数组,则调用父类SimpleGeometry类中的this.setFlatCoordinates方法;否则调用this.setCoordinates方法,二者都是会设置this.layoutthis.stridethis.flatCoordinates的值。

LinearRing类的主要方法

LinearRing类的主要方法如下:

  • clone方法:用于克隆一个LinearRing几何对象,内部就是实例化LinearRing类并返回实例。

  • closestPointXY方法:接受四个参数,目标点坐标xy、最近点坐标closestPoint和最短距离平方minSquaredDistance;首先会判断,若minSquaredDistance小于目标点离包围盒的距离(该距离是调用closetSquaredDistanceXY方法计算),则返回minSquaredDistance;然后调用this.getRevision()方法获取几何对象的修改次数,若该次数不等于this.maxDeltaRevision_,则调用maxSquaredDelta方法计算几何对象相邻点之间的最大平方距离并将其平方根赋值给this.maxDelta_,并调用this.getRevision()将返回值赋值给this.maxDeltaRevision_;最后调用assignClosePoint方法并返回,assignClosePoint方法就是寻找一组坐标点中离给定点 (x, y) 最近的点,并返回该点的平方距离。该方法是计算几何中点之间最近距离的一种实现,特别适用于路径、线段、或者多边形边界等几何结构,常用于计算点到线的最近距离,或者优化几何数据结构。所以closestPointXYPoint类的同名方法作用一样,修改最近点坐标并返回最短距离

  • getArea方法:获取几何对象的面积,内部是调用linearRingArea方法,该方法的原理是使用**Shoelace定理**(或高斯面积公式)计算多边形的面积。

  • getCoordinates方法:获取几何对象的坐标,内部是调用inflateCoordinates方法

  • getSimplifiedGeometryInternal方法:内部方法,获取简化的几何对象,接受一个参数squaredTolerance,该参数表示一个距离阈值的平方,用于控制在多大程度上可以去除多余的点,即控制简化的精度,值越大,去除的点更多;内部利用了Douglas-Peucker算法来对多边形进行简化。

  • getType方法:获取几何对象的类型,返回LinearRing

  • intersectsExtent方法:返回false

  • setCoordinates方法:设置坐标,主要还是赋值,内部会调用deflateCoordinates方法修改三个变量this.stridethis.layoutthis.flatCoordinates,最后会调用this.changed方法

总结

本文介绍了LinearRing类的源码实现,LinearRing类通常情况下实例化后不会直接被渲染,而是在Polygon类中用于构建多边形。

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

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

相关文章

Linux-----进程处理(子进程创建)

【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p35&vd_source342079de7c07f82982956aad8662b467 main函数 fork创建进程 fork()参数 /*** brief 创建一个子进…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

智能化军事【五】精确制导武器智能化实现

文章目录 前言精确制导武器智能化实现基于深度学习实现的智能化功能基于强化学习实现的智能化功能强化学习深度强化学习 网络模型轻量化网络剪枝&#xff08;通道剪枝&#xff09;技术层剪枝权值量化技术低秩近似技术知识蒸馏技术强化学习联合训练 解决有效训练样本不足或获取困…

解锁高效密码:适当休息,让学习状态满格

一、“肝帝” 的困境 在当今竞争激烈的职场中&#xff0c;“肝帝” 现象屡见不鲜。超长工时仿佛成为了许多行业的 “标配”&#xff0c;从互联网企业的 “996”“007”&#xff0c;到传统制造业的轮班倒、无休无止的加班&#xff0c;员工们的工作时间被不断拉长。清晨&#xff…

asp.net 高校学生勤工俭学系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

RTMW:实时多人2D和3D 全人体姿态估计

单位&#xff1a;上海AI实验室 代码&#xff1a;mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

AI智能养站神器-SEO助理原创文章批量生成发布工具

很多站长最头疼的就是网站每天的内容更新&#xff0c;因为不知道写什么&#xff0c;采集被人的文章又会被定义为抄袭&#xff0c;而且现在伪原创已经没有多大的效果了&#xff0c;所以今天给大家分享的就是一款AI智能养战神器-SEO助理原创文章批量生成发布工具。 这款工具支持…

用Python开启人工智能之旅(三)常用的机器学习算法与实现

第三部分&#xff1a;常用的机器学习算法与实现 用Python开启人工智能之旅&#xff08;一&#xff09;Python简介与安装 用Python开启人工智能之旅&#xff08;二&#xff09;Python基础 用Python开启人工智能之旅&#xff08;三&#xff09;常用的机器学习算法与实现 用Pyt…

FD(File Descriptor)泄漏

File Descriptor是Linux下概念&#xff0c;fd 是 int类型非负数&#xff01; 进程打开File&#xff0c;Socket&#xff0c;Pipe后生成一个File Descriptor&#xff0c;它是打开这个系统资源的标识符。 Linux每个进程fd最大1024个&#xff0c;超过之后进程 crash&#xff0c;c…

英语单词拼读小程序开发制作介绍

英语单词拼读小程序开发制作介绍本英语单词拼读小程序系统开发的主要功能有&#xff1a; 1、按年级分类展示每个年级阶段的英语单词信息。 2、点击选择的单词进入单词拼读页面&#xff0c;展示英语单词的拼读音标、中文意思、单词发音、拆分词汇发音、用户通过朗读发音对比。通…

TCP客户端模拟链接websocket服务端发送消息(二)

兄弟们&#xff0c;我来填坑了&#xff0c;o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o&#xff0c;前几天写了个tcp模拟websocket客户端的以为完成&#xff0c;后面需要发送消息给服务端&#xff0c;以为简单不就是一个发送消息么&#xff0c;这不是一…

Docker 镜像加速访问方案

在数字化时代&#xff0c;Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起&#xff0c;Docker Hub 的访问速度较慢或不稳定&#xff0c;这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…

牛客网刷题 ——C语言初阶——BC112小乐乐求和

1.牛客网刷题 ——C语言初阶 牛客网&#xff1a;BC112小乐乐求和 小乐乐最近接触了求和符号Σ&#xff0c;他想计算的结果。但是小乐乐很笨&#xff0c;请你帮助他解答。 输入描述: 输入一个正整数n (1 ≤ n ≤ 109) 输出描述: 输出一个值&#xff0c;为求和结果。 示例1 输…

Eclipse常用快捷键详解

文章目录 Eclipse常用快捷键详解一、引言二、编辑快捷键三、选择和移动快捷键四、行操作快捷键五、搜索和导航快捷键六、调试快捷键七、重构快捷键八、其他快捷键九、使用案例场景一&#xff1a;代码编写代码示例 场景二&#xff1a;代码调试场景三&#xff1a;代码重构代码示例…

clickhouse测试报告

​一、背景 针对当前实施的项目&#xff0c;面临着两个主要挑战&#xff1a;一是需要存储更详细的原始数据和中间数据&#xff0c;二是现有基于MySQL的数据存储解决方案在数据量增长时性能受限&#xff0c;特别是在进行跨年历史数据的即时分析时。为了解决这些问题&#xf…

windows和mac共享文件夹访问教程

mac共享文件夹&#xff0c;windows访问&#xff1a; mac上开启文件夹共享&#xff0c;并添加文件夹和用户&#xff0c;然后windows 上 在windows上快捷键 win r 打开运行&#xff0c;按如下格式输入mac设备的IP地址&#xff1a; 就可以访问了&#xff1a; windows共享文件夹…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…