绘制带箭头的线,计算相对复杂,多少是有点影响性能了。更简单的做法:初始、目标点用不同的点进行强调即可。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
<link href="ol/ol.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="ol/ol.js" charset="utf-8"></script>
</head>
<body>
<div id="map" style="width: 100%;height: 100%"></div>
<script>
var layerVector = new ol.layer.Vector({
source: new ol.source.Vector()
}); var map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.OSM(),
})
, layerVector
],
target: 'map',
view: new ol.View({
center: [12950000, 4860000],
zoom: 7
})
}); /**
* 采用闭包的写法,封装一个style
* @param resolution 比例尺(跟比例尺相关的一个量,暂不明确具体是什么)
* @returns {[*]}
*/
var featureStyles = function (resolution) {
let feature = this;
let geometry = feature.getGeometry(); let styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
color: 'green',
width: 8
})
})
]; /**
* 根据两个点的坐标,找出中间值,在中间绘制箭头图标,并且根据两个点,确定图标的角度
*
* @param start 开始的点
* @param end 结束的点
*/
function draw(start, end) {
let arrowLonLat = [(parseFloat(end[0]) + parseFloat(start[0])) / 2, (parseFloat(end[1]) + parseFloat(start[1])) / 2];
let dx = parseFloat(end[0]) - parseFloat(start[0]);
let dy = parseFloat(end[1]) - parseFloat(start[1]);
//旋转角度计算
let rotation = Math.atan2(dy, dx);
feature.set("inRotation", rotation);
//设置图标
styles.push(new ol.style.Style({
geometry: new ol.geom.Point(arrowLonLat),
image: new ol.style.Icon({
src: 'img/routearrow.png',
anchor: [0.75, 0.5],
size: [8, 8],
rotateWithView: true,
rotation: -rotation
})
}));
} /**
* 取a/b两个点的n等分点
* @param n 分母
* @param m 分子
* @param p1 a点
* @param p2 b点
* @returns {*[]}
*/
function dividedPoint(n, m, p1, p2) {
return [(p2[0] - p1[0]) / n * m + p1[0], (p2[1] - p1[1]) / n * m + p1[1]]
} /**
* 遍历所有的点
*/
geometry.forEachSegment(function (start, end) {
//求两点之间的距离,勾股定理的应用
let res = Math.sqrt(Math.pow(Math.abs(end[1] - start[1]), 2) + Math.pow(Math.abs(end[0] - start[0]), 2));
if (res !== 0) {
//根据比例尺,算出两点之间需要绘制的箭头数量,下面的50是通过测试,获得的用户体验较好的一个值
let n = Math.ceil(res / 50 / resolution);
let pre = start;
//从第一个点开始绘制,直到绘制完所有的箭头
let m = 1;
while (m <= n) {
let next = dividedPoint(n, m, start, end);
draw(pre, next);
pre = next;
m++;
}
}
});
return styles;
}; //一条线段
var pointFeature2 = new ol.Feature({
geometry: new ol.geom.LineString([[0, 0], [12950000, 4760000], [12850000, 4760000]])
}); //设置样式
pointFeature2.setStyle(featureStyles); layerVector.getSource().addFeature(pointFeature2);
</script>
</body>
</html>

OpenLayer——绘制带箭头的线的更多相关文章

  1. AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)

    手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...

  2. 如何在 Matlab 中绘制带箭头的坐标系

    如何在 Matlab 中绘制带箭头的坐标系 如何在 Matlab 中绘制带箭头的坐标系 实现原理 演示效果 完整代码 实现原理 使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系, 图1 ...

  3. 如何利用百度地图JSAPI画带箭头的线?

    百度地图JSAPI提供两种绘制多折线的方式,一种是已知多折线经纬度坐标串通过AddOverlay接口进行添加:另一种是通过在地图上鼠标单击进行绘制(鼠标绘制工具条库).目前这两种方式只能绘制多折线,并 ...

  4. Turtle绘制带颜色和字体的图形(Python3)

    转载自https://blog.csdn.net/wumenglu1018/article/details/78184930 在Python中有很多编写图形程序的方法,一个简单的启动图形化程序设计的方 ...

  5. iOS重写drawRect方法实现带箭头的View

    创建一个UIView的子类,重写drawRect方法可以实现不规则形状的View,这里提供一个带箭头View的实现代码: ArrowView.h #import <UIKit/UIKit.h&g ...

  6. Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker

    前面写了篇文章,mapboxgl实现带箭头轨迹线,介绍了如何基于mapboxgl实现类似高德地图导航轨迹效果. 下图是我基于leaflet实现的效果. 接下来分享一下在我基于leaflet实现该效果时 ...

  7. css实现带箭头选项卡

    这阵子在做一个web端项目中遇到一个问题,需要实现带箭头的选项卡点击可切换.起初没想太多,直接切一个向上的小箭头图片,外层div设置相同颜色的边框,再用相对定位和绝对定位.这种方法是可行的,但是因为手 ...

  8. 百度地图API绘制带头箭头的折线

    源代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co ...

  9. 纯Css绘制三角形箭头三种方法

    在制作网页的过程中少不了绘制类似图片的三角形箭头效果,虽然工程量不大,但是确实麻烦.在学习的过程中,总结了以下三种方法,以及相关的例子. 一.三种绘制三角形箭头方法 1.方法一:利用overflow: ...

  10. WebGL绘制有宽度的线

    WebGL中有宽度的线一直都是初学者的一道门槛,因为在windows系统中底层的渲染接口都是D3D提供的,所以无论你的lineWidth设置为多少,最终绘制出来的只有一像素.即使在移动端可以设置有宽度 ...

随机推荐

  1. 操作系统复习(updating)

    操作系统复习(updating) 1.进程和线程的区别是什么? 1)调度:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位 2)拥有资源:不论是传统操作系统还是设有线程的操作系 ...

  2. Windows 注册表是什么

    注册表的概念 历史发展 在 Windows 3.x 操作系统中,注册表是一个极小文件,其文件名为 Reg.dat,里面只存放了某些文件类型的应用程序关联,大部分的设置是被放在 win.ini.syst ...

  3. 干货!超实用的 Linux 初始化脚本

    咸鱼今天给大家分享一个无论是学习还是工作中都很实用的 Linux 系统初始化脚本,其实就是各种命令的集合 完整代码在文章最后哦 定义相关变量   配置 yum 镜像源 获取阿里云 yum 镜像源 判断 ...

  4. asp汉字转拼音小写

    <%'//获取汉字的首字母 ,ANSII编码function getpychar(char) dim tmpp:tmpp=65536+asc(char) if(tmpp>=45217 an ...

  5. CSS代码加滤镜将网站变为灰色(完整版)/怎么把网站变为灰色(完整版)

    CSS代码加滤镜将网站变为灰色/怎么把网站变为灰色 一.效果图 二.CSS代码 html{ background-color: rgb(238, 242, 245); background-blend ...

  6. selenium用executeAsyncScript执行异步脚本调用callback使用方法

    executeAsyncScript的作用: 就是把异步的js过程变成java同步的形式,方便java程序及时的接收到同步数据 1.cmdriver.manage().timeouts().scrip ...

  7. python ddt file_data

    # -*- coding: utf-8 -*-"""------------------------------------------------- File Name ...

  8. 使用clipboard.js复制文字+图片到微信后图片不显示问题处理

    使用clipboard.js复制文字 +图片,粘贴到微信不显示图片,而QQ可以. 解决方案:图片链接使用http,不要使用https. 使用clipboard.js实现复制功能 文字 +图片到微信客户 ...

  9. C#整合ActiveMQ与SpringBoot整合ActiveMQ数据间交互

    一.SpringBoot整合AvtiveMQ部分 1.引入ActiveMQ依赖 <dependency> <groupId>org.springframework.boot&l ...

  10. QML笔记——MouseArea的覆盖区域

    问题摘要: 初学QML,今天发现一个奇怪的现象,调用MouseArea的位置不同,结果不同. 1.一个简单的qml示例 Rectangle { id: root width: 320 height: ...