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

源码分析之Openlayers中GeometryCollection类

概述

本文主要介绍GeometryCollection类,GeometryCollection类继承于Geometry类,关于Geometry类,参考这篇文章源码分析之Openlayers中Geometry基类介绍

GeometryCollection类就是一组几何对象的集合.

源码分析

GeometryCollection类源码实现

GeometryCollection类源码实现如下:

class GeometryCollection extends Geometry {constructor(geometries) {super();this.geometries_ = geometries;this.changeEventKeys_ = [];this.listenGeometriesChange_();}unlistenGeometriesChange_() {this.changeEventsKeys_.forEach(unlistenByKey);this.changeEventsKeys_.length = 0;}listenGeometriesChange_() {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {this.changeEventsKeys_.push(listen(geometries[i], EventType.CHANGE, this.changed, this));}}clone() {const geometryCollection = new GeometryCollection(cloneGeometries(this.geometries_));geometryCollection.applyProperties(this);return geometryCollection;}closestPointXY(x, y, closestPoint, minSquaredDistance) {if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {return minSquaredDistance;}const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {minSquaredDistance = geometries[i].closestPointXY(x,y,closestPoint,minSquaredDistance);}return minSquaredDistance;}containsXY(x, y) {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {if (geometries[i].containsXY(x, y)) {return true;}}return false;}computeExtent(extent) {createOrUpdateEmpty(extent);const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {extend(extent, geometries[i].getExtent());}return extent;}getGeometries() {return cloneGeometries(this.geometries_);}getGeometriesArray() {return this.geometries_;}getGeometriesArrayRecursive() {/** @type {Array<Geometry>} */let geometriesArray = [];const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {if (geometries[i].getType() === this.getType()) {geometriesArray = geometriesArray.concat(geometries[i].getGeometriesArrayRecursive());} else {geometriesArray.push(geometries[i]);}}return geometriesArray;}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 simplifiedGeometries = [];const geometries = this.geometries_;let simplified = false;for (let i = 0, ii = geometries.length; i < ii; ++i) {const geometry = geometries[i];const simplifiedGeometry =geometry.getSimplifiedGeometry(squaredTolerance);simplifiedGeometries.push(simplifiedGeometry);if (simplifiedGeometry !== geometry) {simplified = true;}}if (simplified) {const simplifiedGeometryCollection = new GeometryCollection(simplifiedGeometries);return simplifiedGeometryCollection;}this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;return this;}getType() {return "GeometryCollection";}intersectsExtent(extent) {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {if (geometries[i].intersectsExtent(extent)) {return true;}}return false;}isEmpty() {return this.geometries_.length === 0;}rotate(angle, anchor) {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {geometries[i].rotate(angle, anchor);}this.changed();}scale(sx, sy, anchor) {if (!anchor) {anchor = getCenter(this.getExtent());}const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {geometries[i].scale(sx, sy, anchor);}this.changed();}setGeometries(geometries) {this.setGeometriesArray(cloneGeometries(geometries));}setGeometriesArray(geometries) {this.unlistenGeometriesChange_();this.geometries_ = geometries;this.listenGeometriesChange_();this.changed();}applyTransform(transformFn) {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {geometries[i].applyTransform(transformFn);}this.changed();}translate(deltaX, deltaY) {const geometries = this.geometries_;for (let i = 0, ii = geometries.length; i < ii; ++i) {geometries[i].translate(deltaX, deltaY);}this.changed();}disposeInternal() {this.unlistenGeometriesChange_();super.disposeInternal();}
}

GeometryCollection类构造函数

GeometryCollection类构造函数接受一个参数geometries,geometries是一个包含多个几何对象数组,该参数会赋给全局变量this.geometries_,然后初始化一个变量this.changeEventsKeys_为空数组,最后调用this.listenGeometriesChange_方法.

GeometryCollection类的方法

GeometryCollection类的方法主要是对几何对象的一些操作,会去遍历this.geometries_变量,逐一进行操作.GeometryCollection类中的主要方法如下:

  • listenGeometriesChange_方法:该方法在构造函数中就会被调用,其核心逻辑就是循环遍历this.geometries_,调用listen方法注册每个几何对象的change事件监听,注册事件返回的keys值保存在全局变量this.changeEventsKeys_中.listen方法的实现可以参考这篇文章源码分析之Openlayers中的Observable类

  • unlistenGeometriesChange_方法:用于取消监听,重置this.changeEventKeys_为空数组,解绑方法unlistenByKey同样是在event.js中实现的.

  • clone方法:clone方法会返回一个新的几何对象集合,其内部会先调用cloneGeometries方法去clone每一个Geometry,然后实例化GeometryCollection类,再会调用applyProperties去应用this,applyProperties方法是在Object类中实现的,主要就是复制属性.

  • closestPointXY方法:用于获取对几何对象稽核最近的点坐标,以及修改并获取最短距离;方法接受四个参数目标点坐标x``y,最近点坐标以及最短距离,会先调用closestSquaredDistanceXY获取目标坐标点到边界范围的平方距离,若最短距离大于该参数最短平方距离,则返回参数minSquaredDistance;然后遍历this.geometries_,调用每一个几何对象的closestPointXY方法,修改最近点坐标和最短距离;最后返回最短距离

  • containsXY方法:同样地也是遍历this.geometries_,调用几何对象的containsXY方法;containsXY方法就是判断点是否在几何对象集合的边界上,返回一个布尔值。

  • computeExtent方法:获取几何对象集合的边界范围

  • getGeometries方法:获取几何对象集合的副本,调用cloneGeometries方法

  • getGeometriesArray方法:获取几何对象集合数组

  • getGeometriesArrayRecursive方法:将嵌套的几何对象(如子集合)展平成一个平坦的数组,即若几何对象数组中的数组项也是一个数组,那么就会递归调用它的getGeometriesArrayRecursive方法。

  • getSimplifiedGeometry方法:该方法就是用于简化几何,采用了Douglas-Peucker算法。这个算法常用于简化折线几何,减少点的数量,同时尽可能保持原始几何形状的准确性。简化通过一个容差值来控制简化的程度,容差值越大,简化的结果就越简单。getSimplifiedGeometry方法会先检查修订号,若当前几何对象的修订号与上次简化的修订号不一致这说明几何对象已经发生了变化,需要重新计算简化后的几何对象;然后会检查容差值,若容差值小于0或者小于已经记录的最大容差值,则不需要重新计算,直接返回当前对象;然后初始化一个空数组,simplifiedGeometries用于存储简化后的几何对象,再遍历this.geometries_,调用每个几何对象的getSimplifiedGeometry方法,简化每一个几何对象;若简化后的实例对象不等于原始对象,则将simplified赋值为true,然后实例化GeometryCollection类,生成一个几何对象集合实例并返回;若简化后的实例对象与原始对象相同,一个几何对象也没有被简化,则返回当前对象this.

  • getType方法:获取类型,返回GeometryCollection

  • intersectsExtent方法:遍历this.geometries_,然后调用每个几何对象的intersectsExtent方法,判断几何对象是否与extent相交;若有一个几何对象和extent相交则返回true;若一个都不相交,则返回false

  • isEmpty方法:判断几何对象集合是否为空,返回一个布尔值。

  • rotate方法:遍历this.geometries_,然后调用每个几何对象的rotate方法,最后调用this.changed方法

  • scale方法:遍历this.geometries_,然后调用每个几何对象的scale方法,最后调用this.changed方法

  • setGeometries方法:会先调用cloneGeometries方法clone每个几何对象,然后调用this.setGeometriesArray方法

  • setGeometriesArray方法:会调用this.unlistenGeometriesChange_取消监听,然后设置this.geometries_,再调用this.listenGeometriesChange_方法注册监听,最后调用this.changed方法

  • applyTransform方法:遍历this.geometries_,然后调用每个几何对象的applyTransform方法,最后调用this.changed方法

  • translate方法:遍历this.geometries_,然后调用每个几何对象的translate方法,最后调用this.changed方法

  • disposeInternal方法:清理函数,调用this.unlistenGeometriesChange_取消监听,再调用父类的disposeInternal方法

总结

本文介绍了GeometryCollection类的源码实现,由此可以清晰理解GeometryCollection类主要还是一组多个对几何对象进行平移、旋转和缩放转换以及空间关系的判断等等。

相关文章:

源码分析之Openlayers中GeometryCollection类

概述 本文主要介绍GeometryCollection类,GeometryCollection类继承于Geometry类,关于Geometry类,参考这篇文章源码分析之Openlayers中Geometry基类介绍 GeometryCollection类就是一组几何对象的集合. 源码分析 GeometryCollection类源码实现 GeometryCollection类源码实现…...

常见LLM大模型总结

常见LLM大模型总结 模型名称发布机构主要特点参数规模应用场景GPT-4OpenAI强大的推理能力&#xff0c;支持多模态&#xff08;图像文本&#xff09;&#xff0c;上下文理解更深1.7万亿参数聊天机器人、内容生成、代码生成ChatGPTOpenAI面向对话优化&#xff0c;支持多轮对话记…...

向量检索+大语言模型,免费搭建基于专属知识库的 RAG 智能助手

随着生成式人工智能技术的飞速发展&#xff0c;越来越多的人和企业开始应用AI到日常的工作和生活中。但公域的AI助手其数据来自互联网上的大量公开文本&#xff0c;虽然具有广泛的知识&#xff0c;但在面对一些特定领域的专业问题时&#xff0c;可能会出现回答不够准确或深入的…...

基础11C++中的异常处理以及swap

一、异常处理手段 抛出异常&#xff1a;throw 异常 作用&#xff1a;让调用者看见这个异常&#xff0c;如果调用者不理睬&#xff0c;就让调用者的调用者看见 接住异常: try {可能异常的code} catch(异常类型) {处理方式} 异常类型&#xff1a;一般为const &&#xff0c;防…...

写作词汇积累:得偿所望、可见一斑、搭腔

得偿所望 【得偿所望】是指经过长时间的期盼和努力&#xff0c;最终实现了自己的愿望或目标。 【得偿所望】强调了愿望实现后的满足感和成就感&#xff0c;是一个充满正能量和积极情感的词语。 【得偿所望】与【得偿所愿】在表达上也具有相似的含义&#xff0c;都指愿望得到了…...

android jetpack compose Model对象更新变量 UI不更新、不刷新问题

以前是搞老本行Android原生开发的&#xff0c;因为工作原因&#xff0c;一直在用vue小程序&#xff1b;因为一些工作需要&#xff0c;又需要用到Android原生开发&#xff0c;建了个项目&#xff0c;打开源码一看&#xff0c;天塌了&#xff01;&#xff01;&#xff01;我以前的…...

数据库概论

目录 1、数据库管理系统(DBMS) 1.1 DBMS的主要功能 1. 数据库的定义功能 2. 数据库的操纵功能 3. 数据库的运行控制功能 4. 数据库的维护 5. 数据字典(Data Dictionary&#xff0c;DD) 2、数据模型 2.1 信息和数据(了解) 2.2 数据模型的三个层次 2.3 信息世界中的基…...

基于python使用UDP协议对飞秋进行通讯—DDOS

基于飞秋的信息传输 声明&#xff1a;笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 老规矩&#xff0c;封面在文末&#xff01; 飞秋介绍 &#xff08;…...

数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225)

数据库管理275期 2024-12-25 数据库管理-第275期 Oracle 23ai&#xff1a;画了两张架构图&#xff08;20241225&#xff09;1 系统管理分片2 用户定义分片总结 数据库管理-第275期 Oracle 23ai&#xff1a;画了两张架构图&#xff08;20241225&#xff09; 作者&#xff1a;胖…...

使用Streamlit部署机器学习模型

机器学习&#xff1a; 计算机能够从经验中学习&#xff0c;而无需明确编程。机器学习是目前最热门的领域之一&#xff0c;世界各地的顶级公司都在使用它来改善他们的服务和产品。但是没有使用在Jupyter Notebook中训练的机器学习模型。因此&#xff0c;我们需要部署这些模型&am…...

依图科技简介

依图科技&#xff08;YITU Technology&#xff09;是中国一家全球领先的人工智能&#xff08;AI&#xff09;公司&#xff0c;成立于2012年&#xff0c;总部位于上海。公司专注于计算机视觉、语音识别和自然语言处理等核心AI技术&#xff0c;致力于推动AI技术在医疗、安防、金融…...

苍穹外卖day07缓存部分分析

苍穹外卖Day07部分聚焦于缓存功能的实现与优化&#xff0c;通过引入redis缓存机制&#xff0c;结合Spring Cache 注解&#xff0c;降低了数据库负载&#xff0c;提升其响应速度。 以下是清除缓存功能代码&#xff1a; RestController RequestMapping("/admin/dish"…...

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…...

HarmonyOS NEXT 实战之元服务:静态案例效果---电台推荐

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…...

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏&#xff0c;且小程序默认入口页面为pages/index/index&#xff0c;要使不同角色呈现不同底部导航栏&#xff0c;必须要在不同页面引用不同的自定义导航栏。本篇将结合分包&#xff08;subPackages&#xff09;展开以下三步叙述…...

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算&#xff08;算术运算、关系运算、逻辑运算&#xff09;&#xff0c;即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...

服务器被攻击怎么办

当服务器遭受恶意流量攻击&#xff0c;如DDoS&#xff08;分布式拒绝服务&#xff09;或CC&#xff08;Challenge Collapsar&#xff09;攻击时&#xff0c;传统的防护措施可能不足以应对。此时&#xff0c;采用高防IP服务可以有效缓解攻击压力&#xff0c;确保业务连续性和数据…...

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…...

【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用

目录 概念 基本使用案例 效果 步骤 概念 UGameInstanceSubsystem 类继承自 USubsystem&#xff0c;它与 GameInstance 紧密关联&#xff0c;旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间&#xff0c;一个 GameInstance 可以包含多个 UGa…...

实用工具推荐----Doxygen使用方法

目录 目录 1 软件介绍 2 Doxygen软件下载方法 3 Doxygen软件配置方法 4 标准注释描述 4.1 块注释 和 特殊描述字符 4.1.1 函数描述示例 4.1.2结构体数组变量示例 特别注意&#xff1a; 4.2单行注释 4.2.1 单个变量注释示例 特别注意&#xff1a; 4.2.2对于枚举变量…...

【AI】RAG的原理

目录 前言 一、为什么会有RAG 二、RAG完整流程 阶段一&#xff1a;离线建库&#xff08;准备知识&#xff09; 阶段二&#xff1a;在线问答 三、RAG和微调的区别 微调&#xff08;Fine-tuning&#xff09; RAG 总结 前言 上一篇博客中&#xff0c;介绍了大模型的幻觉是…...

效率倍增,使用快马生成ansible playbook自动化部署ubuntu生产服务器

效率倍增&#xff0c;使用快马生成ansible playbook自动化部署ubuntu生产服务器 重复性的ubuntu环境安装与配置工作&#xff0c;往往让开发者感到头疼。每次新服务器上线&#xff0c;都需要手动执行一系列繁琐的操作&#xff0c;不仅耗时耗力&#xff0c;还容易出错。最近我发…...

OpenClaw调试技巧:Qwen3-4B任务失败排查与优化

OpenClaw调试技巧&#xff1a;Qwen3-4B任务失败排查与优化 1. 为什么我们需要系统化的调试方法 上周我尝试用OpenClaw对接Qwen3-4B模型来自动处理日报生成任务时&#xff0c;遇到了一个典型问题&#xff1a;模型能正常返回响应&#xff0c;但Agent却总是卡在"解析响应&q…...

数据仓库实战:查询优化器工作原理深度解析 + 性能提升实战指南

数据仓库实战&#xff1a;查询优化器工作原理深度解析 性能提升实战指南摘要一、基础认知&#xff1a;数据仓库查询优化器是什么&#xff1f;1.1 核心定义1.2 数仓优化器与数据库优化器的区别1.3 优化器核心目标二、工作流程&#xff1a;查询优化器完整执行链路&#xff08;带…...

ai开发ai:借助快马平台智能体辅助完成openclaw千问模型的深度配置与优化

最近在折腾OpenClaw配置千问模型的项目&#xff0c;发现整个过程特别适合用AI来辅助开发。这种"用AI开发AI应用"的循环特别有意思&#xff0c;今天就来分享下我的实践心得。 核心配置脚本的AI协作开发 配置OpenClaw最头疼的就是那些复杂的错误处理逻辑。我直接在In…...

Nano Banana Pro图像生成与编辑技术解析

介绍 Nano Banana Pro 不久前&#xff0c;发布了Nano Banana&#xff08;Gemini 2.5 Flash图像模型&#xff09;。从修复旧照片到生成微型模型&#xff0c;Nano Banana在图像编辑领域迈出了一大步&#xff0c;让普通创作者能够表达自己的创造力。今天&#xff0c;推出Nano Bana…...

openclaw行为式AI重构:从昂贵Token到高效对象协作

从昂贵的token消耗到高效的对象协作,重新设计行为式AI的核心架构 问题诊断:为什么当前行为式AI如此“昂贵”? OpenClaw等工具的核心架构依赖生成式大模型作为“大脑”,通过反复的推理-行动循环完成任务。这种设计导致: 高Token消耗的根源 重复的上下文传递:每次循环都需…...

高效Navicat密码找回工具:无需编程的数据库连接密码恢复方案

高效Navicat密码找回工具&#xff1a;无需编程的数据库连接密码恢复方案 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 当数据库连接密码成为工作阻碍&a…...

OmX企业解决方案:大型组织的AI编码助手部署全攻略

OmX企业解决方案&#xff1a;大型组织的AI编码助手部署全攻略 【免费下载链接】oh-my-codex OmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more. 项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex OmX&#x…...

vLLM-v0.17.1详细步骤:启用CUDA Graph提升GPU利用率至98%操作指南

vLLM-v0.17.1详细步骤&#xff1a;启用CUDA Graph提升GPU利用率至98%操作指南 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在…...