openlayers文字随线的方向

2023-05-16

在不使用ol-ext时需要自己计算方向

效果:

 核心代码:

function styleArrow(start, end, title) {
			var arrowLonLat = [(end[0] + start[0]) / 2, (end[1] + start[1]) / 2];
			var dx = end[0] - start[0];
			var dy = end[1] - start[1];
			var rotation = Math.atan2(dy, dx);
			var rotationText = 0
			if(0<rotation && rotation<Math.PI/2 ){
				rotationText = -rotation
			}
			if(Math.PI/2<rotation && rotation<Math.PI){
				rotationText = Math.PI-rotation
			}
			if(-Math.PI/2<rotation && rotation<0 ){
				rotationText = -rotation
			}
			if(-Math.PI<rotation && rotation<-Math.PI/2 ){
				rotationText = Math.PI-rotation
			}
			// arrows
			return new ol.style.Style({
				geometry: new ol.geom.Point(arrowLonLat),
				image: new ol.style.Icon({
					src: './arrow.gif',
					anchor: [0.75, 0.5],
					rotateWithView: true,
					rotation: -rotation,
				}),
				text: new ol.style.Text({
					font: '15px Microsoft YaHei',
					text: title,
					rotation: rotationText,
					textBaseline: 'bottom',
					fill: new ol.style.Fill({
						color: '#369'
					}),
					stroke: new ol.style.Stroke({
						color: "#fff",
						width: 3
					}),
				})
			})
		}

完整代码:

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>线上绘制文字及箭头</title>
		<!-- https://openlayers.org/en/v6.15.1/examples/line-arrows.html -->
		<!-- 
		<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/css/ol.css" type="text/css">
		<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/build/ol.js"></script>
		 -->
		<link rel="stylesheet" href="./js/ol.css" />
		<script type="text/javascript" src="./js/ol.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

		<style type="text/css">
			html,
			body,
			#map {
				border: 0px;
				margin: 0px;
				padding: 0px;
				width: 100%;
				height: 100%;
				font-size: 13px;
			}
		</style>

	</head>
	<body>
		<div id="map"></div>
	</body>
	<script type="text/javascript">
		var wktformat = new ol.format.WKT();
		var tileLayer = new ol.layer.Tile({
			source: new ol.source.XYZ({
				url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'
			})
		});
		var vectorSource = new ol.source.Vector({
			features: []
		})

		function vectorStyle(feature) {
			var styles = [
				new ol.style.Style({
					fill: new ol.style.Fill({
						color: 'rgba(255, 0, 0, 0.2)'
					}),
					stroke: new ol.style.Stroke({
						color: '#ffcc33',
						width: 1
					}),
					image: new ol.style.Circle({
						radius: 7,
						fill: new ol.style.Fill({
							color: '#ffcc33'
						})
					}),
					// text: new ol.style.Text({
					// 	font: '13px Microsoft YaHei',
					// 	text: feature.get('name'),
					// 	fill: new ol.style.Fill({
					// 		color: '#666'
					// 	})
					// })
				})
			]
			
			var geometry = feature.getGeometry();
			console.log(geometry.getType())
			
			if (geometry.getType() == "MultiLineString") {
				geometry.getLineString().forEachSegment((start, end) => {
					// arrows
					styles.push(styleArrow(start, end, feature.get('name')))
				});
			} else if (geometry.getType() == "LineString") {
				var start = geometry.getCoordinates()[0]
				var end = geometry.getCoordinates()[1]
				// arrows
				styles.push(styleArrow(start, end, feature.get('name')))
			}
			
			return styles
		}
		function styleArrow(start, end, title) {
			var arrowLonLat = [(end[0] + start[0]) / 2, (end[1] + start[1]) / 2];
			var dx = end[0] - start[0];
			var dy = end[1] - start[1];
			var rotation = Math.atan2(dy, dx);
			var rotationText = 0
			if(0<rotation && rotation<Math.PI/2 ){
				rotationText = -rotation
			}
			if(Math.PI/2<rotation && rotation<Math.PI){
				rotationText = Math.PI-rotation
			}
			if(-Math.PI/2<rotation && rotation<0 ){
				rotationText = -rotation
			}
			if(-Math.PI<rotation && rotation<-Math.PI/2 ){
				rotationText = Math.PI-rotation
			}
			// arrows
			return new ol.style.Style({
				geometry: new ol.geom.Point(arrowLonLat),
				image: new ol.style.Icon({
					src: './arrow.gif',
					anchor: [0.75, 0.5],
					rotateWithView: true,
					rotation: -rotation,
				}),
				text: new ol.style.Text({
					font: '15px Microsoft YaHei',
					text: title,
					rotation: rotationText,
					textBaseline: 'bottom',
					fill: new ol.style.Fill({
						color: '#369'
					}),
					stroke: new ol.style.Stroke({
						color: "#fff",
						width: 3
					}),
				})
			})
		}
		
		var vectorLayer = new ol.layer.Vector({
			source: vectorSource,
			style: vectorStyle
		});
		var map = new ol.Map({
			controls: [],
			target: 'map',
			layers: [tileLayer, vectorLayer],
			view: new ol.View({
				center: transform([103.584297498027, 36.119086450265]),
				zoom: 4,
			})
		});
		// map.getView().fit(features[2].getGeometry());

		function transform(pois) {
			return ol.proj.transform(pois, 'EPSG:4326', 'EPSG:3857')
		}


		// 线
		var lineCoord = [
			[109.6399637062942, 36.10488480328604],
			[119.4837137062942, 42.51651033049882]
		];
		var line = new ol.geom.LineString(lineCoord);
		line.transform('EPSG:4326', 'EPSG:3857');
		// var f2 = new ol.Feature(line);
		var f2 = new ol.Feature({
			geometry: line,
			id: 2,
			name: '线1-右上'
		});
		vectorSource.addFeature(f2);
		console.log(wktformat.writeGeometry(line))
		console.log(wktformat.writeFeature(f2))
		console.log(line.getLength())

		var lineCoord2 = [
			[107.5305887062942, 34.55617638204109],
			[120.25715013341059, 27.888441634487776]
		];
		var line2 = new ol.geom.LineString(lineCoord2);
		line2.transform('EPSG:4326', 'EPSG:3857');
		// var f2 = new ol.Feature(line);
		var f22 = new ol.Feature({
			geometry: line2,
			id: 2,
			name: '线2-右下'
		});
		vectorSource.addFeature(f22);
		
		// 多线
		var multilineCoord = [
			[
				[103.45246156052698, 34.960539700465915],
				[98.81183763341058, 27.826278348695965]
			]
		];
		var multiline = new ol.geom.MultiLineString(multilineCoord);
		multiline.transform('EPSG:4326', 'EPSG:3857');
		// var f2 = new ol.Feature(line);
		var f23 = new ol.Feature({
			geometry: multiline,
			id: 2,
			name: '多线1-左下'
		});
		vectorSource.addFeature(f23);
		
		var multilineCoord2 = [
			[
				[97.75715013341059, 37.79053483981271],
				[88.1243397791778, 43.59537248307916]
			]
		];
		var multiline2 = new ol.geom.MultiLineString(multilineCoord2);
		multiline2.transform('EPSG:4326', 'EPSG:3857');
		// var f2 = new ol.Feature(line);
		var f24 = new ol.Feature({
			geometry: multiline2,
			id: 2,
			name: '多线2-左上'
		});
		vectorSource.addFeature(f24);
		

		map.on('click', (evt) => {
			console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
			vectorLayer.getFeatures(evt.pixel).then((features) => {
				var feature = features.length ? features[0] : undefined;
				if (feature) {
					console.log(feature.getProperties())
				}
			});
		});
	</script>
</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openlayers文字随线的方向 的相关文章

  • geoserver配合openlayers框架加载地图

    geoserver地图服务器如果搭建成功 xff0c 那么会有很多图层示例 这些图层可以用作练手示例 在实际工作中 xff0c 可能需要我们自己设计地图 xff0c 自己发布 xff0c 然后使用 这里以上一篇最后发布的中国地图为例 xff
  • 基于openlayers的最短路径规划

    之前的文章讲到了如何构建空间数据库 矢量数据如何入库 如何构建拓扑网络 如何自定义查询函数 如何构建wms服务 本文讲解如何基于openlayers晚上最短路径规划功能 一 基于openlayers3 1 构建网页 这里只是一个简单的网页
  • OpenLayers基础教程——popup弹出框

    1 前言 在OpenLayers中 一般使用ol Overlay实现popup弹出框 弹出框一般用于显示地图上兴趣点的一些属性信息 如下图所示 下面开始介绍实现方法 2 准备测试数据 在SqlServer中新建一张省会数据表 Provinc
  • GeoServer style(sld)中文乱码解决方法

    在说明这个问题之前 有三点需要明确 一是创建New style时 网页中文本框内的内容才是最终会应用到GeoServer的sld内容 这与本地sld文件没有关系 二是xml的encoding定义的编码不一定和文件编码 文件的字符编码 一致
  • GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

    GeoServer发布的地图服务结构如下 必须创建一个工作区 该工作区下可以存放多组无关数据 也就是说 工作区的作用就类似于一个文件夹 仅仅用于分类 在工作区下添加数据存储 数据存储即一组相关数据 通常 一个地区的地图可能是单个文件构成 也
  • OpenLayers与Bootstrap样式冲突的解决

    在引入Bootstrap响应式布局样式后 OpenLayers图层瓦片会显示异常 在页面中加入以下样式可以解决 参见 http openlayers org dev examples bootstrap html
  • 同一页面上具有相同选项的多个传单地图

    我对 leaflet js 还很陌生 我试图弄清楚如何将具有相同选项和图层集的相同地图分配给不同的 HTML 容器 而不必每次都删除并添加新的容器 我曾经处理 Open Layers 2 13 并且我有 map render div 每次我
  • 在 OpenLayers (KML) 中刷新/重绘图层网络链接自动刷新

    TLDR我想刷新计时器上的图层 以便它绘制新的 kml 数据 如更新链接 网络链接 到目前为止 我已经尝试过操作功能如下 function RefreshKMLData layer layer loaded false layer setV
  • 如何移动 OpenLayers.Layer.Markers 图层中的标记?

    如何以编程方式移动现有标记OpenLayers Layer Markers层 我似乎找不到合适的方法 这完全受支持吗 或者我必须使用Vector layer The marker moveTo 函数对我不起作用 我有纬度 经度坐标 如果您有
  • Openlayers 中的 KML 图层无法在本地主机上运行

    我在 OpenLayers 中渲染 KML 文件时遇到奇怪的问题 这似乎很容易 但事实并非如此 我从这里开始一个例子OpenLayer 示例 我想添加我自己的 KML 它不起作用 我使用绝对 URL 创建了该示例的本地副本 如下所示
  • TypeScript + OpenLayers 7:设置和获取功能 ID 失败

    我有一张带有两个自定义按钮的地图 绘制多边形 and 删除功能 它允许我绘制和删除绘制的多边形 此外 我为多边形创建了一个测量叠加 显示了它们的面积 见图 为了识别多边形和覆盖层之间的连接 我尝试在它们上设置相同的 id 以便在删除多边形时
  • Open Layers 6 的 typescript 类型定义

    The types openlayers包裹 https www npmjs com package types openlayers https www npmjs com package types openlayers 只提供类型定义
  • OpenLayers 动画 getView().fit()

    我一直在研究 openlayers 的动画功能 我可以看到使用缩放到给定点和分辨率是多么简单 view animate center position zoom 11 但我不知道如何制作动画 map getView fit extent m
  • 有没有办法使用 OpenLayers 更改 openstreetmap 中某些要素的颜色?

    我正在使用 OpenLayers 来显示 openstreetmap 有没有办法编辑地图上的某些功能 例如改变水的颜色 消除国家之间的边界等 如果不能使用 JavaScript 来完成 我猜还有其他方法可以做到这一点 比如托管您自己的地图版
  • 使用 asp.net 和 iis 在 geoserver 中进行身份验证

    我不知道这是否是一个愚蠢的问题 但是如何将 asp net 身份验证与 openlayers 结合 我创建了一个登录页面来在 openlayers 中进行身份验证 在 c 中 服务器端 这是我的代码 Uri uri new Uri http
  • OpenLayers 通过 Popups 窃取点击事件

    为什么 FramedCloud 弹出窗口会窃取弹出窗口内的点击事件 current popup new OpenLayers Popup FramedCloud featurePopup f geometry getBounds getCe
  • 如何使用openlayers在浏览器中显示高分辨率图像

    我正在尝试使用 openlayers 5 在浏览器中显示高分辨率图像 我找到了一个有关如何使用 Zoomify 创建图像图块并使用 openlayers 地图渲染它的示例 但我无法将它用于我自己的形象 我对此完全陌生 我问的问题可能很琐碎
  • 在 Openlayers 中单击地图外部时如何激活功能 + 弹出窗口?

    我正在重新解析已加载到地图上的 KML 类似于此处的示例 http openlayers org dev examples sundials html http openlayers org dev examples sundials ht
  • 如何在 OpenLayers 4 上添加点击事件?

    我需要将事件侦听器附加到 OpenLayers 4 中的功能 我已经尝试过feature on 点击 function 但它不起作用 如何将晒黑事件添加到功能中 先感谢您 没有click为功能注册的事件ol Feature目的 但click
  • 找不到模块:错误:无法使用 TypeScript 定义文件解析“openlayers”

    在使用 TypeScript 的 Visual Studio 2017 React 应用程序中 有一个使用 OpenLayers v4 6 5 的组件 Map tsx package json 文件加载 types openlayers 和

随机推荐

  • Linux+vscode 客户端通过代码操作远程服务器端数据库(MySQL)

    这篇文章解决两个问题 xff1a 1 在Linux系统下使用vscode用C C 43 开发客户端程序时 xff0c 如何调用mysql库函数 xff1b 2 客户端与远程服务器端的MySQL连接时 xff0c 需要做哪些前期准备工作 xf
  • put操作提示 No such file or directory

    https blog csdn net weixin 33875839 article details 86128344
  • IDEA导入lib目录下的jar包

    https blog csdn net u010286027 article details 85248719 ops request misc 61 amp request id 61 amp biz id 61 102 amp utm
  • MIPS、ARM、X86三大架构

    MIPS ARM X86三大架构 RISC平台的发展已经有长达几十年的历史了 其最早诞生于80年代的MIPS主机 xff0c 随着技术的不断发展 xff0c RISC平台的应用领域逐步扩展 xff0c 小到手机 xff0c 大到工控设备都可
  • 报错:Diamond types are not supported at language level ‘6‘

    在编译时报错 xff1a 这主要是1 6版本的javac exe编译器不支持菱形运算符 xff1b 解决办法 xff1a 1 修改设置settings和项目结构Project Structure中的JDK版本设置 配置IDEA编译器版本 2
  • Ubuntu18.04.3虚拟机安装步骤

    Ubuntu18 04 3虚拟机安装步骤 xff08 图文教程 xff0c 非常详细 xff01 xff01 xff01 xff09 丶无殇的博客 CSDN博客 ubuntu18虚拟机安装
  • 信号包络

    将一段时间长度的高频信号的峰值点连线 xff0c 就可以得到上方 xff08 正的 xff09 一条线和下方 xff08 负的 xff09 一条线 xff0c 这两条线就叫包络线 包络线就是反映高频信号幅度变化的曲线 对于等幅高频信号 xf
  • 归一化函数normalize详解

    opencv 2 归一化函数normalize详解 1 归一化定义与作用 归一化 就是要把需要处理的数据经过处理后 xff08 通过某种算法 xff09 限制在你需要的一定范围内 首先归一化是为了后面数据处理的方便 xff0c 其次是保证程
  • 多态性之编译期多态和运行期多态(C++版)

    多态性之编译期多态和运行期多态 C 43 43 版 C 43 43 中最为经典的就是多态性 xff0c 多态性充分体现了面向对象的思想 xff0c 并且是C 43 43 与C的最大区别之一 多态性分为编译期多态和运行期多态 xff0c 也称
  • SVM 原理详解,通俗易懂

    看了该作者的文章 xff0c 瞬间膜拜了 xff01 讲得太好了 xff01 转自 xff1a http www blogjava net zhenandaci category 31868 html xff08 一 xff09 SVM的简
  • 线阵相机学习笔记(一)

    1 GigE Vision GigE Vision是由自动化影像协会AIA Automated Imaging Association 发起指定的一种基于千兆以太网的图像传输的标准 具有传输距离长 xff08 无中继时100米 xff09
  • 如何做一个软件项目经理? ----写给公司所有的开发人员

    第一部分 xff1a 软件项目经理的要求 首先是一个管理者 xff0c 其次熟悉某些工具 xff0c 某几种语言 xff0c 行业背景 xff0c 项目管理技能 软件项目经理面临的恶劣环境 xff0c 我们绝大部分软件企业运行在相对混乱的状
  • vector介绍和基本使用

    文章目录 一 vector介绍二 vector使用 1 constructor 2 iterator 3 capacity 4 Element access 5 Modifiers 三 vector迭代器失效问题 一 vector介绍 ve
  • PELCO(派尔高)协议解析及下载(转载)

    PELCO xff08 派尔高 xff09 协议解析及下载 沈雪瑜 在IBMS接口开发 中 xff0c 我们需要用到一些常用的协议 xff0c 而PELCO 派尔高 的监控器材在我国有很广泛的应用 PELCO有自己的传输控制协议 xff0c
  • STM32&nbsp;HAL库&nbsp;STM3…

    原文地址 xff1a STM32 HAL库 STM32CUBEMX KEIL TIM1 PWM 四路输出可调 一 作者 xff1a 用户2797410335 硬件 xff1a TM32F407VET6 8M晶振 xff0c JLINK JT
  • 海康设备网络SDK开发NET_DVR_GetDeviceConfig

    由于官方的例子中没有关于NET DVR GetDeviceConfig的示例 xff0c 在此记录一下 NET DVR GET FIELD DETECTION 获取区域入侵侦测配置 xff0c 避免其他小伙伴踩坑 这里只记录主要代码 xff
  • geoserver热图

    1 参考 GeoServer发布Heatmap wenglabs 博客园 Rendering Transformations GeoServer 2 21 x User Manual 2 下载 GeoServer 及wps插件 xff0c
  • arcgis的lyr样式转qgis的sld样式

    需求 xff1a arcgis样式lyr要发布到geoserver 先说最终技术路线 xff1a qgis安装slyr插件 xff0c lyr转成xml xff0c 再通过xml配图后导出sld 避免的操作 xff1a lyr直接导出sld
  • httpclient海康ISAPI透传

    可以使用海康SDK调用NET DVR STDXMLConfig进行透传 xff0c 但是这种方式仍然比较麻烦 SDK的透传其实就是http的包装 xff0c 可以完全撇开海康SDK xff0c 也就是通过http的方式获取或者设置 xff0
  • openlayers文字随线的方向

    在不使用ol ext时需要自己计算方向 效果 xff1a 核心代码 xff1a function styleArrow start end title var arrowLonLat 61 end 0 43 start 0 2 end 1