ArcGIS Maps SDK for JavaScript系列之二:认识Map和MapView

news2024/11/24 6:30:35

目录

  • Map
    • 创建一个 Map 对象的示例代码:
    • Map的常用属性
    • Map的常用方法
  • MapView
    • MapView的常用属性
    • MapView的常用方法

在 ArcGIS Maps SDK for JavaScript 中,Map 和 MapView 是两个重要的概念,用于创建和展示地图应用程序。

Map

Map 表示一个地图对象,它是地图应用程序的基础。Map 可以包含一个或多个图层(Layer),可以是基础底图图层、矢量图层、栅格图层或者任何其他类型的图层。Map 也可以包含地图符号化(Symbology)、标注、注记等信息。

创建一个 Map 对象的示例代码:

const map = new Map({
  basemap: 'streets-vector'
});

这里的代码创建了一个包含 ‘streets-vector’ 底图的地图对象。

Map的常用属性

  1. allLayers(图层)
    • 类型:Collection
    • 描述:地图中所有图层的展开集合(包含底图)
  2. basemap(底图)
    • 类型:String 或 Basemap 对象
    • 描述:指定地图的底图样式。可以是预定义的字符串(如 “streets”、“satellite”、“topo” 等),也可以是自定义的 Basemap 对象。
  3. ground(地面)
    • 类型:Ground 对象
    • 描述:用于指定地球表面的可视化。Ground 对象可以设置地面的类型,如 “world-elevation”、“world-topobathymetry” 等。
  4. layers(图层)
    • 类型:Layer 集合
    • 描述:包含当前地图上的所有图层。可以通过添加或移除 Layer 对象来调整地图上的图层显示,不包含底图。
// 创建一个具有默认底图的地图对象
const map = new Map({
  basemap: "streets"
});

// 添加一个图层到地图上
const layer = new TileLayer({
  url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
});
map.layers.add(layer);

// 创建一个地图视图
const mapView = new MapView({
  container: "viewDiv ",
  map: map,
  zoom: 10,
  center: [-122.4194, 37.7749]
});

上面的代码创建了一个具有 “streets” 底图的地图对象,然后添加了一个切片图层,并最后使用 MapView 在一个指定的 HTML 元素中展示地图。

Map的常用方法

  1. add(layer)(添加图层)

    • 参数:layer: Layer 对象
    • 描述:将指定的图层添加到地图上。可以通过此方法动态添加图层,并显示在地图上。
  2. remove(layer)(移除图层)

    • 参数:layer: Layer 对象
    • 描述:从地图上移除指定的图层。使用此方法可以在运行时移除地图上的图层。
  3. findLayerById(id)(根据 ID 查找图层)

    • 参数:id: String
    • 返回值:Layer 对象
    • 描述:根据指定的 ID 查找并返回地图上的图层对象。
  4. findLayersByName(name)(根据名称查找图层)

    • 参数:name: String
    • 返回值:Layer[](图层数组)
    • 描述:根据指定的名称查找并返回与名称匹配的图层对象数组。
  5. removeAll()(移除所有图层)

    • 描述:从地图上移除所有的图层。
  6. destroy()(销毁地图)

    • 描述:销毁地图对象及其相关资源。使用此方法可以清理地图对象,释放内存,特别是在不再需要地图时。

MapView

MapView 是用于显示 Map 对象的视图组件,它负责将地图渲染到 HTML 页面上。MapView 提供了用户与地图交互的功能,如平移、缩放、旋转等操作。MapView 还支持添加图形和弹出窗口,并提供了鼠标事件和交互控制等功能。

创建一个 MapView 对象的示例代码:

const mapView = new MapView({
  container: 'viewDiv',
  map: map,
  zoom: 10,
  center: [longitude, latitude]
});

这里的代码创建了一个 MapView 对象,将其渲染到 id 为 ‘viewDiv’ 的 HTML 元素中,并将前面创建的 Map 对象传入。还可以设置初始的缩放级别和中心坐标。

MapView的常用属性

  1. container(容器)

    • 类型:String 或 HTML 元素
    • 默认值:无
    • 描述:指定用于显示地图的 HTML 容器元素的 ID 或实际的 HTML 元素。地图将在该容器中进行渲染。
  2. map(地图)

    • 类型:Map 对象
    • 默认值:无
    • 描述:指定地图对象,代表 MapView 的地图内容。
  3. zoom(缩放级别)

    • 类型:Number
    • 默认值:无
    • 描述:指定地图的初始缩放级别。可以设置一个介于最小缩放级别和最大缩放级别之间的数字。
  4. center(中心坐标)

    • 类型:Number[]
    • 默认值:无
    • 描述:指定地图的初始中心点坐标。以经度和纬度的形式表示,如 [longitude, latitude]。
  5. rotation(旋转角度)

    • 类型:Number
    • 默认值:0
    • 描述:指定地图的初始旋转角度,以度数为单位。可以设置一个介于-360到360之间的数字。
  6. constraints(约束条件)

    • 类型:ViewpointConstraints 对象
    • 默认值:无
    • 描述:用于设置地图的约束条件,如最大缩放级别、最小缩放级别、可见范围等。

创建 MapView 对象,并配置属性的示例如下:

// 创建 Map 对象
const map = new Map({
  basemap: "streets"
});

// 创建 MapView 对象,并配置属性
const view = new MapView({
  container: "viewDiv", // 将地图渲染到指定的 HTML 元素中
  map: map, // 指定要显示的地图对象
  zoom: 10, // 设置初始缩放级别为 10
  center: [0, 0] // 设置初始中心点坐标为 [0, 0]
});

// 添加图层到地图
const layer = new TileLayer({
  url: "https://example.com/path/to/layer" // 设置图层的 URL
});
map.add(layer);

在上面的代码中,首先创建了一个 Map 对象,并指定了要使用的底图(basemap)。然后,创建了一个 MapView 对象,并在配置中设置了以下属性:

  • container:指定地图要渲染到的 HTML 容器元素的 ID 或实际的 HTML 元素(这里使用 mapContainer ID 的元素)。
  • map:指定要显示的地图对象,即之前创建的 Map 对象。
  • zoom:设置初始缩放级别为 10。
  • center:设置初始中心点坐标为 [0, 0]。

然后,创建了一个图层对象,并将其添加到地图上。

MapView的常用方法

1、goTo()(跳转)
将视图跳转到指定的视点。可以指定要跳转到的视点对象,包括缩放级别、中心点和旋转角度等。可以使用 options 参数来指定动画和持续时间等跳转的选项。
MapView的goto方法是一个非常实用的方法,它可以让我们将视图切换到指定的位置并缩放级别。
goto方法的基本语法:
goTo(target, options){[Promise]}
该方法接受两个参数:

  • target:要查看的目标位置。它可以是Geometry(如点、线或面)、Graphic(地图上的一个图形)或任何具有位置信息的对象。
  • options:可选参数,用于指定视图切换的选项,如动画过渡、缩放级别等。

goto方法返回一个Promise对象,该对象在视图切换完成后解析。可以通过.then()方法来处理视图切换完成后的操作。

使用goto方法将地图视图转到指定位置并进行缩放:

const target = {
  target: [-118.80500, 34.02700], // 目标位置的经纬度坐标
  zoom: 13 // 缩放级别
};

view.goTo(target)
  .then(() => {
    // 视图切换完成后的操作
    console.log('视图已切换完成');
  })
  .catch((error) => {
    console.error('切换视图时发生错误', error);
  });

在上面的代码中,我们首先创建了一个包含目标位置和缩放级别信息的对象。然后,我们调用view.goTo()方法,并传递该对象作为参数。在视图切换完成后,.then()方法中的回调函数将被调用,可以在其中执行视图切换完成后的操作。如果切换视图时发生错误,.catch()方法中的回调函数将被调用,可以在其中处理错误情况。

这里需要注意,goto方法也可以接受其他选项,如动画过渡时间、旋转角度等。可以在options参数中进行配置。详细的方法和参数说明可以参考ArcGIS API for JavaScript的官方文档。
2、on()(事件监听)

  • 参数:Object对象
  • 描述:注册监听地图事件。
    MapView的on方法是一个事件监听器,可以用于监听和处理地图事件。MapView的on方法返回一个Promise对象,可以通过调用该对象的then方法来处理事件。

MapView的on()方法常用的注册事件如下:

  • “click”:当用户在地图上单击时触发。
  • “double-click”:当用户在地图上双击时触发。
  • “drag”:当用户在地图上拖拽时触发。
  • “mouse-wheel”:当用户在地图上使用鼠标滚轮时触发。
  • “pointer-down”:当用户在地图上按下任意指针设备按钮(鼠标按钮、触摸屏等)时触发。
  • “pointer-move”:当用户在地图上移动任意指针设备时触发。
  • “pointer-up”:当用户释放任意指针设备按钮(鼠标按钮、触摸屏等)时触发。

on方法使用示例代码如下:

<template>
  <div id="viewDiv"> 
  </div> 
</template>

<script setup> 
import { onMounted } from 'vue'
import Map from '@arcgis/core/Map.js';
import MapView from '@arcgis/core/views/MapView.js';


onMounted(()=>{
  initArcGisMap()
})

const initArcGisMap = () => {
  const map = new Map({
    basemap: "topo-vector"
  });

  const view = new MapView({ 
    zoom: 4,
    container: "viewDiv",
    map: map
  });
  view.ui.components = []; 

  const target = {
    target:[-118.80500, 34.02700],
    zoom:13
  }
 view.goTo(target)
  .then(()=>{
    // 视图切换完成后的操作
    console.log('视图已切换完成');
  })
  .catch((error)=>{
    console.error('切换视图时发生错误', error);
  })

  view.on('click', (event) => {
    // 处理点击事件
    console.log('click事件触发')
  })
  view.on('double-click', (event) => {
    // 处理双击事件
    console.log('double-click事件触发')
  });
  view.on('drag', (event) => {
    // 处理拖拽事件
    console.log('drag事件触发')
  });
  view.on('mouse-wheel', (event) => {
    // 处理鼠标滚轮事件
    console.log('mouse-wheel 事件触发')
  });
  view.on('pointer-down', (event) => {
    // 在地图上按下任意指针设备按钮(鼠标按钮、触摸屏等)时触发事件
    console.log('pointer-down 事件触发')
  });
  view.on('pointer-move', (event) => {
    // 在地图上移动任意指针设备时触发事件
    console.log('pointer-move 事件触发')
  });
  view.on('pointer-up', (event) => {
    // 释放任意指针设备按钮(鼠标按钮、触摸屏等)时触发事件
    console.log('pointer-up 事件触发')
  });
  view.on('extent-change', (event) => {
    // 地图视图的范围发生变化时触发事件
    console.log('extent-change 事件触发')
  });
}
</script>
<style scoped>  
#viewDiv {
  width: 100%;
  height: 100vh; 
}
</style>

3、toMap()方法
MapViewtoMap()方法是用来将页面上的像素坐标转换为地图上的经纬度坐标的方法。它接受一个包含页面上的像素坐标的对象作为参数,并返回对应的地图上的经纬度坐标。
使用toMap()方法的示例:

<template>
  <div id="viewDiv">
  </div>
</template>

<script setup>
import { onMounted } from 'vue'
import Map from '@arcgis/core/Map.js';
import MapView from '@arcgis/core/views/MapView.js';  
let view
onMounted(() => {
  initArcGisMap()
})

const initArcGisMap = () => {
  const map = new Map({
    basemap: "topo-vector"
  });

  view = new MapView({
    center: [-118.80500, 34.02700],
    zoom: 4,
    container: "viewDiv",
    map: map
  });
  view.ui.components = [];

  view.on('click', handleMapClick)
}
  const handleMapClick = (event) => { 
    const screenPoint = {
        x: event.x,
        y: event.y
      }; 
    const mapPoint = view.toMap(screenPoint);
    console.log(`点击点的经纬度坐标为 经度:${mapPoint.latitude},纬度:${mapPoint.longitude}`)

  }
</script>
<style scoped>  #viewDiv {
    width: 100%;
    height: 100vh;
  }
</style> 

在上述代码中,当我们点击地图时,handleMapClick方法会被调用。在该方法中,我们通过event对象获取到用户点击的页面像素坐标。然后,使用view.toMap(screenPoint)方法将页面像素坐标转换为地图上的经纬度坐标。最后,将获取到的经纬度值打印到控制台。
运行代码,可以看到控制台输出的经纬度坐标
在这里插入图片描述

4、toScreen()方法
MapViewtoScreen()方法是用来将地图上的经纬度坐标转换为页面上的像素坐标的方法。它接受一个包含地图上经纬度坐标的对象作为参数,并返回对应的页面上的像素坐标。
使用toScreen()方法的示例

<template>
  <div id="viewDiv">
  </div>
</template>

<script setup>
import { onMounted } from 'vue'
import Map from '@arcgis/core/Map.js';
import MapView from '@arcgis/core/views/MapView.js'; 
import Point from "@arcgis/core/geometry/Point.js";

let view
onMounted(() => {
  initArcGisMap()
})

const initArcGisMap = () => {
  const map = new Map({
    basemap: "topo-vector"
  });

  view = new MapView({
    center: [-118.80500, 34.02700],
    zoom: 4,
    container: "viewDiv",
    map: map
  });
  view.ui.components = [];

  view.on('click', handleMapClick) 
}
  const handleMapClick = (event) => { 
    const mapPoint = new Point({
        x: event.mapPoint.longitude,
        y: event.mapPoint.latitude,
        spatialReference: view.spatialReference
      });

      const screenPoint = view.toScreen(mapPoint);
      console.log(`点击点的屏幕坐标为 x:${screenPoint.x},y:${screenPoint.y}`)

  } 
</script>
<style scoped>  #viewDiv {
    width: 100%;
    height: 100vh;
  }
</style>

上述代码中,当用我们击地图时,handleMapClick方法会被调用。在该方法中,我们通过event.mapPoint获取到用户点击位置的地图上的经纬度坐标。然后,创建一个Point对象表示地图上的坐标点,并指定相应的空间参考。接下来,使用view.toScreen(mapPoint)将地图坐标点转换为页面上的像素坐标。最后,将获取到的像素坐标在控制台打印出来。
运行程序,点击地图上任意位置,可以在控制台看到该点的屏幕坐标
在这里插入图片描述
好了,关于Map和MapView的相关内容就介绍到这里,关于ArcGIS Maps SDK for JavaScript的更多内容,咱们下次接着聊。

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

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

相关文章

2023-08-13 LeetCode每日一题(合并两个有序数组)

2023-08-13每日一题 一、题目编号 88. 合并两个有序数组二、题目链接 点击跳转到题目位置 三、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 …

Error: EACCES: permission denied, rename ‘/usr/local/lib/node_modules/appium‘

在使用npm uninstall -g appium卸载appium的过程中报错 Error: EACCES: permission denied, rename /usr/local/lib/node_modules/appium -> /usr/local/lib/node_modules/.appium-cfBVovI6 npm ERR! code EACCES npm ERR! syscall rename npm ERR! path /usr/local/lib/n…

gcc/g++ 编译选项详解

gcc/g 编译选项详解 文章目录 gcc/g 编译选项详解编译步骤gcc 与 g 区别gcc 命令的常用选项编译优化选项-O 优化-O1优化-O2-O0-Os-Ofast-Og-Oz-O 选项控制特定的优化 WarningsReference>>>>> 欢迎关注公众号【三戒纪元】 <<<<< 编译步骤 gcc 、…

Codeforces Round 891 (Div. 3)ABC

Codeforces Round 891 (Div. 3) 目录 A. Array Coloring题目大意思路代码 B. Maximum Rounding题目大意思路代码 C. Assembly via Minimums题目大意思路代码 A. Array Coloring 题目大意 给你一个包含 n n n个数字的数组&#xff0c;你的任务是判断这个数组是否可以划分成两个…

TCP/IP 下的计算机网络江湖

〇、引言 在当今数字化时代,计算机网络宛如广袤江湖,涵盖着五大门派:物理层、数据链路层、网络层、传输层和应用层。每个门派独具技能,共同构筑着现代网络的框架。物理层宛如江湖基石,将比特流传输;数据链路层如武林传承,组织数据帧传递;网络层则像导航大师,寻找传送路…

Web framework-Gin

一、Gin Go Web--Go Module 软件框架&#xff08;software framework&#xff09;&#xff0c;通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范&#xff0c;也指为了实现某个软件组件规范时&#xff0c;提供规范所要求之基础功能的软件产品。 框架就是&#…

【报童模型】随机优化问题二次规划

面对需求的不确定性&#xff0c;报童模型是做库存优化的常见模型。而标准报童模型假设价格是固定的&#xff0c;此时求解一个线性规划问题&#xff0c;可以得到最优订货量&#xff0c;这种模型存在局限性。因为现实世界中价格与需求存在一定的关系&#xff0c;本文假设需求q是价…

FreeRTOS源码分析-12 低功耗管理

目录 1 STM32低功耗管理概念及应用 1.1睡眠模式 1.2 停止模式 1.3 待机模式 2 Tickless低功耗管理 2.1 Tickless低功耗模式介绍 2.2 FreeRTOS低功耗模式配置 2.3 FreeRTOS低功耗模式应用 3 低功耗管理实际项目开发 3.1 低功耗设计必须要掌握的硬件知识 …

leetcode 1049. 最后一块石头的重量 II

2023.8.13 与分割等和子集类似&#xff0c;可以转化为0-1背包问题。 本题也是需要将数组元素分成两堆&#xff0c;区别在于本题需要使这两堆的差值最小&#xff0c;而之前那题是需要两堆差值为0。 使用之前的一维dp数组的思路&#xff0c;代码如下&#xff1a; class Solution…

开发一个RISC-V上的操作系统(八)—— 抢占式多任务(Preemptive Multitasking)

目录 一、抢占式多任务 二、代码实现 三、上板测试 本节的代码在仓库的 06_Preemptive_Muti_Task 目录下&#xff0c;仓库链接&#xff1a;riscv_os: 一个RISC-V上的简易操作系统 本文代码的运行调试会在前面开发的RISC-V处理器上进行&#xff0c;仓库链接&#xff1a;cpu_…

heap pwn 入门大全 - 1:glibc heap机制与源码阅读(上)

本文为笔者学习heap pwn时&#xff0c;学习阅读glibc ptmalloc2源码时的笔记&#xff0c;与各位分享。可能存在思维跳跃或错误之处&#xff0c;敬请见谅&#xff0c;欢迎在评论中指出。本文也借用了部分外网和其他前辈的素材图片&#xff0c;向各位表示诚挚的感谢&#xff01;如…

MySQL修改编码

插入中文乱码,我电脑上没有出现&#xff0c;我只是来记录一下 MySQL版本: 8.0.34Windows 查看编码 mysql中输入下面的命令 show variables like ‘character_%’; 乱码的一般是图片中划红线的部分不是utf8 character_set_database是设置数据库的默认编码的 character_set_ser…

面试热题(回文链表)

给定一个链表的 头节点 head &#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 回文链表类似于回文串&#xff0c;正读倒读的顺序是一样的&#xff0c;那么我们怎么去判断一个链表是否是回文链表呢&…

7.2.tensorRT高级(2)-学习深度学习中涉及的线程知识

目录 前言1. 多线程2. 问答环节2.1 线程启动相关问题2.2 线程启动函数参数相关问题 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次…

7. 延迟队列

延迟队列 7.1. 延迟队列概念 延时队列,队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上&#xff0c;延时队列中的元素是希望 在指定时间到了以后或之前取出和处理&#xff0c;简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的 元素的队列。 7…

第二章-算法

第二章-算法 数据结构和算法的关系 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 算法的特性 算法有五个基本特征&#xff1a;输入、输出、有穷性、确定性和可行性。 输入&#xff1a;算法具…

LVS集群和nginx负载均衡

目录 1、基于 CentOS 7 构建 LVS-DR 群集。 2、配置nginx负载均衡。 1、基于 CentOS 7 构建 LVS-DR 群集。 1.部署LVS负载调度器 1>安装配置工具 [rootnode6 ~]# yum install -y ipvsadm 2>配置LVS虚拟IP&#xff08;VIP地址&#xff09; [rootnode6 ~]# ifconfig ens…

Tesseract用OpenCV进行文本检测

我没有混日子&#xff0c;只是辛苦的时候没人看到罢了 一、什么是Tesseract Tesseract是一个开源的OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;OCR是一种技术&#xff0c;它可以识别和解析图像中的文本内容&#xff0c;使计算机能够理解并处理…

Dalsa线阵相机说明(Linea Color GigESeries 2k and 4K)

文章目录 一. Dalsa相机软件整体架构二. 相机编号说明以及软件要求三. 相机硬件参数三. 相机基本参数四. 软件参数设置列表1. Sensor Control Category2. I/O Control Category3. Counter and Timer Control Category4. Advanced Processing Control Category(1) 平场校正介绍(…

蚂蚁聚合支付系统源码完美版+附安装教程

这是我上个月花重金购买的四fang系统源码&#xff0c;现在分享给大家。 源码内附安装教程&#xff0c;20多项功能及安全方面的更新文档&#xff0c;源码说明等&#xff0c;小白也能轻松搭建。 能够轻松应对高并发&#xff0c;等以前版本无法应对的并发问题&#xff0c;也不会被…