ArcGIS在VUE框架中的构建思想

news2024/12/24 2:25:21

项目快要上线了,出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面,把关于地图方面的代码给优化一下。试运行的时候,客户说控制台有很多飘红的报错,他们很在意,虽然很不情愿,但能改的就给改了吧。

代码框架

使用的是VUE框架, vue 2.x 版本的,使用vue-cli脚手架进行搭建的。在package.json中,arcgis的版本为"@arcgis/core": "^4.23.1"

使用到的第三方库 

  "dependencies": {
    "@arcgis/core": "^4.23.1",
    "axios": "0.18.1",
    "core-js": "3.6.5",
    "echarts": "^4.5.0",
    "echarts-gl": "1.0.0-beta.6",
    "echarts-liquidfill": "^2.0.6",
    "element-ui": "2.15.7",
    "events": "^3.3.0",
    "js-cookie": "2.2.0",
    "lodash": "^4.17.21",
    "moment": "^2.29.1",
    "normalize.css": "7.0.0",
    "nprogress": "0.2.0",
    "path-to-regexp": "2.4.0",
    "qrcodejs2": "^0.0.2",
    "screenfull": "^4.2.1",
    "vue": "2.6.10",
    "vue-i18n": "^8.18.2",
    "vue-router": "3.0.6",
    "vuex": "3.1.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "4.4.4",
    "@vue/cli-plugin-eslint": "4.4.4",
    "@vue/cli-service": "4.4.4",
    "autoprefixer": "9.5.1",
    "babel-eslint": "10.1.0",
    "babel-plugin-dynamic-import-node": "2.3.3",
    "chalk": "2.4.2",
    "connect": "3.6.6",
    "eslint": "6.7.2",
    "eslint-plugin-vue": "6.2.2",
    "html-webpack-plugin": "3.2.0",
    "mockjs": "1.0.1-beta3",
    "runjs": "4.3.2",
    "sass": "1.26.8",
    "sass-loader": "8.0.2",
    "script-ext-html-webpack-plugin": "2.1.3",
    "serve-static": "1.13.2",
    "svg-sprite-loader": "4.1.3",
    "svgo": "1.2.2",
    "vue-template-compiler": "2.6.10"
  }

地图封装

将ArcGIS封装成一个组件,专门用来加载地图,一些事件分发处理。

DOM 

<template>
  <div style="width:100%;height:100%">
    <div id="map"  :style="sty">
    
    </div>
  </div>
</template>

Style

#map {
  height: calc(100vh);
}

 事件注册

在main.js中需要进行一个事件总线的注册

Vue.prototype.$mapEventBus = new Vue()

 然后在utils文件夹中创建一个文件,专门放置一些用得到的事件。比如这个文件名称为mapEvent.js

export default {
  cleanOverlay: 'cleanOverlay',
  hideDike: 'hideDike',
  showDikes: 'showDikes',
  showBillboard: 'showBillboard',
  /** 改变图层可见性 */
  changeLayerVisible: 'changeLayerVisible'
}

这里面就是一些事件类型,比如清除,隐藏堤坝,显示堤坝,显示广告牌,改变图层可见性等等。

然后在封装的时候引入这个文件。

import mapEvent from '@/utils/mapEvent'

当后续想添加事件,统一名称就行,不用来回在用到的地方去改字符串了。最好能从名称看出用途。随后就是对事件总线进行事件注册和监听。

      this.$mapEventBus.$on(mapEvent.cleanOverlay, (data) => {
        // 执行某些方法
      })

      this.$mapEventBus.$on(mapEvent.hideDike, (data) => {
        // 执行某些方法
      })

      this.$mapEventBus.$on(mapEvent.showDikes, (data) => {
        // 执行某些方法
      })

      this.$mapEventBus.$on(mapEvent.showBillboard, (data) => {
        // 执行某些方法
      })

当这些注册好之后,只要有其他页面,使用emit进行事件发送,那么就能拿到传递的data参数,再去执行对应的代码逻辑。某个页面触发hideDike和showBillboard为例。

this.$mapEventBus.$emit(mapEvent.hideDike)
this.$mapEventBus.$emit(mapEvent.showBillboard, ['layer', 78, 'rain'])

场景View

地图该有的事件总线注册完毕之后,就可以开始创建地图了,首先引入Map对象,创建一个地图对象。再根据需要的场景,创建对应的视图View,平面2D和立体3D是有不同的View对象的。

import Map from '@arcgis/core/Map'
import SceneView from "@arcgis/core/views/SceneView";
import MapView from "@arcgis/core/views/MapView";

const m = new Map({
    ground: "world-elevation",
    basemap: "topo-vector"
})

        // 3D场景的话,使用SceneView
        scene= new SceneView({
          container: 'map',
          map: m,
          zoom: 9,
          center:  [中心坐标值, 中心坐标值],
        })
        // 普通地图场景的话使用MapView
        view= new MapView({
          container: 'map',
          map: m,
          zoom: 10,
          center:  [中心坐标值, 中心坐标值],
        })

图层加载

 地图map创建好之后,开始为地图设置对应显示的layer。这里以天地图为例,图层类型有很多种,很多配置都是相同唯独一些type值不同,因此封装成一个方法function。下面的示例是加载WebTileLayer的一些简易封装配置,将其写在tdt.js中。wkid为参考坐标系,ArcGIS的官网有对这个值的解释,有特殊坐标系的场景,或者百度坐标系高德坐标系,这些值可能都需要更改。

切片信息可以单独写在一个js文件中tdtconfig.js,与tdt.js同级目录

export default {
  tileInfo: {
    rows: 256,
    cols: 256,
    origin: {
      x: -20037508.342787,
      y: 20037508.342787,
    },
    compressionQuality: 0,
    spatialReference: {
      wkid: 102113
    },
    lods: [
      {
        endTileCol: 31,
        endTileRow: 31,
        level: 5,
        resolution: 4891.96981024998,
        scale: 18489297.737236,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 63,
        endTileRow: 63,
        level: 6,
        resolution: 2445.98490512499,
        scale: 9244648.868618,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 127,
        endTileRow: 127,
        level: 7,
        resolution: 1222.992452562495,
        scale: 4622324.434309,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 255,
        endTileRow: 255,
        level: 8,
        resolution: 611.4962262812475,
        scale: 2311162.2171545,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 511,
        endTileRow: 511,
        level: 9,
        resolution: 305.74811314062373,
        scale: 1155581.10857725,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 1023,
        endTileRow: 1023,
        level: 10,
        resolution: 152.87405657031186,
        scale: 577790.554288625,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 2047,
        endTileRow: 2047,
        level: 11,
        resolution: 76.43702828515593,
        scale: 288895.2771443125,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 4095,
        endTileRow: 4095,
        level: 12,
        resolution: 38.218514142577966,
        scale: 144447.63857215625,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 8191,
        endTileRow: 8191,
        level: 13,
        resolution: 19.109257071288983,
        scale: 72223.81928607813,
        startTileCol: 0,
        startTileRow: 0,

      },
      {
        endTileCol: 16383,
        endTileRow: 16383,
        level: 14,
        resolution: 9.554628535644492,
        scale: 36111.909643039064,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 32767,
        endTileRow: 32767,
        level: 15,
        resolution: 4.777314267822246,
        scale: 18055.954821519532,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 65534,
        endTileRow: 65534,
        level: 16,
        resolution: 2.388657133911123,
        scale: 9027.977410759766,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 131069,
        endTileRow: 131069,
        level: 17,
        resolution: 1.1943285669555614,
        scale: 4513.988705379883,
        startTileCol: 0,
        startTileRow: 0,
      },
      {
        endTileCol: 262138,
        endTileRow: 262138,
        level: 18,
        resolution: 0.5971642834777807,
        scale: 2256.9943526899415,
        startTileCol: 0,
        startTileRow: 0,
      }
    ]
  },
}

然后在tdt.js中引入这个切片信息配置。 

import WebTileLayer from "@arcgis/core/layers/WebTileLayer";
import SpatialReference from "@arcgis/core/geometry/SpatialReference";
import Extent from "@arcgis/core/geometry/Extent";
import tileInfo from './tdtconfig';

function tdtLayer(type,visible){
  const url = `http://t0.tianditu.gov.cn/${type}_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${type}&STYLE=default&TILEMATRIXSET=w&TILEMATRIX={level}&TileRow={row}&TileCol={col}&format=tiles&tk=${天地图的token}`;
  const tiledLayer = new WebTileLayer({
    urlTemplate: url,
    subDomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
    spatialReference: new SpatialReference({
      wkid: 102113,
    }),
    fullExtent: new Extent({
      xmax: 20038088.3427892,
      xmin: -20038088.3427892,
      ymax: 20038088.3427892,
      ymin: -20038088.3427892,
      spatialReference: {wkid: 102113}

    }),
    initialExtent: new Extent({
      xmax: 13211664.142019678,
      xmin: 13077211.409266088,
      ymax: 2843822.418908416,
      ymin: 2810801.622689228,
      spatialReference: {wkid: 102113}
    }),
    tileInfo: tileInfo.tileInfo,
    visible
  });
  return tiledLayer;
}

export {
  tdtLayer,
}

 在正式使用的时候,引入这个tdt.js文件,使用其中的tdtLayer方法。可以通过传递不同的字符串,去加载不同类型的图层。比如vec,cva,img,cia,ter,cta。通过visible的布尔类型值,控制加载时的显示与隐藏。还可以考虑增加一个参数,来控制是否需要设置透明度opacity。

在原先他们一期的项目中,是没有多加visible的,他们在创建完成之后,手动设置layer.visible的值为false。其实这个可以在创建layer的时候就指定好。他们甚至还主动设置对应的layer.id值,我看了一下ArcGIS的官网,其实应该可以通过title来设置id值的,我还没主动尝试过。

这些图层通过tdtLayer创建完成后,便可以通过之前的地图对象m来进行批量添加了。

const layer1 = tdtLayer('vec');
const layer2 = tdtLayer('cva');
const layer3 = tdtLayer('img');
const layer4 = tdtLayer('cia');
const layer5 = tdtLayer('ter');
const layer6 = tdtLayer('cta');
m.layers.addMany([layer3, layer4])
m.layers.addMany([layer1, layer2, layer5, layer6])

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

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

相关文章

git 创建并配置 GitHub 连接密钥

前记&#xff1a; git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 | 仓库管理 ---- 系列工程笔记. Platform&#xff1a;Windows 10 Git version&#xff1a;git version 2.32.0.windows.1 Function&#xff1a; git 创建并配置 GitHub…

照片全屏水印轻松去除,让你的照片焕然一新

当需要处理带有全屏水印的照片时&#xff0c;想要去除照片全屏水印往往是一个让人感到棘手的问题&#xff0c;然而幸运的是现在有一些非常出色的一键去水印工具可供选择。这些工具操作简单易用&#xff0c;处理速度快&#xff0c;去除水印的效果也非常令人满意&#xff0c;基本…

如何进行开关电源能效(效率)测试?纳米软件电源测试系统如何助力?

开关电源在实际工作中输入与输出转换是有一定的能量损耗的&#xff0c;并不会完全无损耗转换&#xff0c;电源效率就是用来衡量能量转换损耗的一个重要指标。那么开关电源效率要如何测试呢? 电源效率是指输出功率与输入功率之比&#xff0c;计算公式如下&#xff1a; ​​​​…

阿里云服务器ECS实例规格族字母命名说明

阿里云服务器ECS实例命名规则&#xff1a;ecs.<规格族>.large字母含义命名说明&#xff0c;包括x86、ARM架构、GPU异构计算、弹性裸金属、超级计算集群SCC云服务器&#xff0c;c代表计算型、g代表通用型、r代表内存型、u代表通用算力型、e代表经济型e实例&#xff0c;阿里…

一键搞定!黑群晖虚拟机+内网穿透实现校园公网访问攻略!

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

成集云 | 人货客数据分析系统集成ERP | 解决方案

方案介绍 用友T是一款由用友畅捷通推出的新型互联网企业管理系统&#xff0c;它主要满足成长型小微企业对其灵活业务流程的管控需求&#xff0c;并重点解决往来业务管理、订单跟踪、资金、库存等管理难题。 成销云-人货客数据分析系统是一种针对零售、电商等行业的客户数据分…

使用EMD分解进行去噪

EMD分解去噪 对于掺杂噪声的原始信号&#xff0c;可以使用EMD分解&#xff0c;去除高频的IMF达到去噪效果。 验证代码 测试的IMF由c代码产生&#xff0c;具体链接可见C仿写emd分解代码 %% clear all; clc;%% raw load(result_VS\test.txt); imfs load(result_VS\imfs.txt…

2023年【制冷与空调设备运行操作】考试资料及制冷与空调设备运行操作考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年制冷与空调设备运行操作考试资料为正在备考制冷与空调设备运行操作操作证的学员准备的理论考试专题&#xff0c;每个月更新的制冷与空调设备运行操作考试试卷祝您顺利通过制冷与空调设备运行操作考试。 1、【单…

外汇天眼:群雄聚首,盈在世界!外汇模拟周赛火热进行中

你是否是新手幻想过在交易场上游刃有余&#xff1f;是否是资深玩家想在汇市一展身手&#xff1f;是否想成为像巴菲特那样叱咤风云的交易大神&#xff1f;现在机会来了&#xff01; 只要下载外汇天眼APP&#xff0c;参与外汇模拟比赛&#xff0c;就能与高手对决&#xff01;来一…

使用Apache和内网穿透实现私有服务公网远程访问——“cpolar内网穿透”

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

Android串口开发之使用JNI实现ANDROID和串口通信

导语&#xff1a;Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信&#xff0c;包括串口的打开、设置参数和读写数据等过程。 目录 一、背景知识二、环境准备三、创建Android串口项目四、串口通信相关代码实…

Android7.1 新增开机广播过滤(只有特定apk可以接收开机广播)

一、需求 对开机广播进行过滤&#xff0c;只有特定的apk才能接收开机广播&#xff08;包名白名单、或者包名前缀匹配&#xff09;。 二、需要修改的地方 对于广播的过滤&#xff0c;在frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java这个文件…

RCNN系列网络的理解

R-CNN 作者 &#xff1a; Ross Girshick FAST R-CNN 作者 &#xff1a; Ross Girshick FASTER R-CNN 作者 &#xff1a; Jian Sun MASK R-CNN 作者 &#xff1a;kaiming he 一…

第四章 输入输出 Pro

四、输入输出 1、字符输入输出函数 一、字符输出函数 一般形式 putchar() 二、字符输入函数 一般形式 cgetchar() 无参数 三、说明&#xff1a; (1)getchar&#xff08;)只能接受一个字符&#xff0c;以回车结束&#xff1b; (2)连续输入多个字符时&#xff0c;中间不用空格…

超微收购Nod.ai 提升开源AI软件实力 | 百能云芯

超微半导体AMD日前宣布签署最终协议以收购Nod.ai&#xff0c;拓展其在开源AI软件的实力。收购Nod.ai将带来经验丰富的团队&#xff0c;该团队开发领先业界的软件技术&#xff0c;能够加快为AMD Instinct资料中心加速器、Ryzen AI处理器、EPYC处理器、Versal系统单晶片&#xff…

2023年中国半导体检测设备发展概况分析:国产替代化进程预计将持续推进[图]

半导体检测设备是用于检测半导体器件的物理参数及性能的设备&#xff0c;可对制造过程中的半成品和成品芯片进行质量控制和性能测试。它们通常使用各种测试技术和方法&#xff0c;例如电学测试、光学测试、热学测试等&#xff0c;以评估器件的关键参数和功能。 半导体检测设备…

公司销售个人号如何管理?

微信管理系统可以帮助企业解决哪些问题呢&#xff1f; 一、解决聊天记录监管问题 1.聊天记录的保存&#xff0c;让公司的管理者可以随时查看公司任意销售与客户的聊天记录&#xff0c;不用一个一个员工逐一去看&#xff0c;方便管理&#xff1b; 2.敏感词监控&#xff0c;管理者…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 相应的后端也要做一些调整 1、启动流程修改如下&#xff1a; /*** 启动流程实例*/private R startProce…

乡村新业态 | 直播电商引领经济发展,拓世法宝AI智能直播一体机助推乡村振兴

党的二十大报告作出加快建设数字中国、全面推进乡村振兴的战略部署&#xff0c;为进一步加强数字乡村建设、全面推进乡村振兴指明了方向。近年来&#xff0c;随着乡村新业态新模式的不断涌现&#xff0c;以直播电商为代表的数字经济为各地的农村产业升级带来了新契机。各地政府…

类文件黄色时钟解决办法

类文件黄色时钟解决办法 有时候我们的类上面会有黄色时钟&#xff0c;如下图&#xff1a; 像这种情况怎么解决呢&#xff1f;我们可以把我们的模块对应的pom.xml文件假如到maven中&#xff0c;右键pom.xml文件&#xff0c;加入到Maven项目中&#xff0c;如下图&#xff1a; …