源码分析之Openlayers中SimpleGeometry类

概述

本文主要介绍 Openlayers 中的SimplyGeometry类,该类继承于Geometry类,可以参考源码分析之Openlayers中Geometry基类介绍,也是普通几何对象如点线面的基类或父类。SimplyGeometry类一般地也不会被实例化,只会被继承,因为它不会被渲染。

源码分析

SimplyGeometry类源码

SimplyGeometry类源码实现如下:

class SimplyGeometry extends Geometry {
  constructor() {}
  computedExtent(extent) {
    return createOrUpdateFromFlatCoordinates(
      this.flatCoordinates,
      0,
      this.flatCoordinates.length,
      this.stride,
      extent
    );
  }
  getCoordinates() {
    return abstract();
  }
  getFirstCoordinate() {
    return this.flatCoordinates.slice(0, this.stride);
  }
  getFlatCoordinates() {
    return this.flatCoordinates;
  }
  getLastCoordinate() {
    return this.flatCoordinates.slice(
      this.flatCoordinates.length - this.stride
    );
  }
  getLayout() {
    return this.layout;
  }
  getSimplifiedGeometry(squaredTolerance) {
    if (this.simplifiedGeometryRevision !== this.getRevision()) {
      this.simplifiedGeometryMaxMinSquaredTolerance = 0;
      this.simplifiedGeometryRevision = this.getRevision();
    }
    if (
      squaredTolerance < 0 ||
      (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
        squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)
    ) {
      return this;
    }

    const simplifiedGeometry =
      this.getSimplifiedGeometryInternal(squaredTolerance);
    const simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();
    if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {
      return simplifiedGeometry;
    }
    this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
    return this;
  }

  getSimplifiedGeometryInternal(squaredTolerance) {
    return this;
  }

  getStride() {
    return this.stride;
  }
  setFlatCoordinates(layout, flatCoordinates) {
    this.stride = getStrideForLayout(layout);
    this.layout = layout;
    this.flatCoordinates = flatCoordinates;
  }

  setCoordinates(coordinates, layout) {
    abstract();
  }
  setLayout(layout, coordinates, nesting) {
    let stride;
    if (layout) {
      stride = getStrideForLayout(layout);
    } else {
      for (let i = 0; i < nesting; ++i) {
        if (coordinates.length === 0) {
          this.layout = "XY";
          this.stride = 2;
          return;
        }
        coordinates = /** @type {Array<unknown>} */ (coordinates[0]);
      }
      stride = coordinates.length;
      layout = getLayoutForStride(stride);
    }
    this.layout = layout;
    this.stride = stride;
  }
  applyTransform(transformFn) {
    if (this.flatCoordinates) {
      transformFn(
        this.flatCoordinates,
        this.flatCoordinates,
        this.layout.startsWith("XYZ") ? 3 : 2,
        this.stride
      );
      this.changed();
    }
  }
  rotate(angle, anchor) {
    const flatCoordinates = this.getFlatCoordinates();
    if (flatCoordinates) {
      const stride = this.getStride();
      rotate(
        flatCoordinates,
        0,
        flatCoordinates.length,
        stride,
        angle,
        anchor,
        flatCoordinates
      );
      this.changed();
    }
  }
  scale(sx, sy, anchor) {
    if (sy === undefined) {
      sy = sx;
    }
    if (!anchor) {
      anchor = getCenter(this.getExtent());
    }
    const flatCoordinates = this.getFlatCoordinates();
    if (flatCoordinates) {
      const stride = this.getStride();
      scale(
        flatCoordinates,
        0,
        flatCoordinates.length,
        stride,
        sx,
        sy,
        anchor,
        flatCoordinates
      );
      this.changed();
    }
  }

  translate(deltaX, deltaY) {
    const flatCoordinates = this.getFlatCoordinates();
    if (flatCoordinates) {
      const stride = this.getStride();
      translate(
        flatCoordinates,
        0,
        flatCoordinates.length,
        stride,
        deltaX,
        deltaY,
        flatCoordinates
      );
      this.changed();
    }
  }
}

SimplyGeometry类的构造函数

SimplyGeometry类的构造函数就是定义了如下变量:

  • this.layout:默认值为XY,表示二维坐标,可选值还有XYZ(表示三维坐标)、XYM(表示二维坐标,M为附加属性)和XYZM(表示三维坐标,M为附加属性)。

  • this.stride:默认值为 2,步幅,可以理解为this.layout的长度。

  • this.flatCoordinates:是一个一维数组,用来存储几何图形的坐标数据。

SimplyGeometry类主要方法

SimplyGeometry类的主要方法如下:

  • computeExtent方法:内部就是调用createOrUpdateFromFlatCoordinate方法去计算几何对象的包围盒extent

  • getCoordinates方法:未实现,实际上就是获取几何对象的坐标

  • getFirstCoordinate方法:获取几何对象的第一个坐标

  • getFlatCoordinates方法:获取几何对象的一维数组,即this.flatCoordinates

  • getLastCoordinate方法:获取几何对象的最后一个坐标

  • getLayout方法:获取变量this.layout的值

  • getSimplifiedGeometry方法:创建一个简化的几何对象,运用Douglas Peucker算法

  • getSimplifiedGeometryInternal方法:获取简化几何对象

  • getStride方法:获取步幅,即this.stride的值

  • setFlatCoordinates方法:接受两个参数layoutflatCoordinates,调用getStrideForLayout通过参数layout计算stride,赋值this.layoutthis.flatCoordinates

  • setCoordinates方法:未实现

  • setLayout方法:设置this.layoutthis.stride

  • applyTransform方法:应用转换函数,参数是一个函数;判断若this.flatCoordinates存在,则调用转换函数,最后调用this.changed方法

  • rotate方法:给定一个坐标,使几何对象绕着该坐标旋转一定角度;接受两个参数angle旋转角度和anchor锚点;调用this.getFlatCoordinates获取几何对象的一维坐标,若它存在,则调用this.getStride获取步幅,然后调用rotate方法进行旋转,这操作会修改flatCoordinates;最后调用this.changed方法

  • scale方法:接受三个参数,水平方向缩放因子sx、垂直方向缩放因子sy和锚点anchor;判断,sy不存在时,则sy=sx;判断,若锚点anchor不存在,则以几何对象的包围盒的中心点为锚点;调用this.getFlatCoordinates获取this.flatCoordinates,判断,若它存在,则调用scale方法对几何对象进行缩放,最后调用this.changed方法

  • translate方法:接受两个参数deltaXdeltaY,分别表示在水平方向和垂直方向的偏移量,实际上是调用translate方法对几何对象在水平垂直两个方向上进行平移变化,最后调用this.changed方法

总结

本文介绍了SimpleGeometry类的源码实现和主要方法介绍,SimpleGeometry类的几何变换,包括旋转、缩放和平移都是对flatCoordinates进行操作,对于点线面都是如此,这在一定程度上降低了几何变换的复杂度。

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

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

相关文章

操作系统(23)外存的存储空间的管理

一、外存的基本概念与特点 定义&#xff1a;外存&#xff0c;也称为辅助存储器&#xff0c;是计算机系统中用于长期存储数据的设备&#xff0c;如硬盘、光盘、U盘等。与内存相比&#xff0c;外存的存储容量大、成本低&#xff0c;但访问速度相对较慢。特点&#xff1a;外存能够…

matrix-breakout-2-morpheus

将这一关的镜像导入虚拟机&#xff0c;出现以下页面表示导入成功 以root身份打开kali终端&#xff0c;输入以下命令&#xff0c;查看靶机ip arp-scan -l 根据得到的靶机ip&#xff0c;浏览器访问进入环境 我们从当前页面没有得到有用的信息&#xff0c;尝试扫描后台 发现有一个…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…

RSICV国产芯片之CHV208

1. 芯片选型分析的对比维度 分析或者对标应用的芯片替代思路 1.1 内核/主频/存储空间支持 内核能力/指令集支持&#xff08;考虑工具链兼容性&#xff09;&#xff1b; 主频&#xff1a;对比计算能力是否满足基本要求 存储&#xff1a;内存--数据搬移空间决定数据运算的…

7. petalinux 根文件系统配置(package group)

根文件系统配置&#xff08;Petalinux package group&#xff09; 当使能某个软件包组的时候&#xff0c;依赖的包也会相应被使能&#xff0c;解决依赖问题&#xff0c;在配置页面的help选项可以查看需要安装的包 每个软件包组的功能: packagegroup-petalinux-audio包含与音…

基于Spring Boot的个人健康管理系统

一、系统背景与意义 随着现代生活节奏的加快和人们健康意识的日益增强&#xff0c;个人健康管理成为了人们关注的焦点。然而&#xff0c;传统的健康管理方式往往依赖于纸质记录、定期体检等手段&#xff0c;不仅效率低下&#xff0c;而且难以实现对健康数据的持续跟踪和深入分…

上手教程:使用Terraform打造弹性VPC架构

最近Akamai发布的虚拟专用云&#xff08;VPC&#xff09;功能提供了一种隔离的网络&#xff0c;让云资源可以用私密的方式进行通信。 关于Akamai VPC功能&#xff0c;最棒的地方在于它有着极高的灵活性。用户可以通过Cloud Manager、开发人员工具&#xff08;如CLI&#xff09…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …

【论文复现】进行不同视角图像的拼接

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 进行不同视角图像的拼接 背景描述算法简介SIFT算法原理代码原理代码部署核心代码拼接结果其他的图片如何进行拼接&#xff1f; 修改内容&…

xxl-job 简单的入门到实战

本文是参考官方文档自己实践一次&#xff0c;纯享版&#xff0c;大致也是作者边写博客边去跟着官方文档实现 一、前期准备 1、官网地址 GitHub地址&#xff1a; GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&…

数字后端培训项目Floorplan常见问题系列专题续集1

今天继续给大家分享下数字IC后端设计实现floorplan阶段常见问题系列专题。这些问题都是来自于咱们社区IC后端训练营学员提问的问题库。目前这部分问题库已经积累了4年了&#xff0c;后面会陆续分享这方面的问题。 希望对大家的数字后端学习和工作有所帮助。 数字后端项目Floor…

江苏捷科云:可视化平台助力制造企业智能化管理

公司简介 江苏捷科云信息科技有限公司&#xff08;以下简称“捷科”&#xff09;是一家专注于云平台、云储存、云管理等产品领域的创新型企业&#xff0c;集研发、生产和销售于一体&#xff0c;致力于在网络技术领域打造尖端品牌。在推动制造业企业数字化转型的进程中&#xf…

【视觉惯性SLAM:对极几何】

对极几何&#xff08;Epipolar Geometry&#xff09;介绍 对极几何是立体视觉中的核心内容之一&#xff0c;它描述了两个相机在观察同一个三维场景时&#xff0c;成像平面之间的几何关系。对极几何能够约束图像中对应点的位置关系&#xff0c;是双目立体匹配、三维重建、以及位…

从Condition开始,回顾AQS

Synchronized和Reentrantlock的挂起逻辑 synchronized中有两个核心的结构 EntryList cxq&#xff1a;等待拿锁的线程存储位置Waitset&#xff1a;被执行wait方法的线程存储位置 流转&#xff1a; 线程获取锁资源失败&#xff0c;扔到EntryList cxq线程持有锁资源&#x…

umi : 无法加载文件 D:\software\nodejs\node_global\umi.ps1,因为在此系统上禁止运行脚本。

问题详情 2、解决方法 1.使用命令 get-ExecutionPolicy查看 显示Restricted&#xff1a;限制 所以要给权限 2. 使用命令&#xff1a;Set-ExecutionPolicy -Scope CurrentUser 3. 会提示为参数提供值 4. 输入&#xff1a; RemoteSigned 具体如下图所示&#xff0c;成功解决。 报…

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的长度非常大&#xff0c;实际上键&#xff08;Key&#xff09;长度很大也算。通常来说&#xff0c;键本身不会很长&#xff0c;占用的内存较少&#xff0c;因此判断一个键是否为bigKey主要看它对应的值的大…

02、并发编程的三大特性

并发编程有三大特性分别是&#xff0c;原子性&#xff0c;可见性&#xff0c;有序性。会产生这些特性的根本原因是现在的服务器都是多CPU多核心数的&#xff0c;每个CPU都有自己单独的一套缓存和pc系统&#xff0c;而且程序在运行时按照JMM的规范&#xff0c;它们是需要先把数据…

基于Java+Jsp Servlet Mysql实现的Java Web在线商城项目系统设计与实现

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的飞速发展&#xff0c;电子商务已成为现代商业活动的重要组成部分。在线商城作为电子商务的一种重要形式&#xff0c;以其便捷性、高效性和广泛覆盖性&#xff0c;受到了越来越多消费者的青睐。同时&#xff0c;随着消…

【安全测试相关知识】

安全测试介绍 背景 在当前信息技术快速发展的背景下&#xff0c;网络安全问题日益严峻&#xff0c;数据泄露、黑客攻击、病毒传播等安全事件层出不穷&#xff0c;给个人、企业乃至国家带来严重威胁。所以安全测试已成为企业和国家关注的重心 作用 安全测试是确保软件系统安…

WPS如何快速将数字金额批量转换成中文大写金额,其实非常简单

大家好&#xff0c;我是小鱼。 在日常的工作中经常会遇到需要使用金额大写的情况&#xff0c;比如说签订业务合同时一般都会标注大写金额&#xff0c;这样是为了安全和防止串改。但是很多人也许不太熟悉金额大写的方法和习惯&#xff0c;其它没有关系&#xff0c;我们在用WPS制…