vue+arcgis api for js实现地图经纬网格显示

embedded/2025/1/19 21:35:34/

vue代码调用:

import { gridLineLatLng } from './js/mapGrids.js'export default {mounted(){// 显示经纬网格gridLineLatLng.currentMap = this.mapAndView// gridLineLatLng.isGetMapPageXmax = falsegridLineLatLng.init()},beforeDestroy() {// 删除经纬网格gridLineLatLng.destory()},}

详细实现代码 mapGrids.js:

/** * 地图网格工具js* */import Graphic from '@arcgis/core/Graphic.js'
import GraphicsLayer from '@arcgis/core/layers/GraphicsLayer.js'/** 地图经纬网格 */
let gridLineLatLng = {currentMap: null, // viewcurrentFeatureLayer: null, // 网格图层layerstationaryHandler: null,color: 'blue', // 网格颜色 '#6666ff'degree: 1, // 间隔度数,xmax: 0,isGetMapPageXmax: true, // 是否获取地图页面最右边的地图可见范围(最大经度)timer: null,init: function() {let gridLineLayer = gridLineLatLng.currentMap.map.findLayerById('gridLineLayer')if (!gridLineLayer) {gridLineLayer = new GraphicsLayer({id: 'gridLineLayer',graphics: [],spatialReference: gridLineLatLng.currentMap.spatialReference})gridLineLatLng.currentMap.map.add(gridLineLayer)} else {// 清理图层gridLineLayer.graphics.removeAll()}gridLineLatLng.currentFeatureLayer = gridLineLayerlet zoom = gridLineLatLng.currentMap.zoom // 获取当前地图缩放级别gridLineLatLng.degree = gridLineLatLng.getDegree(zoom)// 经纬度间隔let degree = gridLineLatLng.degree  // 数值越小,计算事件越长const decimalPart = degree.toString().split('.')[1]// 经纬度小数部分const fixedNum = decimalPart ? decimalPart.length : 0// 经纬度小数点后保留位数console.log('zoom:', zoom, ', increase degree:', degree)// 获取地图页面最右边的地图可见范围(最大经度)gridLineLatLng.xmax = 0if (gridLineLatLng.isGetMapPageXmax) {// 获取地图页面右上角的经纬度const html = document.getElementById('map-container')const screenPoint = {x: html.clientWidth,y: 0,spatialReference: gridLineLatLng.currentMap.spatialReference}const point = gridLineLatLng.currentMap.toMap(screenPoint)gridLineLatLng.xmax = point.x}if (zoom > 0 || zoom < 20) {let extent = gridLineLatLng.currentMap.extentlet ymax = extent.ymax // 当前视口最北点纬度let xmax = gridLineLatLng.xmax || extent.xmax // 当前视口最东点经度let ymin = extent.yminlet xmin = extent.xminlet lineSymbol = {type: 'simple-fill', outline: { color: gridLineLatLng.color,width: 1,style: 'dash'}}let textSymbol = {type: 'text',  color: 'white',haloColor: 'red',haloSize: '1px',text: '',xoffset: 0,yoffset: -10,font: {  size: 11,weight: 'bold'}}// 经线网格// for (let index = -180; index <= 180; index += degree) {for (let index = xmin + degree / 3; index <= xmax; index += degree) {let polyline = {type: 'polyline', paths: [[index, 90], [index, -90]],spatialReference: gridLineLatLng.currentMap.spatialReference}let lonLineGraphic = new Graphic({geometry: polyline,symbol: lineSymbol})// 添加到图层组中gridLineLatLng.currentFeatureLayer.graphics.add(lonLineGraphic)textSymbol.text = index.toFixed(fixedNum) + '°'const textGraphic = new Graphic({geometry: {type: 'point', longitude: index,latitude: ymax,spatialReference: gridLineLatLng.currentMap.spatialReference}, symbol: textSymbol})gridLineLatLng.currentFeatureLayer.graphics.add(textGraphic)}// 纬线网格// for (let index = -90; index <= 90; index += degree) {for (let index = ymin + degree / 3; index <= ymax; index += degree) {let polyline = {type: 'polyline', paths: [[-180, index], [180, index]],spatialReference: gridLineLatLng.currentMap.spatialReference}let lonLineGraphic = new Graphic({geometry: polyline,symbol: lineSymbol})// 添加到图层组中gridLineLatLng.currentFeatureLayer.graphics.add(lonLineGraphic)textSymbol.text = index.toFixed(fixedNum) + '°'textSymbol.yoffset = 4textSymbol.xoffset = -22const textGraphic = new Graphic({geometry: {type: 'point', longitude: xmax,latitude: index,spatialReference: gridLineLatLng.currentMap.spatialReference}, symbol: textSymbol})gridLineLatLng.currentFeatureLayer.graphics.add(textGraphic)}}// 添加范围变动监听,,动态生成网格gridLineLatLng.stationaryHandler = gridLineLatLng.currentMap.watch('stationary', status => {if (status) {if (gridLineLatLng.timer) {clearTimeout(gridLineLatLng.timer)}gridLineLatLng.timer = setTimeout(() => {if (gridLineLatLng.stationaryHandler) {gridLineLatLng.stationaryHandler.remove()}gridLineLatLng.init()}, 1000)}})},getDegree: function(zoom) {let degree = 0.01switch (zoom) {case 0:degree = 0.7breakcase 1:degree = 0.3breakcase 2:degree = 0.1breakcase 3:degree = 0.06breakcase 4:degree = 0.04breakcase 5:degree = 0.02breakcase 6:degree = 0.009breakcase 7:degree = 0.006breakcase 8:degree = 0.003breakdefault:degree = 0.01break}return degree},destory: function() {// 移除地图事件if (gridLineLatLng.stationaryHandler) {gridLineLatLng.stationaryHandler.remove()}// 移除图层gridLineLatLng.currentMap.map.remove(gridLineLatLng.currentFeatureLayer)}
}export {gridLineLatLng
}

实现思路可参考:
vue+leaflet实现地图网格(https://blog.csdn.net/qq_41441896/article/details/131470559)


http://www.ppmy.cn/embedded/155314.html

相关文章

YOLOv11实战行人跌倒识别

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对行人跌倒数据集进行训练和优化&#xff0c;该数据集包含丰富的行人跌倒图像样…

BEVFusion论文阅读

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准&#xff0c;当前的方法依赖于激光雷达传感器的点云作为查询&#xff0c;以利用图像空间的特征。然而&#xff0c;人们发现&#xff0c;这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…

【Unity踩坑】Unity中提示缺少Visual Studio组件

问题&#xff1a; 在Unity中选择UWP平台时&#xff0c;提示Visual Studio缺少组件。 Selected Visual Studio is missing required components and may not be able to build the generated project. 解决方案&#xff1a; 在Visual Studio Installer里&#xff0c;安装上&quo…

大语言模型的语境中“越狱”和思维链

大语言模型的语境中“越狱”和思维链 越狱(Jailbreaking) 含义:在大语言模型的语境中,“越狱”是指用户试图绕过语言模型的安全限制和使用规则,让模型生成违反伦理道德、包含有害内容(如暴力、歧视、恶意软件代码等)的输出。这些安全限制是由模型开发者设置的,目的是确…

Node.js path.join

path.join 是 Node.js 中的 path 模块提供的一个方法&#xff0c;用于连接多个路径片段并规范化路径。与 path.resolve不同&#xff0c;path.join 只是将给定的路径片段合并为一个单一的路径&#xff0c;并且不会自动转换为绝对路径&#xff0c;它只会拼接并返回一个规范化的路…

深入了解 systemd:Linux 系统的启动与管理大师

深入了解 systemd&#xff1a;Linux 系统的启动与管理大师 在现代 Linux 系统中&#xff0c;systemd 已经成为不可或缺的核心组件。它不仅是一个初始化系统&#xff0c;还包含了一系列强大而实用的工具&#xff0c;用于管理服务、进程、日志以及其他系统资源。今天&#xff0c…

2.用户登录流程

用户登录流程 1&#xff09;前端发送获取验证码请求 2&#xff09;后端生成验证码&#xff0c;同时将生成的内容分成两个部分&#xff0c;一个是image&#xff0c;一个是code&#xff0c;例如 image里记录 1 1 &#xff1f;&#xff0c;code里记录2 3&#xff09;后端为ima…

React+Cesium基础教程(001):创建基于React的Cesium项目及对Cesium进行基本配置

文章目录 01-基于react的cesium项目创建基于React的Cesium项目Cesium基本配置设置默认启动视角完整项目下载地址01-基于react的cesium项目 创建基于React的Cesium项目 创建react项目: create-react-app react-cesium-basic安装[cesium1.93.0]版本: npm install cesium@1.…