【vue3+ArcGIS5】web开发中的地图功能从入门到实战四:更改地图的图层样式

在上一篇文章的基础上,实现更改地图的样式,这里做一个下拉选择来切换从官网加载的各种样式,换肤功能

实现效果

实现步骤

  1. 安装一个下拉选择组件
json 复制代码
"vue3-select-component": "^0.16.2"
  1. 注册为全局组件
js 复制代码
//main.js
import VueSelect from "vue3-select-component";
import "vue3-select-component/styles";
...
app.component('VSelect', VueSelect)
...
  1. 在地图组件中加载样式资源
js 复制代码
// 更改地图样式
    async function changeMapStyle() {
        const basemapStylesEndpoint =
      "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self"; 
      const result = await esriRequest(basemapStylesEndpoint, {
        responseType: "json",
      })

      const json = result.data;
      console.log("🚀 ~ changeMapStyle ~ result:", result)
      json.styles.forEach((style) => {
        // if the style is complete and not deprecated, add it to the select item
        if (style.complete && !style.deprecated) {
          options.value.push({
            label: style.name,
            value: style.path,
          })
        }
  });
  1. 在地图初始化完成后加载这个下拉组件
js 复制代码
onMounted(() => {
    initMap()
    changeMapStyle()
})
  1. 组件布局
html 复制代码
<template>
    <h2>ArcGIS Maps SDK for JavaScript Tutorials: Display a map666</h2>
    <div id="container">
        <div ref="mapDiv" class="map-div">
        </div>
        <div class="select">
            <v-select
                :placeholder="placeholder"
                :options="options"
                v-model="selectedValue"
            >
            </v-select>
        </div>
    </div>
</template>
  1. 定位在地图的右上角
css 复制代码
<style>
   #container {
      height: 100%;
      margin: 0;
      position: relative;
    }
    .map-div {
        height: 100%;
    }
    .select{
        position: absolute;
        top: 10px;
        right: 10px;
        z-index: 999;
        width: 400px;
        height: 400px;
        z-index:33;
    }
</style>
  1. 监听下拉组件的切换事件,从新加载整个地图
js 复制代码
watch(selectedValue, (newValue) => {
  if (newValue) {
    baseMap.value = newValue;
    initMap();
  }
})

完整实现代码

js 复制代码
<script setup>
    import Map from "@arcgis/core/Map";
    import MapView from '@arcgis/core/views/MapView'
    import { onMounted, ref, watch } from "vue";
    import esriRequest from "@arcgis/core/request";
    const mapDiv = ref(null)
    const baseMap = ref('arcgis/topographic')
    let view;
    const initMap = () => {
        const map = new Map({
            basemap: baseMap.value,
        });

        view = new MapView({
            center: [-118.805, 34.020],
            zoom: 13,
            container: mapDiv.value,
            map: map
        });


        view.on('click', (event) => {
            console.log('点击事件:', event);
        });


        view.when(
            () => {
            console.log('地图加载成功')
            },
            (error) => {
            console.error('地图加载失败:', error)
            }
        )
    }

    const placeholder = '请选择一个选项'
    const selectedValue = ref('')

    const options = ref([])

    
    
    onMounted(() => {
        initMap()
        changeMapStyle()
    })


    // 更改地图样式
    async function changeMapStyle() {
        const basemapStylesEndpoint =
      "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self"; 
      const result = await esriRequest(basemapStylesEndpoint, {
        responseType: "json",
      })

      const json = result.data;
      console.log("🚀 ~ changeMapStyle ~ result:", result)
      json.styles.forEach((style) => {

        // if the style is complete and not deprecated, add it to the combobox
        if (style.complete && !style.deprecated) {
          options.value.push({
            label: style.name,
            value: style.path,
          })
        }
      });

      watch(selectedValue, (newValue) => {
        if (newValue) {
          baseMap.value = newValue;
          initMap();
        }
      })
    }
</script>

<template>
    <h2>ArcGIS Maps SDK for JavaScript Tutorials: Display a map666</h2>
    <div id="container">
        <div ref="mapDiv" class="map-div">
        </div>
        <div class="select">
            
            <v-select
                :placeholder="placeholder"
                :options="options"
                v-model="selectedValue"
            >
            </v-select>
        </div>
    </div>
</template>

<style>
   #container {
      height: 100%;
      margin: 0;
      position: relative;
    }
    .map-div {
        height: 100%;
    }
    .select{
        position: absolute;
        top: 10px;
        right: 10px;
        z-index: 999;
        width: 400px;
        height: 400px;
        z-index:33;
    }

</style>
相关推荐
小葛要努力6 小时前
创建vue2项目
程序人生·vue
七仔啊6 小时前
基于海康门禁的人员计数系统
vue
步十人1 天前
【Vue3】前置知识简单概述(包括ES6核心语法,模块化ESM以及npm基础)
arcgis·npm·vue·es6
有梦想的程序星空2 天前
【环境配置】Vue3项目离线化本地部署echarts全攻略
前端·javascript·vue·echarts
向日的葵0062 天前
vue路由(二)
前端·javascript·vue.js·vue
小妖6663 天前
Hydration completed but contains mismatches
javascript·vue·vuepress
lianyinghhh3 天前
FlowGame 从零上手:开源 AI 工作流编排框架与 Vue 3 接入实战
python·低代码·开源·vue·rag·flowgame·ai工作流编排
爱编程的小金3 天前
告别手写分页逻辑:usePagination 从 50 行到 3 行
javascript·vue·前端分页·alova·usepagination
ok406lhq4 天前
用 MonkeyCode 8 小时搭建自动化内容站:AI Coding 平台实战复盘
ci/cd·vue·ai编程·自动化部署·monkeycode
brycegao3214 天前
Tauri2+Vue3+Ollama 实战|依托 AI 协同开发全离线隐私记账桌面软件(开源)
人工智能·开源·vue·ai编程·tauri·ollama·桌面开发