vue+argis3.x 初始化

 整体思路:将arcgis API方法放入到vuex中。方便全局调用。

vue新建就不多说了。

引用arcgis,需要先安装esri-loader。

安装命令 

npm install --save esri-loader

yarn add esri-loader

安装完成后,开始正式步骤了:

1.文件夹引用esri-loader;

import store from '@/store'
import { loadModules } from "esri-loader";

2.引用API,提交到vuex中

 loadModules() {
        let self = this;
        let loadModulesArr = [
            "esri/map",
            "esri/geometry/Extent",
            "esri/layers/ArcGISTiledMapServiceLayer", // 瓦片图
            "esri/layers/ArcGISDynamicMapServiceLayer", // 动态地图服务
            "esri/symbols/SimpleMarkerSymbol", // 用来在graphics图层上画点和多点的
            "esri/symbols/TextSymbol", // 用来在graphics图层上写文字
            "esri/layers/GraphicsLayer", // 包含图形的图层
            "esri/Color", // 继承dojo/_base/Color中的所有属性,以提供设置颜色的函数
            "esri/graphic", // 用来创建几何图层的
            "esri/lang",
            "esri/geometry/Point", // 几何图形中的点类
            "esri/geometry/Polyline",
            "esri/SpatialReference", // 定义图层的空间参考
            "esri/layers/FeatureLayer",
            "esri/layers/ImageParameters",
            "esri/layers/LabelClass",
            "esri/symbols/Font",
            "esri/symbols/PictureMarkerSymbol",
            "esri/symbols/SimpleFillSymbol",
            "esri/symbols/SimpleLineSymbol",
            "esri/tasks/IdentifyTask",
            "esri/tasks/IdentifyParameters",
            "esri/tasks/query", // 查询
            "esri/tasks/QueryTask",
            "esri/renderers/UniqueValueRenderer",
            "esri/renderers/ClassBreaksRenderer",
            "esri/graphicsUtils",
            "esri/dijit/Popup",
            "dijit/TooltipDialog",
            "esri/renderers/SimpleRenderer",
            "esri/renderers/HeatmapRenderer",
            "esri/dijit/PopupTemplate",
            "esri/geometry/screenUtils",
            "dojox/charting/Chart",
            "dojox/charting/plot2d/Pie",
            "dojox/charting/themes/MiamiNice",
            "dojox/charting/widget/Legend",
            "dojo/ready",
            "dojo/dom-style",
            "dojo/dom-class",
            "dojo/dom-construct",
            "dojo/domReady!",
        ];
        MapInit.gisModules = loadModulesArr;
        const options = {
            // 可以使用自定义资源加载,arcgis 官网加载太慢了,经常加载失败。此处使用的本地包。
            url: MapInit.configUrl.arcgis.url,
            css: MapInit.configUrl.arcgis.css,
        };

        loadModules(loadModulesArr, options)
            .then(this.TDTinstance)
            .then(this.gisInit);
    }
    TDTinstance(args) {
        // 这里处理了一下传参,构造函数全部保存到 gisConstructor 对象中,对应的函数
        // key 值为加载模块的最后一个单词
        // 将引入的模块添加到vuex中
        for (let k in args) {
            let name = MapInit.gisModules[k].split("/").pop();
            name = name.replace(/^\S/, (s) => s.toUpperCase());
            if (name.indexOf('-') !== -1) {
                let nameSplit = name.split('-');
                let nameData = ''
                nameSplit.map(item => {
                    nameData += item.replace(item[0], item[0].toUpperCase())
                })
                name = nameData;
            }
            // this.gisConstructor[name] = args[k];
            // 提交到vuex
            let param = {
                name: name,
                Fn: args[k],
            };
            store.commit("mapModular", param);
        }
    }

3.页面使用

先引用vuex,在初始化

<template>
<div>
 <!-- 地图 -->
    <div id="viewDiv" ref="map" class="viewDiv"></div>
</div>
</template>

<script>
import { mapGetters } from "vuex";
export default {
  data() {
    return {
     
    };
  },
  computed: {
    /**
     * mapModular  提交到vuex 的arcgis API方法集合
     */
    ...mapGetters(["mapModular", ]),
  },
    created() {
    this.loadModules();
  },
  methods: {
    loadModules() {
      let self = this;
      let loadModulesArr = [
        "esri/map",
        "esri/layers/ArcGISTiledMapServiceLayer", // 瓦片图
        "esri/layers/ArcGISDynamicMapServiceLayer", // 动态地图服务
        "esri/symbols/SimpleMarkerSymbol", // 用来在graphics图层上画点和多点的
        "esri/symbols/TextSymbol", // 用来在graphics图层上写文字
        "esri/layers/GraphicsLayer", // 包含图形的图层
        "esri/Color", // 继承dojo/_base/Color中的所有属性,以提供设置颜色的函数
        "esri/graphic", // 用来创建几何图层的
        "esri/lang",
        "esri/geometry/Point", // 几何图形中的点类
        "esri/geometry/geometryEngine",
        "esri/geometry/geometryEngineAsync",
        "esri/SpatialReference", // 定义图层的空间参考
        "esri/layers/FeatureLayer",
        "esri/layers/LabelClass",
        "esri/layers/ImageParameters",
        "esri/symbols/Font",
        "esri/symbols/PictureMarkerSymbol",
        "esri/symbols/SimpleFillSymbol",
        "esri/symbols/SimpleLineSymbol",
        "esri/geometry/Polyline",
        "esri/tasks/query", // 查询
        "esri/tasks/QueryTask",
        "esri/tasks/DistanceParameters",
        "esri/renderers/UniqueValueRenderer",
        "esri/renderers/ClassBreaksRenderer",
        "esri/graphicsUtils",
        "esri/dijit/Popup",
        "dijit/TooltipDialog",
        "esri/renderers/SimpleRenderer",
        "esri/dijit/PopupTemplate",
        "esri/geometry/screenUtils",
        "dojo/dom-style",
        "dojo/dom-class",
        "dojo/dom-construct",
        "dojo/domReady!",
      ];
      this.gisModules = loadModulesArr;
      const options = {
        // 可以使用自定义资源加载,arcgis 官网加载太慢了,经常加载失败
        url: self.configUrl.arcgis.url,
        css: self.configUrl.arcgis.css,
      };

      loadModules(loadModulesArr, options)
        .then(this.TDTinstance)
        .then(this.gisInit);
    },
    TDTinstance(args) {
      let self = this;
      // 这里处理了一下传参,构造函数全部保存到 gisConstructor 对象中,对应的函数
      // key 值为加载模块的最后一个单词
      // 将引入的模块添加到vuex中
      for (let k in args) {
        let name = this.gisModules[k].split("/").pop();
        name = name.replace(/^\S/, (s) => s.toUpperCase());
        if (name.indexOf('-') !== -1) {
          let nameSplit = name.split('-');
          let nameData = ''
          nameSplit.map(item => {
            nameData += item.replace(item[0], item[0].toUpperCase())
          })
          name = nameData;
        }
        // this.gisConstructor[name] = args[k];
        // 提交到vuex
        let param = {
          name: name,
          Fn: args[k],
        };
        self.$store.commit("mapModular", param);
      }
    },
     gisInit() {
      let self = this;
      let map;
      map = new self.mapModular.Map("viewDiv", {
        center: new self.mapModular.Point(
          108.85999229,
          34.1999647,
          new self.mapModular.SpatialReference({
            wkid: 4326,
          })//空间参考
        ),
        zoom: 0,
        maxZoom: 12,
        showLabels: true,
        logo: false,
      });
      

      /**
                 *  底图 (影像底图、深色底图、浅色底图)
                 */
      // 深色地图
      self.vecLayer = new self.mapModular.ArcGISTiledMapServiceLayer(
        self.configUrl.MapServer.baseMap,
        {
          id: "generalTile",
          visible: true
        }
      );
      // 浅色底图
      self.vecVectorLayer = new self.mapModular.ArcGISTiledMapServiceLayer(
        self.configUrl.MapServer.baseVectorMap,
        {
          id: "generalVectorTile",
          visible: false
        }
      );
      // 影像底图
      self.imgLayer = new self.mapModular.ArcGISTiledMapServiceLayer(
        self.configUrl.MapServer.Imglayer.img,
        {
          id: "imageTile",
          visible: false
        }
      );
      self.imgLabel = new self.mapModular.ArcGISTiledMapServiceLayer(
        self.configUrl.MapServer.Imglayer.label,
        {
          id: "labelTile",
          visible: false
        }
      );
      map.addLayers([self.vecLayer, self.imgLayer, self.imgLabel, self.vecVectorLayer])
    

      //在地图上隐藏缩放模块
      map.on("load", function () {
        map.hideZoomSlider();
      });
      self.map = map;
      // 图层点击事件添加
      map.on("click", self.mapClick);

      let params = {
        name: "Map",
        Fn: map,
      };

      self.$store.commit("mapModular", params);

      // 地图服务加载完成
      self.$store.commit("mapLoadingComplete", true);

     
    },
   
  },
};
</script>

</style>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在 Vue 中实现测量工具,可以使用 ArcGIS API for JavaScript 中提供的测量工具模块和 ArcGIS Vue 组件库中的 `esri-widget-measurement` 组件。以下是在 Vue 中实现测量工具的一般步骤: 1. 在你的 Vue 项目中导入 `esri/widgets/Measurement` 模块和 `esri/config` 模块: ```javascript import { loadModules } from 'esri-loader'; import { createApp } from 'vue'; import App from './App.vue'; loadModules([ 'esri/widgets/Measurement', 'esri/config', ]).then(([Measurement, esriConfig]) => { esriConfig.apiKey = 'YOUR-ARCGIS-API-KEY'; createApp(App, { mounted() { // 初始化测量工具 const measurement = new Measurement({ view: this.$refs.mapView, activeTool: 'distance', }); // 将测量工具添加到地图 this.$refs.mapView.ui.add(measurement, 'top-right'); } }).mount('#app'); }); ``` 2. 在 Vue 组件中添加 `arcgis-map` 和 `arcgis-map-view` 组件: ```vue <template> <arcgis-map> <arcgis-map-view ref="mapView" :mapProperties="mapProperties" /> </arcgis-map> </template> <script> import { loadModules } from 'esri-loader'; export default { data() { return { mapProperties: { basemap: 'topo-vector', center: [-118.805, 34.027], // 地图中心点坐标 zoom: 13, // 地图缩放等级 }, }; }, }; </script> ``` 3. 在组件中添加 `esri-widget-measurement` 组件: ```vue <template> <arcgis-map> <arcgis-map-view ref="mapView" :mapProperties="mapProperties" /> <esri-widget-measurement viewName="mapView" :measurementProperties="measurementProperties" /> </arcgis-map> </template> <script> import { loadModules } from 'esri-loader'; export default { data() { return { mapProperties: { basemap: 'topo-vector', center: [-118.805, 34.027], // 地图中心点坐标 zoom: 13, // 地图缩放等级 }, measurementProperties: { activeTool: 'distance', }, }; }, }; </script> ``` 在此示例中,我们将 `esri-widget-measurement` 组件添加到了地图视图中,并设置了 `viewName` 和 `measurementProperties` 属性,其中 `viewName` 指定了组件绑定的地图视图,`measurementProperties` 指定了测量工具的属性,例如测量类型、单位等。 使用以上步骤,您可以在 Vue 中实现测量工具。如果您需要更多的自定义功能,可以参考 ArcGIS API for JavaScript 和 ArcGIS Vue 组件库的官方文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来-更美好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值