当前位置: 首页 > news >正文

源码分析之Openlayers中Geometry基类介绍

概述

在上一篇文章源码分析之Openlayers中Geom篇中提到Geometry类是继承于 Openlayers 中的BaseObject类(参考源码分析之Openlayers中核心BaseObject类).而Geometry类通常情况下也是作为一个抽象基类,作为Geom几何图形的基类或父类,不会在应用中去实例化它.Geometry类回去注册几何对象实例的监听.当几何对象发生改变时,会收到通知,进而进行其它处理.

源码分析

Geometry类的源码实现

Geometry类的源码实现如下:

class Geometry extends BaseObject {constructor() {super()this.extent_=createEmpty()this.extentRevision_=-1;this.simplifiedGeometryMaxMinSquaredTolerance = 0;this.simplifiedGeometryRevision = 0;this.simplifyTransformedInternal = memoizeOne((revision, squaredTolerance, transform) => {if (!transform) {return this.getSimplifiedGeometry(squaredTolerance);}const clone = this.clone();clone.applyTransform(transform);return clone.getSimplifiedGeometry(squaredTolerance);},);}simplifyTransformed(squaredTolerance, trnasform) {}clone() {return abstract();}closestPointXY(x, y, closestPoint, minSquaredDistance) {return abstract()}containXY(x,y){const corrd=this.getClosetPoint([x,y]);return coord[0] ===x && coord[1] ===y}getClosestPoint(point,closestPoint){closestPoint= closestPoint ? closestPoint:[NaN,NaN];this.closestPointXY(point[0],point[1],closestPoint,Infinity)return closestPoint;}intersectsCoordinate(coordinate){return this.containsXY(coordinate[0],coordinate[1])}computeExtent(extent){return abstract()}getExtent(extent){if(this.extentRevision_!this.getRevision()){const extent=this.computeExtent(this.extent_);if(isNaN(extent[0])||isNaN(extent[1])){createOrUpdateEmpty(extent)}this.extentRevision_=this.getRevision();}return returnOrUpdate(this.extent_,extent)}rotate(angle,anchor){abstract()}scale(xs,xy,anchor){abstract()}simplify(tolerance){return this.getSimplifiedGeometry(tolerance * tolerance)}getSimplifiedGeometry(squaredTolerance){return abstract();}getType(){return abstract();}applyTransform(transformFn){abstract()}intersectsExtent(extent){return abstract()}translate(deltaX,deltaY){abstract()}transform(source,destination){const tmpTransform=createTransform()const sourceProj=getProjection(source);const transformFn= sourceProj.getUnits()=='tile-pixels'?function (inCoordinates,outCoordinates,stride){const pixelExtent=sourceProj.getExtent();const projectedExtent = sourceProj.getWorldExtent();const scale=getHeight(projectedExtent)/getHeight(pixelExtent);composeTransform(tmpTransform,projectedExtent[0],projectedExtent[3]),scale,-scale,0,0,0);transform2D(inCoordinates,0,inCoordinates.length,stride,tmpTransform,outCoordinates);return getTransform(sourceProj,destination)(inCoordinates,outCoordinates,stride)}: getTransform(sourceProj,destination);this.appyTransform(transformFn)return this;}
}

Geometry类构造函数

Geometry类的构造函数中调用createEmpty方法返回了一个数组[Infinity, Infinity, -Infinity, -Infinity]this.extent_,this.extent_表示的是几何对象的边界范围;然后初始化this.extentRevision_-1,这个变量是用来记录边界范围的更改次数(修订版本);再初始化this.simplifiedGeometryMaxMinSquaredTolerance变量即几何对象的最大最小平方公差为0,初始化this.simplifiedGeometryRevision0,记录几何对象的变化次数;调用memoizeOne方法用于获取几何对象的转换和简化版本,返回值赋给this.simplifyTransformedInternal.

memoizeOne方法主要就是包装并返回一个函数,它会记录函数第一次被调用时的返回值,参数以及this,当函数再次被调用时,它会拿新的参数和this与记录上一次的参数和this作比较,若他们相同,则直接返回上一次的返回值;否则执行函数,并再次记录下返回值,参数和this用于下一次被调用时作比较.

Geometry类的方法

Geometry类中定义了一些方法,其中有许多未实现,只是定义了,实现的是基础核心的方法,如下:

  • simplifyTransformed方法:接受两个参数squaredTolerance平方公差和transform转换函数,内部就是调用this.simplifyTransformedInternal方法并返回结果

  • clone方法:未实现,用于复制几何对象

  • closestPointXY方法:未实现,用于比较一个目标点与几何对象中的点之间的距离,并更新最近点的坐标,返回更小的距离

  • containsXY方法:接受一个坐标xy,然后调用this.getClosestPoint获取最近点坐标,判断参数坐标是不是与最近点坐标相同

  • getClosestPoint方法:接受两个坐标,目标点坐标和最近点坐标,其中若最近点坐标不存在,则赋值为[NaN,NaN],然后调用this.closestPointXY更新最近点坐标并返回

  • intersectsCoordinate方法:接受一个点坐标,然后调用this.containsXY并返回;该方法就是用于判断点是否在几何对象的边界上;

  • computeExtent方法:未实现,用于计算边界范围

  • getExtent方法:用于获取边界范围;内部会调用this.getRevision方法获取revision_,它们都是在Observable类中定义的,Observable类就是BaseObject类的父类,关于Observable类可以参考;当获取到的revisionthis.extentRevision_不等时,会调用this.computeExtent计算边界范围,然后判断,若计算得到的extent不存在,则调用createOrUpdateEmpty创建一个边界范围,然后更新this.extentRevision_的值,最后调用returnOrUpdate得到边界范围并返回.

  • rotate方法:未实现,该方法就是给定一个坐标值,然后旋转几何对象,这个操作会修改几何对象的坐标

  • scale方法:未实现,该方法用于对几何对象进行缩放,同样地,会修改几何对象的坐标值

  • simplify方法:未实现,该方法用于创建一个几何对象的简化版本

  • getSimplifiedGeometry方法:未实现,该方法用于获取几何对象的简化版

  • getType方法:未实现,该方法用于获取几何对象的类型

  • applyTransform方法:未实现,该方法用于对几何对象的坐标应用transform函数进行转换,

  • intersectsExtent方法:未实现,该方法用于判断几何对象与参数extent范围是否相交

  • translate方法:该方法用于对几何对象进行平移,同样地,会修改几何对象的坐标值

  • transform方法:该方法目的是将几何对象的坐标从一个投影系转换到另一个投影系.接受两个参数source源投影和destination目标投影;先是调用getProjection获取源投影source的投影对象,然后判断,若投影对象的单位类型是栅格投影,就获取源投影的像素范围pixelExtentprojectedExtent投影范围,通过它们计算一个缩放比例scale,然后调用composeTransform构建一个转换矩阵tmpTransform,用于像素坐标转换到投影坐标.然后调用transform2D,通过转换矩阵tmpTransform将输入坐标inCoordinates转化为目标坐标outCoordinates,再调用getTransform获取坐标转换函数,该函数就是用于将坐标从源投影转换到目标投影;若投影对象的单位类型不是栅格投影,则直接使用getTransform获取转换函数;最后调用this.applyTransform将得到的transformFn作为变换函数应用到几何对象上,对几何对象的所有点坐标进行转换.

总结

Openlayers 中的 Geometry 类是所有几何类型的基础类,通过继承它的子类,可以表示不同类型的几何对象。Geometry 类提供了丰富的方法来操作几何数据,如坐标变换、几何计算、空间关系判断等.

相关文章:

源码分析之Openlayers中Geometry基类介绍

概述 在上一篇文章源码分析之Openlayers中Geom篇中提到Geometry类是继承于 Openlayers 中的BaseObject类(参考源码分析之Openlayers中核心BaseObject类).而Geometry类通常情况下也是作为一个抽象基类,作为Geom几何图形的基类或父类,不会在应用中去实例化它.Geometry类回去注册…...

《Vue3 三》Vue 中的 options 选项

data 选项: data 选项:属性值必须是一个函数;返回值是一个对象,返回的对象会被 Vue 的响应式系统劫持,之后对该对象的任何访问或者修改都会在劫持中被处理。 在 Vue2.x 中,data 的属性值可以是一个函数&am…...

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下,“替代进口”成为许多企业级应用所需要面对的重要课题,搜索领域也不例外。 Elasticsearch(简称 ES)作为一款业界领先的全文搜索和分析引擎,虽然功能强大,但…...

Pytorch | 从零构建EfficientNet对CIFAR10进行分类

Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…...

Python超能力:高级技巧让你的代码飞起来

文章一览 前言一、with1.1 基本用法1.2 示例自定义上下文管理器 二、条件表达式三、列表式推导式与 zip 结合 四、map() 函数(内置函数)map用于数据清洗1. 数据清洗:字母大小写规范2. filter() 函数 五、匿名函数 lambda5.1 lambda的参数&…...

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…...

FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…...

vue3动态绑定图片和使用阿里巴巴矢量图

矢量图 1。加购物车 2. 下载在本地 解压 (把以下文件放进项目文件夹里面) ├── font ├── iconfont.css ├── iconfont.json (font-class用法) ├── iconfont.js (symbol用法) ├─…...

‘vite‘ 不是内部或外部命令,也不是可运行的程序

报错:执行 npm run dev时,提示’vite’ 不是内部或外部命令,也不是可运行的程序 解决:执行 npm install -g vite 报错:导入vite后再次执行npm run dev,报错failed to load config from E:\eclipseWP\test1…...

2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码

引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法,称为加权平均优化算法Weighted average algorithm,WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中,加权平均位置代表当…...

如何获取 ABAP 内表中的重复项

要识别 ABAP 内表中的重复项,可以结合使用排序和循环。下面的示例展示了如何查找内部表中的重复条目: DATA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE c LENGTH 10,END OF itab,wa LIKE LINE OF itab.* Add sample data to internal table it…...

编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常

加载符号 解决方法: 进入VS—工具—选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,(可能还有删除下面的那个缓存)。 参考 C# 中捕获C/C抛出的异常 在需要捕捉破坏性异常的函数…...

ChatGPT与Postman协作完成接口测试(二)

ChatGPT生成的Postman接口测试用例脚本如下所示。 ChatGPT生成的Postman接口测试用例脚本 以下是符合Collection v2.1格式要求的 Postman 测试用例脚本,覆盖了正常注册和密码不匹配两种情况的测试: { "info": { "_postman_id": &qu…...

flask-admin modelview 中重写get_query函数

背景: flask-admin框架中提供的模型视图默认是显示表实体中的所有列表数据,如果想通过某种条件限制初始列表数据,那么久需要重写一些方法才能实现。 材料: 略 制作: 视图源码: def get_query(self):re…...

【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考

文章日期:2024.12.24 使用工具:Python,Node.js 逆向类型:webpack类型 本章知识:sign模拟生成,密文的解密(webpack),全程扣代码,仅供学习参考 文章难度:低等(没…...

tensorflow_probability与tensorflow版本依赖关系

参考:Tensorflow Probability 与 TensorFlow 的版本依赖关系_tensorflow与tensorflow-probability对应版本的网址-CSDN博客 tensorflow2.10对应tensorflow_probability0.18.0,安装命令:pip install tensorflow_probability0.18.0 版本对应关…...

构建安全的用户认证系统:PHP实现

构建安全的用户认证系统:PHP实现 用户认证是任何Web应用的重要组成部分,确保只有授权用户才能访问特定资源。构建一个安全的用户认证系统需要考虑多种因素,包括密码存储、会话管理和防止常见gongji。本文将介绍如何使用PHP实现一个安全的用户…...

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比 目录 VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比; 2.单变量时间序列预测 就是先vmd把变…...

天融信网络架构安全实践

1、医院客户想通过等保2.0三级,推荐哪几款网络安全产品?(至少6个) TopSAg(运维安全审计系统) TopNAC(网络准入系统) TopEDR(终端威胁防御系统) TDSM-SBU(存储备份一体机…...

腾讯云云开发 Copilot具有以下优势

与其他代码生成工具相比,腾讯云云开发 Copilot具有以下优势: 功能特性方面 自然语言处理能力更强:许多代码生成工具仅能实现简单的代码补全或根据特定模板生成代码,而云开发 Copilot可直接通过自然语言生成完整的小程序/web全栈…...

electron-vite【实战系列教程】

创建项目 安装必要的插件 UI 库 element-plus npm install element-plus --save 安装 element-plus 图标 npm install element-plus/icons-vue 安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -D unplugin-vue-components unplugin-auto-import electron.vite.conf…...

【微信小程序】微信小程序中的异步函数是如何实现同步功能的

在微信小程序中,虽然很多 API 都是异步的,但可以通过一些方法来实现类似同步的功能。以下是几种常见的方法: 1. 使用 async/await async/await 是 ES2017 引入的语法糖,它基于 Promise 来实现异步操作的同步化写法。 示例代码 …...

贪心算法(三)

目录 一、k次取反后最大化的数组和 二、优势洗牌 三、最长回文串 四、增减字符串匹配 一、k次取反后最大化的数组和 k次取反后最大化的数组和 贪心策略&#xff1a; 解题代码&#xff1a; class Solution { public:int largestSumAfterKNegations(vector<int>&am…...

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录&#xff0c;好像和VUE项目打包没什么区别... 用HX打开项目&#xff0c;首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…...

【AI落地应用实战】篡改检测技术前沿探索——从基于检测分割到大模型

在数字化洪流席卷全球的当下&#xff0c;视觉内容已成为信息交流与传播的核心媒介&#xff0c;然而&#xff0c;随着PS技术和AIGC技术的飞速发展&#xff0c;图像篡改给视觉内容安全带来了前所未有的挑战。 本文将探讨篡改检测技术的现实挑战&#xff0c;分享篡改检测技术前沿…...

使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧

文章目录 背景介绍编辑器编译文件指定输出文件夹 usepackagelatex 语法列表插入图片添加参考文献 背景介绍 最近在写文章&#xff0c;更喜欢latex的论文引用。然后开始学习 latex。 编辑器 本文选择vscode作为编辑器&#xff0c;当然大家也可以尝试overleaf。 overleaf 有网…...

使用scrapy框架爬取微博热搜榜

注&#xff1a;在使用爬虫抓取网站数据之前&#xff0c;非常重要的一点是确保遵守相关的法律、法规以及目标网站的使用条款。 &#xff08;最底下附下载链接&#xff09; 准备工作&#xff1a; 安装依赖&#xff1a; 确保已经安装了Python环境。 使用pip安装scrapy&#xff…...

瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…...

es快速扫描

介绍 Elasticsearch简称es&#xff0c;一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群&#xff0c;处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对&#xff0c;正排索引是根据id进行索引&#xff0c;所以查询效率非常高&#xff0c;但是模糊…...

前端对页面数据进行缓存

页面录入信息&#xff0c;退出且未提交状态下&#xff0c;前端对页面数据进行存储 前端做缓存&#xff0c;一般放在local、session和cookies里面&#xff0c;但是都有大小限制&#xff0c;如果页面东西多&#xff0c;比如有上传的图片、视频&#xff0c;浏览器会抛出一个Quota…...