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

OpenLayers:extent与view extent 介绍

一、范围的概念

1.什么是范围?

在Openlayers中范围(Extent)是用于表示地理空间区域的一种概念。它通常由一个数字数组构成,数组中的内容为:[最小x坐标,最小y坐标,最大x坐标,最大y坐标]

Extent实际上表示了一个矩形的空间范围:

2.什么是视图范围?

视图范围可以理解为Openlayers的map在浏览器视口中所显示的地理空间范围,这个范围被map所关联的view(视图)来存储和管理,所以称之为视图范围。

二、视图范围的使用

1.设置视图范围

想要设置视图范围可以在实例化View时通过extent属性来设置。

但是在实例化完成后似乎就没有办法去修改一个视图的extent了。

2.获取视图范围

获取地图当前的视图范围是一个常见的操作,当前的视图范围可以帮助我们去甄别一些要素是否应该被现实从而实现要素的“懒加载”。这个范围一般可以通过view.calculateExtent()方法计算得到。

  // 当前的视图范围const extent = map.getView().calculateExtent();

如果map已经与view进行了绑定,则直接调用calculateExtent()就可以计算出视图的范围。但是在一些特殊情况下(如,map没有与view相绑定或者view绑定了多个map)想要获取视图范围,此时就要给calculateExtent()传递一个box size 作为参数,最终计算出来的范围将适配这个size,可以使用map.getSize()方法获取地图的尺寸用来作为参数计算视图范围。

// 如果map没有与view相绑定
const extent = view.calculateExtent( map.getSize() );

三、其它类型中的范围

1.图层、数据源和几何的范围

Openlayers中 Layer(图层)、Source(数据源)、Geometry(几何)等重要的类型都有自己的 extent属性,通常用于表示包含其内容的地理范围。调用它们的getExtent()方法就可以获取到它们的范围。

// 获取图层的范围
layer.getExtent()// 获取数据源的范围
source.getExtent()// 获取几何图形的范围
point.getExtent()
polyline.getExtent()
polygon.getExtent()

在实际的开发中,我经常会使用这些范围来实现图层的定位或几何图形的定位。

// 视角切换到图层范围
map.getView.fit(layer.getExtent())// 视角切换到某个几何图形
map.getView.fit(pointFeature.getGeometry().getExtent())

2.投影坐标系的范围

投影坐标系也有自己的范围,例如 EPSG:4326 的范围就是 [-180, -90, 180, 90]。投影坐标系的范围同样也是通过它们的getExtent()方法获取。

import { get as getProjection } from "ol/proj";getProjection("EPSG:4326").getExtent(),

在创建切片数据源的tileGrid时就有可能会用到投影范围。

const tileGrid = new createXYZ({extent: getProjection("EPSG:4326").getExtent(),maxZoom: 18,
}),

四、常用的范围方法

Openlayers中封装了一批专门用来操作Extent的方法,这些方法可以辅助我们在实际开发中实现很多的功能。

1.获取范围的特征信息的方法

前面提到过范围可以理解为就是一个“矩形框”,有一些方法专门用来计算矩形框的特征信息:

方法

描述

getSize

获取范围的尺寸

getArea

获取范围的面积

getWidth

获取范围的宽度

getHeight

获取范围的高度

getCenter

获取范围的中心点

getTopLeft

获取范围的左上角点

getTopRight

获取范围的右上角点

getBottomLeft

获取范围的左下角点

getBottomRight

获取范围的右下角点

2.范围查询方法

范围最常用的一种场景就是进行范围查询。containsCoordinate(extent, coordinate)containsXY(extent, x, y)containsExtent(extent1, extent2) 三个方法可以用来进行范围查询。其中前两个方法用于检查坐标是否位于范围内,最后一个方法则用于检查一个范围是否包含于另一个范围内。

下面这个例子就展示了如何利用containsExtent方法检查一个Featrue要素是否位于范围内:

const extent = [...]; // 范围
const feature = new Feature(...); //要素// 检查要素是否位于范围内
const res = containsExtent(extent, feature.getGeometry().getExtent())

3.范围工厂方法

还有一些方法可以创建一个范围,例如boundingExtent(coordinates)方法,它可以创建一个包含所有给定坐标的范围。

下面的例子展示如何使用boundingExtent()方法创建一个包含所有点要素的范围:

const pointFeatures = [...];// 创建一个包含所有点要素的范围
const extent = boundingExtent(pointFeatures.map(r => r.getGeometry().getCoordinates())
);

参考资料

  1. OpenLayers v10.5.0 API - Class: View
  2. OpenLayers v10.5.0 API - Module: ol/extent

文章转载自:

http://NN7rV8Tz.sLtry.cn
http://7ayMvWqD.sLtry.cn
http://nKSJUnrt.sLtry.cn
http://CXE5zqj0.sLtry.cn
http://HZgO1bVT.sLtry.cn
http://YGUccyI7.sLtry.cn
http://ocXvYxHl.sLtry.cn
http://AGhukgQT.sLtry.cn
http://NWcsxH6l.sLtry.cn
http://wPaGOHXI.sLtry.cn
http://mQh9A7i3.sLtry.cn
http://7fnjeBrG.sLtry.cn
http://7UEU1mHy.sLtry.cn
http://Wl1oEMml.sLtry.cn
http://fe3vdXBV.sLtry.cn
http://R1XBPwNv.sLtry.cn
http://Q3x1nQK8.sLtry.cn
http://pfajcOxs.sLtry.cn
http://bCrLl30A.sLtry.cn
http://6kuH9xYC.sLtry.cn
http://yRxQ7Vjw.sLtry.cn
http://pAEC1l8n.sLtry.cn
http://Be4PKMFk.sLtry.cn
http://3Q0MFUGN.sLtry.cn
http://mUCSK6Jc.sLtry.cn
http://ZDmDekcr.sLtry.cn
http://fG7kR607.sLtry.cn
http://bR3NaZ0C.sLtry.cn
http://JFXDbHCc.sLtry.cn
http://nDjS4GfF.sLtry.cn
http://www.dtcms.com/a/136786.html

相关文章:

  • 数据中台(大数据平台)之数据仓库建设
  • 蓝桥杯 9. 九宫幻方
  • prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?
  • 聊聊Spring AI Alibaba的MarkdownDocumentParser
  • Go语言实现OAuth 2.0认证服务器
  • 独家!美团2025校招大数据题库
  • 鸿蒙开发之嵌套对象更新
  • FPGA_YOLO(四)用HLS实现循环展开以及存储模块
  • 【WPF-VisionMaster源代码】应用OpenCVSharp仿Vision Master页面开发的软件源代码
  • C++学习之游戏服务器开发git命令
  • [MERN] 项目实战】MERN Multi-Vendor 电商平台开发笔记(v1.0 初版结构 + 技术实践)
  • 树莓派超全系列教程文档--(28)boot文件夹内容
  • Ngrok 内网穿透实现Django+Vue部署
  • vscode连接windows服务器出现过程试图写入的管道不存在
  • AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • 【STM32-代码】
  • C#: 用Libreoffice实现Word文件转PDF
  • 磁芯为什么会有磁性?磁性材料的磁滞曲线还记得吗?
  • Vue2 nextTick
  • 算法——直接插入排序
  • vue3 defineExpose的使用
  • 工厂模式实现案例
  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON