前言

:::block-1
对于像GeoJSON、KML等地理数据格式的文件,最常用的方法都是通过VectorLayer进行渲染。除此之外,还可以使用VectorImage(矢量影像图层)进行渲染。本文主要介绍在客户端拖动上传GeoJSON、KML等文件,并采用VectorImage方式渲染图层。
:::

1. 矢量影像简介

:::block-1
矢量影像图层叫做VectorImage,采用这种方式加载图层的话,它会将矢量数据渲染为图像。使用VectorImage在平移和缩放过程中性能表现很好,但是点符号和文本会始终跟随视图旋转,并且像素在缩放过程中也会跟随动画缩放。官方推荐:为了更精确的渲染矢量数据,可以使用VectorLayer。
:::

:::block-1
与矢量影像图层相同,还有一个VectorLayer,这是常用的矢量图层。使用VectorLayer会将矢量数据渲染为矢量形式,能够提供精确渲染功能。在旋转过程中,视图上的点和标签始终保持垂直。但是对于数据量非常大的矢量数据,平移和缩放动画的性能可能会有影响。官方推荐:此时可以使用VectorImage
:::

2. 图层自定义属性

在图层配置选项中设置的任何自定义参数都会成为BaseObject对象的属性,意味着该自定义属性是可观察属性,并且具有getset访问器。例如设置图层属性title: "vectorImage",此时可以通过get进行访问。

const vectorLayer = new ol.layer.VectorImage({title: "vectorImage",source: vectorSource,wrapX: false
})
console.log("layer-title:", vectorLayer.get("title"))

3. 创建地图交互控件

通过DragAndDrop创建地图交互控件,然后监听addfeatures事件,将文件数据添加到地图上并缩放到图层范围,使用formatConstructors属性设置上传文件类型,主要有GPX、GeoJSON、KML等格式。然后在Map对象中使用interactions属性添加默认交互控件,因为Interactions类不是DragAndDrop类的子类,所以需要使用**extend**继承DragAndDrop类。

// ol 交互控件
const dragAndDropInteraction = new ol.interaction.DragAndDrop({formatConstructors: [ol.format.GPX,ol.format.GeoJSON,ol.format.KML]
})
// 地图交互控件
interactions: ol.interaction.defaults.defaults().extend([dragAndDropInteraction])

4. 监听地图移动事件

在上传文件成功,将数据添加至地图上之后,监听地图鼠标移动事件**pointermove**,在地图事件中可以获取到鼠标位置像素坐标,再通过地图方法forEachFeatureAtPixel得到目标要素,并设置其样式和弹出信息窗口,在鼠标移出时恢复默认样式。如何设置信息窗口样式请参考:“‘’‘’

// 监听鼠标移动事件
map.on('pointermove', evt => {if (evt.dragging) {// 若正在拖动文件,则返回return}const featureOver = map.forEachFeatureAtPixel(evt.pixel, feature => {if (!feature) {return}// 设置选中样式feature.setStyle(new ol.style.Style({stroke: new ol.style.Stroke({color: "red",width: 2.5})}))// 信息窗口属性const property = feature.getProperties()const position = map.getCoordinateFromPixel(evt.pixel)openPopupTable(property, popupColumns, position)return feature;})if (targetFeature && targetFeature !== featureOver) {// 恢复默认样式targetFeature.setStyle(defaultStyle)}targetFeature = featureOver
})

5. 完整代码

其中libs文件夹下的包需要更换为自己下载的本地包或者引用在线资源。

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>OpenLayers 渲染矢量影像</title><meta charset="utf-8" /><link rel="stylesheet" href="../../libs/css/ol9.2.4.css"><link rel="stylesheet" href="../../css/popup.css"><script src="../../js/config.js"></script><script src="../../js/util.js"></script><script src="../../js/popup.js"></script><script src="../../libs/js/ol9.2.4.js"></script><script src="../../libs/js/jszip.min.js"></script><script src="../../libs/js/shapefile.min.js"></script><style>* {padding: 0;margin: 0;font-size: 14px;font-family: '微软雅黑';}html,body {width: 100%;height: 100%;}#map {position: absolute;top: 50px;bottom: 0;width: 100%;}#top-content {position: absolute;width: 100%;height: 50px;line-height: 50px;background: linear-gradient(135deg, #ff00cc, #ffcc00, #00ffcc, #ff0066);color: #fff;text-align: center;font-size: 32px;}#top-content span {font-size: 32px;}</style>
</head><body><div id="top-content"><span>OpenLayers 渲染矢量影像</span></div><div id="map" title="地图显示"></div>
</body></html><script>//地图投影坐标系const projection = ol.proj.get('EPSG:3857');//==============================================================================////============================天地图服务参数简单介绍==============================////================================vec:矢量图层==================================////================================img:影像图层==================================////================================cva:注记图层==================================////======================其中:_c表示经纬度投影,_w表示球面墨卡托投影================////==============================================================================//const TDTImgLayer = new ol.layer.Tile({title: "天地图影像图层",source: new ol.source.XYZ({url: "http://t0.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + TDTTOKEN,attibutions: "天地图影像描述",crossOrigin: "anoymous",wrapX: false})})const TDTImgCvaLayer = new ol.layer.Tile({title: "天地图影像注记图层",source: new ol.source.XYZ({url: "http://t0.tianditu.com/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=" + TDTTOKEN,attibutions: "天地图注记描述",crossOrigin: "anoymous",wrapX: false})})// ol 交互控件const dragAndDropInteraction = new ol.interaction.DragAndDrop({formatConstructors: [ol.format.GPX,ol.format.GeoJSON,ol.format.KML]})const map = new ol.Map({target: "map",loadTilesWhileInteracting: true,view: new ol.View({center: [102.845864, 25.421639],zoom: 6.5,worldsWrap: false,minZoom: 1,maxZoom: 20,projection: 'EPSG:4326',}),layers: [TDTImgLayer],// 地图默认控件controls: ol.control.defaults.defaults({zoom: false,attribution: false,rotate: false}),// 地图交互控件interactions: ol.interaction.defaults.defaults().extend([dragAndDropInteraction])})map.on('click', evt => {console.log("获取地图坐标:", evt.coordinate)})let defaultStyle = undefinedfunction setInteraction() {if (dragAndDropInteraction) {map.removeInteraction(dragAndDropInteraction)}// 监听要素事件dragAndDropInteraction.on('addfeatures', evt => {const vectorSource = new ol.source.Vector({features: evt.features,wrapX: false})const vectorLayer = new ol.layer.VectorImage({source: vectorSource,wrapX: false})defaultStyle = vectorLayer.getStyle()map.addLayer(vectorLayer)map.getView().fit(vectorSource.getExtent())})map.addInteraction(dragAndDropInteraction)}setInteraction()// 展示属性信息const popupColumns = [{ name: "name", comment: "名称" }]let targetFeature = undefinedmap.on('pointermove', evt => {if (evt.dragging) {// 若正在拖动文件,则返回return}const featureOver = map.forEachFeatureAtPixel(evt.pixel, feature => {if (!feature) {return}feature.setStyle(new ol.style.Style({stroke: new ol.style.Stroke({color: "red",width: 2.5})}))const property = feature.getProperties()// console.log("属性信息:", property)const position = map.getCoordinateFromPixel(evt.pixel)openPopupTable(property, popupColumns, position)return feature;})if (targetFeature && targetFeature !== featureOver) {targetFeature.setStyle(defaultStyle)}targetFeature = featureOver})
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Feign 实战指南:从 REST 替代到性能优化与最佳实践

Feign 实战指南&#xff1a;从 REST 替代到性能优化与最佳实践 一 . Feign 替代 RestTemplate1.1 RestTemplate 方式调用存在的问题1.2 Feign 的介绍1.3 定义和使用 Feign 客户端1.3.1 引入依赖1.3.2 添加注解1.3.3 编写 Feign 的客户端进行接口声明1.3.4 测试小结 1.4 通过 PO…

什么是国际期货?期货交易平台搭建

国际期货&#xff08;International Futures&#xff09;&#xff0c;又称外盘期货或全球期货&#xff0c;是指在中国大陆以外的交易所进行标准化合约交易的金融衍生品市场。其核心特征、功能及与国内期货的区别如下&#xff1a; &#x1f4cd; 一、定义与核心特征 全球化交易…

考取华为HCIE-AI有什么用?

在人工智能技术重塑各行各业的浪潮中&#xff0c;掌握核心AI能力成为专业人士的制胜关键。华为推出的HCIE-AI Solution Architect&#xff08;华为认证ICT专家-AI解决方案架构师&#xff09;&#xff0c;正是面向这一领域顶尖人才设立的最高级别认证。主要是为了培养和认证掌握…

Maven 使用说明和配置

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言 Apache Maven (opens new window)是一个软件项目管理、构建和依赖工具。基于项目对象模型 (POM) 的概念&#xff0c;Maven 可以通过中央信息来管理项目的构建、…

【Docker管理工具】安装Docker容器自动更新工具Watchtower

【Docker管理工具】安装Docker容器自动更新工具Watchtower 一、Watchtower介绍1.1 Watchtower简介1.2 Watchtower使用注意1.3 Watchtower使用场景1.4 Docker容器介绍 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版…

AI优化SEO关键词精进

内容概要 随着人工智能技术的飞速发展&#xff0c;其在搜索引擎优化&#xff08;SEO&#xff09;领域的应用正引发深刻变革。本文将系统探讨AI如何革新传统的关键词优化策略&#xff0c;通过更智能的分析与匹配方法&#xff0c;显著提升内容在搜索结果中的可见度与排名。核心议…

canvas面试题200道

下面是一份 200 条关于 HTML5 Canvas 的面试题合集,适用于前端开发岗位的中高级工程师面试准备。内容涵盖基础概念、绘图操作、性能优化、动画实现、安全机制等多个方面,并附有参考答案或解析建议。 🧠 一、Canvas 基础知识(1-40) 1. 什么是 HTML5 Canvas? <canvas&…

Java 大视界 -- Java 大数据在智能安防视频监控系统中的目标轨迹预测与防范策略制定(325)

Java 大视界 -- Java 大数据在智能安防视频监控系统中的目标轨迹预测与防范策略制定&#xff08;325&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 驱动的安防视频数据采集与预处理架构1.1 多路异构视频流合规接入层&#xff08;GB/T 28181-2021 全协议适配&#xff…

【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示

我用夸克网盘分享了「lgbtq_rights_by_country数据集」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/aa0fa91491e8 摘要&#xff1a; 本文运用Python编程实现对LGBTQ权利相关数据的处理与可视化展示。通过直方图与地图两种可视化方式&#xff0c;分…

车载通信架构 --- ECU刷写与busoff原则

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

【windows处理技巧】如何缩小PDF

原因&#xff1a;近日输出的PDF太大&#xff0c;渲染需要较多的时间&#xff0c;所以需要缩小一下PDF。 操作工具&#xff1a;adobe acrobat pro 方法&#xff1a;导入--另存为--缩减 初始&#xff1a; 压缩后

OpenCV图像添加水印

一、前言 在数字图像处理中&#xff0c;为图片添加水印是一项常见且重要的技术。无论是版权保护、品牌宣传还是防止未经授权的使用&#xff0c;水印都能发挥重要作用。OpenCV作为一款强大的计算机视觉库&#xff0c;提供了丰富的功能来实现各种水印效果。本教程将详细介绍如何…

OpenCV CUDA模块设备层-----双曲正弦函数sinh()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV的CUDA 模块&#xff08;cv::cudev&#xff09;中的一个设备端数学函数&#xff0c;用于在 GPU 上对 uchar3 类型的像素值&#xff08;如R…

使用 Xinference 命令行工具(xinference launch)部署 Nanonets-OCR-s

使用Xinference命令行工具(xinference launch)部署Nanonets-OCR-s 一、核心优势与适用场景 通过xinference launch命令可直接在命令行完成模型部署,无需编写Python代码,适合快速验证或生产环境批量部署。 二、部署步骤:从命令行启动模型 1. 确认环境与依赖 已安装Xinf…

鸿蒙 List 组件解析:从基础列表到高性能界面开发指南

一、引言&#xff1a;列表布局 —— 鸿蒙应用的数据展示中枢 在鸿蒙应用开发体系中&#xff0c;列表布局是处理结构化数据展示的核心场景。从新闻资讯的信息流、电商平台的商品陈列到任务管理的待办事项&#xff0c;几乎所有中大型应用都依赖高效的列表组件实现数据可视化。鸿…

原生微信小程序中限制多选框(Checkbox)可选个数的实现详解

在实际业务场景中&#xff0c;我们经常会遇到表单中的复选框多选限制需求。例如最多只能选择 3 个爱好、标签、兴趣点等&#xff0c;这时就需要在微信小程序中手动控制 Checkbox 的选择行为。 本文将通过一个完整的示例&#xff0c;演示如何实现最多只能选择 N 个的 Checkbox …

OpenCV CUDA模块设备层-----线性插值函数log()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建线性插值访问器&#xff0c;支持对GPU内存中的图像数据进行双线性插值采样。主要应用于图像缩放、旋转等几何变换中需要亚像素级精…

Redis 单线程的“天花板”与集群的必要性

虽然 Redis 以其单线程模型&#xff08;主要是处理请求的核心逻辑&#xff09;带来了极高的性能和简洁性&#xff0c;但这并不意味着它没有瓶颈。 CPU 瓶颈&#xff1a;当业务逻辑复杂&#xff0c;或者 Redis 执行大量计算密集型操作&#xff08;比如使用 Lua 脚本进行复杂处理…

16.7 Prometheus+Grafana实战:容器化监控与日志聚合一站式解决方案

《Prometheus+Grafana实战:容器化监控与日志聚合一站式解决方案》 关键词:容器化监控、日志聚合、Prometheus、Grafana、ELK Stack、用户反馈收集 容器化监控与日志系统的架构设计 在 LanguageMentor Agent 生产部署中,监控系统需要覆盖以下维度: #mermaid-svg-I7cOqUK0i…

商务创业项目策划计划书PPT模版

创业商业融资计划书PPT模版&#xff0c;商务商业计划融资书PPT模版&#xff0c;创业融资计划书PPT模版&#xff0c;框架完整创业融资计划书PPT模版 商务创业项目策划计划书PPT模版&#xff1a;https://pan.quark.cn/s/d07d22408497