Vue.js2+ArcGIS3五、加载 ArcGIS REST Services

Github

ArcGIS REST Services

加载 MapServer

带图层切换和功能。

加载 MapServer 可以使用 ArcGISTiledMapServiceLayer(切片服务图层)、ArcGISDynamicMapServiceLayer(动态服务图层)方式。底图使用 ArcGISTiledMapServiceLayer,有标注的地图服务使用 ArcGISDynamicMapServiceLayer。


<template>
  <div id="map-container"
    style="width:100%;height:100%;">
    <div
      style="position:absolute;right:50px;top:50px;z-index:999;width:200px;">
      <el-tree :data="treeData2"
        show-checkbox node-key="id"
        @check-change="handleCheckChange2"
        ref="tree2" highlight-current>
      </el-tree>
      <hr>
      <el-tree :data="treeData"
        :props="defaultProps"
        show-checkbox node-key="id"
        @check-change="handleCheckChange"
        ref="tree" highlight-current>
      </el-tree>
    </div>
  </div>
</template>
<script>
import { loadCss, loadModules } from 'esri-loader'
export default {
  name: 'MapServer',
  data() {
    return {
      SF311Layer: null,
      DamageAssessmentLayer: null,
      haveSublayers: null,
      defaultProps: {
        children: 'children',
        label: 'label',
      },
      treeData2: [
        {
          label: 'StoryMapPlaces5',
          id: 'StoryMapPlaces5',
        },
        {
          label: 'StoryMapPlaces7',
          id: 'StoryMapPlaces7',
        },
      ],
      treeData: [
        {
          label: 'Cities',
          id: 0,
        },
        {
          label: 'Highways',
          id: 1,
        },
        {
          label: 'States',
          id: 2,
        },
        {
          label: 'Counties',
          id: 3,
        },
      ],
      map: '',
      gisConstructor: {}, // gis 构造函数
      gisModules: [
        'dojo/_base/declare',
        'esri/layers/ArcGISTiledMapServiceLayer', // 切片服务图层
        'esri/layers/ArcGISDynamicMapServiceLayer', // 动态服务图层
        'esri/geometry/Extent', // 范围
        'esri/map',
      ],
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    /**
     * @name: 单个图层切换
     */
    handleCheckChange2() {
      let checked = this.$refs.tree2.getCheckedKeys()
      let allData = this.treeData2.map(item => item.label)
      allData.forEach(item => {
        let layer = this.map.getLayer(item)
        layer.setVisibility(false)
      })
      checked.forEach(item => {
        let layer = this.map.getLayer(item)
        layer.setVisibility(true)
      })
    },

    /**
     * @name: 图层切换(子图层)
     */
    handleCheckChange() {
      let checked = this.$refs.tree.getCheckedKeys()
      let layer = this.map.getLayer('DamageAssessment')
      layer.setVisibility(false)
      layer.setVisibility(true)
      layer.setVisibleLayers(checked)
    },

    /**
     * @name: 加载图层
     */
    loadLayersFun() {
      const layerList = [
        {
          url:
            'https://sampleserver6.arcgisonline.com/arcgis/rest/services/StoryMaps/StoryMapPlaces5/MapServer',
          id: 'StoryMapPlaces5',
          opacity: 1,
          visible: false,
          type: 'dynamic',
        },
        {
          url:
            'https://sampleserver6.arcgisonline.com/arcgis/rest/services/StoryMaps/StoryMapPlaces7/MapServer',
          id: 'StoryMapPlaces7',
          opacity: 1,
          visible: false,
          type: 'dynamic',
        },
        {
          url:
            'https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer',
          id: 'DamageAssessment',
          opacity: 0.5,
          visible: false,
          type: 'dynamic',
        },
      ]
      layerList.forEach(item => {
        if (item.type === 'dynamic') {
          let layer = new this.gisConstructor.ArcGISDynamicMapServiceLayer(
            item.url,
            {
              id: item.id,
              opacity: item.opacity || 1,
              visible: item.visible,
            }
          )
          this.map.addLayer(layer)
        }
      })

      let layer = this.map.getLayer('DamageAssessment')
      console.log(layer.layerInfos) // 通过 layerInfos 获取子服务失败,需要判断图层是否加载完成
      if (layer.loaded) {
        console.log(layer.layerInfos)
      } else {
        // eslint-disable-next-line no-undef
        dojo.connect(layer, 'onLoad', (layer) => {
          // 子图层数据加载完成可以动态设置 treeData
          console.log(layer.layerInfos)
        })
      }
    },

    /**
     * @name: 地图点击事件
     */
    mapClickFun() {
      this.map.on('click', event => {
        console.log(event)
      })
    },

    // 初始化地图
    init() {
      // 加载 css
      loadCss('https://js.arcgis.com/3.32/esri/css/esri.css')
      // 加载模块
      loadModules(this.gisModules, {
        url: 'https://js.arcgis.com/3.32/',
      })
        .then(this.initMap)
        .then(this.loadLayersFun)
        .then(this.mapClickFun)
    },
    initMap(args) {
      // 将 ArcGIS 的每个功能模块都存放到 gisConstructor 中
      for (let k in args) {
        let name = this.gisModules[k].split('/').pop()
        this.gisConstructor[name] = args[k]
      }

      this.map = new this.gisConstructor.map('map-container', {
        basemap: 'osm',
        logo: false,
        slider: true,
      })
      let extent = {
        xmin: -117.1839455,
        ymin: 32.68087830000002,
        xmax: -117.15035189999998,
        ymax: 32.732100979999984,
      }
      this.map.setExtent(
        new this.gisConstructor.Extent(
          extent.xmin,
          extent.ymin,
          extent.xmax,
          extent.ymax
        )
      )
    },
  },
}
</script>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 Vue2 中添加流动风场效果,需要使用 ArcGIS API for JavaScript。以下是一些步骤: 1. 安装 ArcGIS API for JavaScript: ``` npm install --save @arcgis/core ``` 2. 在 Vue 项目中引入 ArcGIS API for JavaScript: ```javascript import * as esriLoader from 'esri-loader'; esriLoader.loadModules([ "esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/symbols/SimpleLineSymbol", "esri/renderers/SimpleRenderer", "esri/layers/GraphicsLayer", "esri/Graphic", "esri/geometry/Polyline", "esri/symbols/ArrowSymbol3D", "esri/symbols/LabelSymbol3D", "esri/symbols/TextSymbol3DLayer", "esri/symbols/PolygonSymbol3D", "esri/layers/SceneLayer", "esri/symbols/SimpleFillSymbol", "esri/renderers/UniqueValueRenderer", "esri/symbols/TextSymbol", "esri/symbols/PictureMarkerSymbol", "esri/layers/MapImageLayer", "esri/layers/WebTileLayer", "esri/widgets/Legend", "esri/geometry/Point", "esri/symbols/SimpleMarkerSymbol", "esri/widgets/Search", "esri/widgets/Locate", "esri/tasks/Locator", "esri/widgets/Measurement", "esri/widgets/AreaMeasurement2D", "esri/widgets/DistanceMeasurement2D", "esri/layers/TileLayer", "esri/layers/ImageryLayer", "esri/layers/VectorTileLayer", "esri/widgets/Home", "esri/widgets/BasemapGallery", "esri/widgets/CoordinateConversion", "esri/widgets/Bookmarks", "esri/widgets/Print", "esri/tasks/support/Query", "esri/tasks/QueryTask", "esri/tasks/IdentifyTask", "esri/tasks/support/IdentifyParameters", "esri/tasks/support/Query", "esri/tasks/support/StatisticDefinition", "esri/widgets/Expand", "esri/core/watchUtils", "esri/geometry/SpatialReference", "esri/geometry/Extent", "esri/geometry/Polygon", "esri/geometry/geometryEngine", "esri/config", "esri/request", "esri/Color", "esri/geometry/support/webMercatorUtils", "esri/geometry/geometryEngineAsync", "esri/geometry/SpatialReference", "esri/layers/StreamLayer", ], { css: true }).then(([ Map, MapView, FeatureLayer, SimpleLineSymbol, SimpleRenderer, GraphicsLayer, Graphic, Polyline, ArrowSymbol3D, LabelSymbol3D, TextSymbol3DLayer, PolygonSymbol3D, SceneLayer, SimpleFillSymbol, UniqueValueRenderer, TextSymbol, PictureMarkerSymbol, MapImageLayer, WebTileLayer, Legend, Point, SimpleMarkerSymbol, Search, Locate, Locator, Measurement, AreaMeasurement2D, DistanceMeasurement2D, TileLayer, ImageryLayer, VectorTileLayer, Home, BasemapGallery, CoordinateConversion, Bookmarks, Print, Query, QueryTask, IdentifyTask, IdentifyParameters, StatisticDefinition, Expand, watchUtils, SpatialReference, Extent, Polygon, geometryEngine, esriConfig, esriRequest, Color, webMercatorUtils, geometryEngineAsync, SpatialReference2, StreamLayer ]) => { // 将这些模块作为参数传递给组件 // ... }) ``` 3. 创建一个 MapView 组件: ```javascript <template> <div class="map-container"> <div class="map" ref="map"></div> </div> </template> <script> export default { name: 'MapView', data() { return { map: null, view: null, streamLayer: null, windDirection: 0, windSpeed: 0, windVariation: 0, windLayerUrl: '' } }, mounted() { this.initMap(); }, methods: { async initMap() { const [Map, MapView] = await esriLoader.loadModules([ "esri/Map", "esri/views/MapView"]); // 创建地图 this.map = new Map({ basemap: "streets-navigation-vector" }); // 创建 MapView this.view = new MapView({ container: this.$refs.map, map: this.map, center: [-118.71511,34.09042], zoom: 9 }); // 在地图上添加流动风场图层 this.addStreamLayer(); }, async addStreamLayer() { const [StreamLayer] = await esriLoader.loadModules(["esri/layers/StreamLayer"]); // 风场图层 URL this.windLayerUrl = "https://services.arcgis.com/7JUzYtqTbU7kbDUo/arcgis/rest/services/Wind_Stream_Layer/FeatureServer/0"; // 创建从服务器动态下载数据的流动风场图层 this.streamLayer = new StreamLayer({ url: this.windLayerUrl, purgeOptions: { displayCount: 10000 }, renderer: { type: "simple", symbol: { type: "simple-line", color: [255, 255, 255, 0.5], width: 1, style: "solid" } } }); // 将图层添加到地图中 this.map.add(this.streamLayer); // 监听风向和风速的变化 this.streamLayer.on("update", this.updateWind); }, updateWind(event) { if (event) { // 获取风向、风速、风向变化量 this.windDirection = event.windDirection || 0; this.windSpeed = event.windSpeed || 0; this.windVariation = event.windVariation || 0; } // 根据风向和变化量计算箭头的偏移角度 const angle = this.windDirection + this.windVariation; // 创建箭头符号 const arrowSymbol = new ArrowSymbol3D({ size: 6, height: 20, width: 10, color: "red" }); // 创建标签符号 const labelSymbol = new LabelSymbol3D({ symbolLayers: [new TextSymbol3DLayer({ material: { color: "black" }, size: 20, text: `${this.windSpeed} mph` })] }); // 创建风向线符号 const lineSymbol = new SimpleLineSymbol({ color: "white", width: 2, style: "solid" }); // 创建面符号 const fillSymbol = new PolygonSymbol3D({ symbolLayers: [ { type: "extrude", size: 10, material: { color: "red" } } ] }); // 创建风向线 const polyline = new Polyline({ paths: [[[0, 0], [0, 30]]], spatialReference: { wkid: 4326 } }); // 旋转风向线并添加到箭头符号中 arrowSymbol.symbolLayers.add(new Symbol3DLayer({ symbol: lineSymbol.clone().rotate(angle), width: 10 })); // 添加箭头符号和标签符号到风场图层 event.features.forEach(feature => { feature.symbol = arrowSymbol; feature.labelSymbol = labelSymbol; feature.geometry = geometryEngineAsync.rotate(feature.geometry, angle, new Point({ x: feature.geometry.extent.center.x, y: feature.geometry.extent.center.y })); }); // 更新风场图层 this.streamLayer.refresh(); } } } </script> ``` 在这个例子中,我们使用了 `StreamLayer` 来实现流动风场效果。在 `addStreamLayer` 方法中,我们创建了一个 `StreamLayer` 对象,并将其添加到地图中。然后,我们监听 `StreamLayer` 的 `update` 事件来更新风向和风速,并计算箭头的偏移角度。最后,我们创建箭头、标签和风向线符号,并将它们添加到 `StreamLayer` 上的每个要素中。注意,这里我们使用了 `ArrowSymbol3D` 和 `LabelSymbol3D` 来创建箭头和标签符号。 在 `updateWind` 方法中,我们首先获取风向、风速和风向变化量,然后计算箭头的偏移角度。接着,我们创建箭头、标签、风向线和面符号,并将它们添加到要素中。最后,我们旋转风向线并更新风场图层。 这就是如何在 Vue2 中使用 ArcGIS API for JavaScript 添加流动风场效果的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值