• 高德地图


    基于Vue Antd Admin+高德地图进行开发

    帮助

    高德地图: AMap JSAPI 2.0 文档
    基于AntDesignVue封装: AMap-Vue
    基于elemnt封装: Vue-AMap

    img

    Main.js

    import AmapVue from '@amap/amap-vue';
    AmapVue.config.version = '2.0'; // 默认2.0,这里可以不修改
    AmapVue.config.key = '您的JSAPI KEY';
    
    AmapVue.config.plugins = [
      'AMap.ToolBar',
      'AMap.MoveAnimation',
      'AMap.PlaceSearch',
      "AMap.AutoComplete"
      // 在此配置你需要预加载的插件,如果不配置,在使用到的时候会自动异步加载
    ];
    Vue.use(AmapVue)
    

    mounted生命周期

    async mounted() {
    	// 地图初始化
        const AMap = await loadAmap();
        await loadPlugins(["AMap.AutoComplete", "AMap.PlaceSearch"]);
        this.ps = new AMap.PlaceSearch({
          pageSize: this.pageSize,
        });
        this.ac = new AMap.AutoComplete();
        // 地图点标记回显
          if (
            this.$props.row.latitude != null &&
            this.$props.row.longitude != null
          ) {
            this.position = [+this.$props.row.longitude,+this.$props.row.latitude];
            console.log(this.position);
          }
    }
    

    methods

    // 地图
        onMapClick(e) {
          if (e.lnglat) {
            this.position = [e.lnglat.lng, e.lnglat.lat];
            console.log(this.position);
          }
        },
        async search(clear = false) {
          this.mode = "result";
          await this._ready;
    
          if (clear) {
            this.results = [];
            this.total = 0;
            this.pageIndex = 1;
            this.ps.setPageIndex(1);
          }
    
          this.searching = true;
          const { query } = this;
          this.ps.search(query, (status, result) => {
            this.searching = false;
            if (query !== this.query) return;
    
            if (status === "complete" && result.poiList) {
              this.results = result.poiList.pois;
              this.total = result.poiList.count;
            } else {
              this.results = [];
              this.total = 0;
            }
          });
        },
        async autoComplete(kw) {
          if (!kw) {
            this.tips = [];
          } else {
            this.ac.search(kw, (status, result) => {
              if (kw !== this.query) return;
              if (status === "complete" && result.tips) {
                this.tips = Array.from(new Set(result.tips.map((tip) => tip.name)));
              } else {
                this.tips = [];
              }
            });
          }
        },
        focus(poi) {
          const pos = [poi.location.lng, poi.location.lat];
          this.position = [...pos];
          this.center = [...pos];
          this.mode = "search";
        },
        reset() {
          this.ps.setPageIndex(1);
          this.results = [];
          this.tips = [];
          this.total = 0;
          this.mode = "search";
        },
    

    HTML

    <!-- 地图 -->
    <a-form-item label="地图">
      <a-card
        :body-style="{
          'max-height': '450px',
          'overflow-y': 'scroll',
          'padding-top': 0,
        }"
        class="result-panel"
      >
        <template slot="title">
          <template>
            <div class="map-header">
              <a-form-item style="margin-bottom: 0px; margin-right: 20px">
                <a-input-group compact style="display: flex">
                  <a-auto-complete
                    v-model="query"
                    :data-source="tips"
                    placeholder="输入关键词"
                    style="flex: 1"
                    @search="autoComplete"
                  />
                  <a-button
                    @click="search(true)"
                    :disabled="!query"
                    type="primary"
                  >
                    搜索
                  </a-button>
                </a-input-group>
              </a-form-item>
    
              <a-form-item label="经纬度:" style="margin-bottom: 0px">
                <a-input
                  read-only
                  :value="positionText"
                  style=" 200px"
                />
              </a-form-item>
            </div>
          </template>
        </template>
        <a-modal
          title="搜索列表"
          :visible="mode === 'result'"
          v-if="mode === 'result'"
          @ok="mode = 'search'"
          @cancel="mode = 'search'"
          footer=""
        >
          <a-list
            v-if="mode === 'result'"
            :data-source="results"
            item-layout="vertical"
            size="small"
            class="result-list"
          >
            <a-pagination
              slot="header"
              v-if="total > 0"
              v-model="pageIndex"
              :page-size="pageSize"
              :total="total"
              size="small"
            />
            <a-list-item slot="renderItem" slot-scope="item" :key="item.id">
              <a-list-item-meta :description="item.address">
                <span
                  slot="title"
                  style="cursor: pointer"
                  @click="focus(item)"
                  >{{ item.name }}</span
                >
              </a-list-item-meta>
            </a-list-item>
            <a-pagination
              slot="footer"
              v-if="total > 0"
              v-model="pageIndex"
              :page-size="pageSize"
              :total="total"
              size="small"
            />
          </a-list>
        </a-modal>
      </a-card>
      <div class="coord-picker">
        <div class="map-container">
          <amap
            cache-key="coord-picker-map"
            mmap-style="amap://styles/whitesmoke"
            async
            :center.sync="center"
            :zoom.sync="zoom"
            is-hotspot
            @click="onMapClick"
          >
            <amap-satellite-layer :visible="satellite" />
            <amap-scale position="LB" />
            <amap-tool-bar
              :position="{
                top: '110px',
                left: '40px',
              }"
            />
            <amap-marker :position.sync="position" draggable />
          </amap>
        </div>
      </div>
    </a-form-item>
    

    CSS

    .map-container {
       100%;
      height: 250px;
    }
    
    .result-panel {
      display: flex;
      flex-direction: column;
    
      .search-bar {
        display: flex;
        align-items: center;
        .text {
          text-overflow: ellipsis;
          flex: 1;
          overflow: hidden;
          white-space: nowrap;
        }
      }
    
      .result-list.ant-list-loading {
        min-height: 100px;
        display: flex;
        justify-content: center;
        align-items: center;
      }
    }
    .info {
      padding: 6px;
      margin-bottom: 10px;
    }
    .map-header {
       100%;
      display: flex;
      justify-content: left;
      align-items: center;
    }
    
  • 相关阅读:
    痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(1)- 概览
    痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动
    《痞子衡嵌入式半月刊》 第 12 期
    不能错过的分布式ID生成器(Leaf ),好用的一批!
    实用!一键生成数据库文档,堪称数据库界的Swagger
    安排上了!PC人脸识别登录,出乎意料的简单
    又被逼着优化代码,这次我干掉了出入参 Log日志
    图文并茂,带你认识 JVM 运行时数据区
    一文说通C#中的异步编程补遗
    一文说通C#中的异步编程
  • 原文地址:https://www.cnblogs.com/xz233/p/14282506.html
Copyright © 2020-2023  润新知