【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>
相关推荐
志尊宝12 小时前
Vue3 零基础每日笔记(040):Vite 创建 Vue3 + TS 项目——企业标配从这一篇开始
笔记·vue·html·前端开发·软件开发
凤城老人17 小时前
从零手写开源私有云盘|Flask+Vue3+Electron全栈网盘,单容器一键部署
python·docker·electron·vue
球球不吃虾19 小时前
Nuxt在使用过程中的一些小总结(二)
前端·vue·nuxt
志尊宝1 天前
Vue3 零基础每日笔记(038):亲手封装 useDebounceFn 与 useThrottleFn——高频事件的流量阀
前端·javascript·vue·html·vue3
愛芳芳2 天前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue
梦想的颜色2 天前
【AI科普】AI 时代,纯 H5+CSS PK React & Vue:前端技术孰优孰劣深入剖析
ai·前端框架·大模型·vue·react·html5·vibecoding
志尊宝2 天前
Vue3 零基础每日笔记(043):defineModel 与 defineExpose 的 TS 用法——3.4+ 新 API 进阶
前端·javascript·vue·html·vue3
avi91112 天前
无厘头 -- 基于vue 公用状态机,已用于放置类篮球卡牌Game
中间件·vue·公用状态·文件间通信
半生过往2 天前
Vue i18n 国际化全套适配实战:一步一步从零到工程化落地
vue·il8n
志尊宝3 天前
Vue3 零基础每日笔记(035):什么是 Composables——mixin 之死与逻辑复用新方案
笔记·vue·html·前端开发·软件开发