openlayers 轨迹回放(历史轨迹),实时轨迹

news2024/11/24 14:08:05

本篇介绍一下使用openlayers轨迹回放(历史轨迹),实时轨迹

1 需求

  • 轨迹回放(历史轨迹)
  • 实时轨迹

2 分析

主要是利用定时器,不断添加feature

  • 轨迹回放(历史轨迹),一般是一次性拿到所有坐标点,按照时间间隔不断循环添加feature
  • 实时轨迹,一般是通过websocket监听,不断获取最新坐标点,根据上报的频率,可能需要抽样

3 实现

<template>
  <div id="map" class="map"></div>
</template>

<script setup lang="ts">
import { Feature, Map, View } from 'ol';
import { LineString, Point } from 'ol/geom';
import { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer';
import { get } from 'ol/proj';
import { Vector as VectorSource, XYZ } from 'ol/source';
import { Circle, Fill, Icon, Stroke, Style } from 'ol/style';
import iconSrc from '@/assets/image/truck.png';

const projection = get('EPSG:4326');

const layerTypeMap = {
  vector: ['vec', 'cva'], // [矢量底图, 矢量注记]
  image: ['img', 'cia'], // [影像底图, 影像注记]
  terrain: ['ter', 'cta'] // [地形晕渲, 地形注记]
};

const map = shallowRef();
const source = shallowRef<VectorSource>(new VectorSource());
const trace = ref();

onMounted(() => {
  initMap('image');
  initTrace();
});

const initMap = (layerType = 'image') => {
  const key = '替换为天地图key';

  // c: 经纬度投影 w: 墨卡托投影
  const matrixSet = 'c';
  map.value = new Map({
    target: 'map',
    layers: [
      // 底图
      new TileLayer({
        source: new XYZ({
          url: `https://t{0-7}.tianditu.gov.cn/DataServer?T=${layerTypeMap[layerType][0]}_${matrixSet}&tk=${key}&x={x}&y={y}&l={z}`,
          projection
        })
      }),
      // 注记
      new TileLayer({
        source: new XYZ({
          url: `https://t{0-7}.tianditu.gov.cn/DataServer?T=${layerTypeMap[layerType][1]}_${matrixSet}&tk=${key}&x={x}&y={y}&l={z}`,
          projection
        })
      }),
      new VectorLayer({
        source: source.value,
        style: new Style({
          stroke: new Stroke({
            color: 'rgba(228, 147, 87, 1)',
            width: 3
          })
        })
      })
    ],
    view: new View({
      center: [116.406393, 39.909006],
      projection: projection,
      zoom: 5,
      maxZoom: 17,
      minZoom: 1
    })
  });
};

const initTrace = () => {
  trace.value = [
    [110, 30],
    [110.2, 30],
    [110.4, 30.2],
    [110.8, 30.4],
    [111, 31],
    [111.3, 31],
    [111.6, 31],
    [111.9, 31],
    [112, 31],
    [112.3, 31],
    [112.5, 31],
    [112.8, 31],
    [113, 31],
    [114, 31],
    [115.3, 32],
    [115.5, 32],
    [115.8, 31.8],
    [116, 31.4],
    [116.2, 31.1],
    [116.5, 30.5],
    [115, 30.2],
    [114, 29.8],
    [113, 29.6],
    [112, 29.4],
    [111, 30.2],
    [110, 30.4],
    [109, 30.6],
    [108, 31]
   
  ];
  const iconFeature = new Feature({
    geometry: new Point(trace.value[0])
  });
  const icon = new Icon({
    crossOrigin: 'anonymous',
    src: iconSrc, // 或者new URL('../../assets/svg/truck.svg',import.meta.url).href
    color: 'red',
    opacity: 1,
    width: 30,
    height: 30
  });
  iconFeature.setStyle(
    new Style({
      image: icon
    })
  );

  source.value?.addFeature(iconFeature);
  let i = 0;
  const interval = setInterval(() => {
    if (trace.value[i + 1]) {
      iconFeature.setGeometry(new Point(trace.value[i + 1]));
      let arc = 0;
      if (
        (trace.value[i + 1][0] - trace.value[i][0] >= 0 &&
          trace.value[i + 1][1] - trace.value[i][1] >= 0) ||
        (trace.value[i + 1][0] - trace.value[i][0] < 0 &&
          trace.value[i + 1][1] - trace.value[i][1] > 0)
      ) {
        arc = Math.atan(
          (trace.value[i + 1][0] - trace.value[i][0]) / (trace.value[i + 1][1] - trace.value[i][1])
        );
      } else if (
        trace.value[i + 1][0] - trace.value[i][0] > 0 &&
        trace.value[i + 1][1] - trace.value[i][1] < 0 ||
				trace.value[i + 1][0] - trace.value[i][0] < 0 &&
        trace.value[i + 1][1] - trace.value[i][1] < 0
      ) {
        arc =
          Math.PI +
          Math.atan(
            (trace.value[i + 1][0] - trace.value[i][0]) /
              (trace.value[i + 1][1] - trace.value[i][1])
          );
      } 
     
      icon.setRotation(arc);//设置航向角(与正北的夹角)
      source.value?.addFeature(
        new Feature({
          geometry: new LineString([trace.value[i], trace.value[i + 1]])
        })
      );
      i++;
    } else {
      clearInterval(interval);
    }
  }, 200);
};
</script>
<style scoped lang="scss">
.map {
  width: 100%;
  height: 100%;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu安装qemu-guest-agent

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、安装二、启用服务三、效果总结 前言 QEMU Guest Agent&#xff08;简称QEMU GA或QGA&#xff09;在虚拟…

什么是NLP-自然语言处理

什么是NLP-自然语言处理 什么是NLP开通NLP新建项目创建模型 什么是NLP NPL是面向算法小白用户的行业自适应标注、训练和服务平台。该产品支持文本实体抽取、文本分类、关键短语抽取、情感分析、关系抽取、短文本匹配、商品评价解析等 NLP 定制化算法能力&#xff0c;用户无需拥…

御龙掘宝挂机零撸修仙类游戏定制开发源码部署

随着移动游戏的普及&#xff0c;御龙掘宝挂机零撸修仙类游戏定制开发源码部署应运而生。这款游戏结合了传统的修仙元素、挂机游戏的核心玩法以及零撸掘金的商业模式&#xff0c;为玩家提供了一个全新的游戏体验。本文将探讨御龙掘宝挂机零撸修仙类游戏定制开发源码部署的核心技…

linux 安装sftp及使用sftp工具类上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务&#xff1a; sudo yum install openssh-server2.启动 SSH 服务&#xff0c;并设置为开机启动&#xff1a; sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户&#xff0c;用于SFTP连接&#xff08;替换your_…

Linux:多线程中的互斥与同步

多线程 线程互斥互斥锁互斥锁实现的原理封装原生线程库封装互斥锁 死锁避免死锁的四种方法 线程同步条件变量 线程互斥 在多线程中&#xff0c;如果存在有一个全局变量&#xff0c;那么这个全局变量会被所有执行流所共享。但是&#xff0c;资源共享就会存在一种问题&#xff1…

Ilya出走记:SSI的超级安全革命

图片&#xff5c;OpenAI官网 ©自象限原创 作者丨罗辑、程心 和OpenAI分道扬镳以后&#xff0c;Ilya“神秘而伟大”的事业终于揭开了面纱。 6月20日&#xff0c;前OpenAI核心创始人 Ilya Stuskever&#xff0c;在官宣离职一个月后&#xff0c;Ilya在社交媒体平台公开了…

opencascade AIS_InteractiveContext源码学习2

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

神经网络学习5-非线性激活

非线性激活&#xff0c;即 这是最常用的 inplaceTrue 原位操作 改变变量本身的值&#xff0c;就是是否输入时若原本有值&#xff0c;是否更换 该函数就是表示&#xff1a;输入小于零时输出0&#xff0c;大于零时保持不变 代码如下&#xff1a; import torch from torch imp…

芋道源码 yudao-cloud 、Boot 文档,开发指南 看全部,破解[芋道快速开发平台 Boot + Cloud]

1、文档全部保存本地部署查看&#xff0c;真香 文档已抓取最新版本&#xff0c;2024.06.21。【唯一遗憾&#xff0c;表结构到2024.04月&#xff0c;已被限制放到知识星球】会员中心&#xff0c;支付中心&#xff0c;CRM&#xff0c;ERP&#xff0c;商城&#xff0c;公众号运行…

利氪科技拿下C轮超级融资,国产智能底盘黑马奔向黄金时代

“智能驾驶遗珠&#xff0c;国产替代富矿。” 这是海通证券在最近一期研报中&#xff0c;描述线控底盘产业的用语。它很巧妙地点明了&#xff0c;这个藏在车身之下的部分&#xff0c;拥有何种特征——稳坐技术体系的核心点位&#xff0c;拥有前景广阔的市场。 事实上&#xf…

生成式AI与开发者:威胁还是机遇?

近期&#xff0c;围绕生成式人工智能&#xff08;AI&#xff09;是否能取代程序员的讨论达到了前所未有的高度。百度的创始人李彦宏甚至预言&#xff0c;未来可能不再需要程序员这一职业。这个话题让很多开发者&#xff0c;包括有几年开发经验的我&#xff0c;感到不安。我记得…

【ArcGIS微课1000例】0120:ArcGIS批量修改符号的样式(轮廓)

ArcGIS可以批量修改符号的样式,如样式、填充颜色、轮廓等等。 文章目录 一、加载实验数据二、土地利用符号化三、批量修改符号样式四、注意事项一、加载实验数据 订阅专栏后,从私信查收专栏配套的完整实验数据包,打开0120.rar中的土地利用数据,如下图所示: 查看属性表: …

Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

项目实战 1.创建项目(sms) File->New Project->Django 稍等片刻&#xff0c;项目的目录结构如下图 项目创建后确认是否已安装Django和mysqlclient解释器&#xff0c;如何确认&#xff1f;file->Settings 如果没有请在Terminal终端输入以下命令完成安装 pip instal…

德璞资本:科技股波动解析,三巫日与日元效应下的市场走向

摘要 近期&#xff0c;美国科技股的表现令人担忧&#xff0c;标普500指数在科技股的拖累下出现下跌。亚洲股市也受到影响&#xff0c;特别是日本和韩国股市。随着期权到期日的临近&#xff0c;市场面临更大的波动风险。本文将详细分析科技股失去动能的原因、三巫日的影响及未来…

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…

华为重磅官宣:超9亿台、5000个头部应用已加入鸿蒙生态!人形机器人现身 专注AI芯片!英伟达挑战者Cerebras要上市了

内容提要 华为表示&#xff0c;盘古大模型5.0加持&#xff0c;小艺能力全新升级。小艺智能体与导航条融为一体&#xff0c;无处不在&#xff0c;随时召唤。只需将文字、图片、文档“投喂”小艺&#xff0c;即可便捷高效处理文字、识别图像、分析文档。 正文 据华为终端官方微…

策略模式:applicationContext.getBeansOfType()方法

applicationContext.getBeansOfType() 一般用来获取某个接口的所有实例Bean 方法定义如下&#xff1a; 入参一般是接口&#xff0c;即interface。响应是个Map结构&#xff0c;key bean在容器中的名称&#xff0c;value bean实列 开发步骤&#xff1a; 1.定义接口 2.定义…

“锟斤拷,烫烫烫,屯屯屯”的由来

在程序开发过程中&#xff0c;调试是不可或缺的一环。调试不仅可以帮助开发者发现错误&#xff0c;还能提供程序运行时的内部状态信息。然而&#xff0c;在调试过程中&#xff0c;开发者有时会遇到一些奇怪的字符。这些乱码通常是由内存状态的特殊标记&#xff0c;或者字符集不…

如何通过准确预测需求来减少PMC成为“夹心饼干”的风险?

在瞬息万变的商业环境中&#xff0c;产品物料控制&#xff08;PMC&#xff09;部门时常扮演着“夹心饼干”的角色&#xff0c;既要满足市场快速变化的需求&#xff0c;又要协调供应商、生产线等多方利益。如何减少这种风险&#xff0c;让PMC部门从“夹心困境”中脱颖而出&#…

【Git】 -- Part1 -- 基础操作

1. Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年开发&#xff0c;主要用于源代码管理。Git 允许多名开发者共同合作处理同一个项目&#xff0c;跟踪每个文件的修改&#xff0c;并且在必要时回滚到之前的版本。 Linus Torvalds是Linux…