web端使用高德地图

web端使用高德地图

    • 一、申请高德key和秘钥
    • 二、在项目中引入所需功能js、css文件
    • 三、实现地图选点、回显选点
    • 四、自定义地图

一、申请高德key和秘钥

  • 申请高德key
    在这里插入图片描述
  • 申请成功后可以得到key
    在这里插入图片描述

二、在项目中引入所需功能js、css文件

<script src="https://webapi.amap.com/maps?v=2.0&key=XXXXXXXXXXXXX"></script>
<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
<script
  type="text/javascript"
  src="https://webapi.amap.com/demos/js/liteToolbar.js"
></script>
   

三、实现地图选点、回显选点

<template>
  <el-dialog title="选择地址" :visible.sync="MapVisible" width="960px">
    <el-form
      ref="Addressform"
      :model="Addressform"
      :rules="Addressrules"
      label-width="65px"
    >
      <el-row>
        <el-col :span="6">
          <el-form-item label="省" prop="province">
            <el-select
              v-model="Addressform.provinceId"
              placeholder=""
              filterable
              style="width: 100%"
              @change="changeProvince"
            >
              <el-option
                v-for="dict in provinceOptions"
                :key="dict.id"
                :label="dict.name"
                :value="dict.id"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="市" prop="city">
            <el-select
              v-model="Addressform.cityId"
              filterable
              placeholder=""
              style="width: 100%"
              @change="changeCity"
            >
              <el-option
                v-for="dict in cityOptions"
                :key="dict.id"
                :label="dict.name"
                :value="dict.id"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="区" prop="region">
            <el-select
              v-model="Addressform.regionId"
              placeholder=""
              filterable
              style="width: 100%"
              @change="changeRegion"
            >
              <el-option
                v-for="dict in regionOptions"
                :key="dict.id"
                :label="dict.name"
                :value="dict.id"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="乡(镇)" prop="street">
            <el-select
              v-model="Addressform.streetId"
              placeholder=""
              filterable
              style="width: 100%"
              @change="changeStreet"
            >
              <el-option
                v-for="dict in streetOptions"
                :key="dict.id"
                :label="dict.name"
                :value="dict.id"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>

      <el-row style="display: flex; align-items: end">
        <el-col :span="20">
          <el-form-item label="村" prop="village">
            <el-input
              type="textarea"
              :autosize="{ minRows: 2, maxRows: 4 }"
              placeholder="请输入村"
              v-model="Addressform.village"
            >
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item label="" label-width="20px">
            <el-button
              type="primary"
              icon="el-icon-search"
              size="mini"
              @click="searchAddress"
              :disabled="!Addressform.streetId"
              >搜索</el-button
            >
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <div id="mapselectpoint-container"></div>
    <span slot="footer" class="dialog-footer">
      <el-button @click="MapVisible = false">取 消</el-button>
      <el-button
        type="primary"
        @click="submitAddress"
        :disabled="!point || !Addressform.streetId"
        >确 定</el-button
      >
    </span>
  </el-dialog>
</template>

<script>
import axios from "axios";
import {
  selectAreaByParentCode,
  addFarmerAddress,
  getFarmerAddressInfo,
  updateFarmerAddressInfo,
} from "@/api/business/farmerInfo";
export default {
  name: "homepage",
  props: {
    farmerId: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      MapVisible: false,
      icon: {
        // 图标类型,现阶段只支持 image 类型
        type: "image",
        // 图片 url
        image:
          "https://a.amap.com/jsapi_demos/static/demo-center/marker/express2.png",
        // 图片尺寸
        size: [64, 30],
        // 图片相对 position 的锚点,默认为 bottom-center
        anchor: "center",
      },
      textStyle: {
        fontSize: 12,
        fontWeight: "normal",
        fillColor: "#22886f",
        strokeColor: "#fff",
        strokeWidth: 2,
        fold: true,
        padding: "2, 5",
      },
      map: null,
      marker: null,
      // 表单信息
      Addressform: {
        provinceId: undefined,
        province: undefined,
        city: undefined,
        cityId: undefined,
        region: undefined,
        regionId: undefined,
        street: undefined,
        streetId: undefined,
        village: undefined,
      },
      Addressrules: {
        province: [
          {
            required: true,
            message: "省不能为空",
            trigger: "change",
          },
        ],
        city: [
          {
            required: true,
            message: "市不能为空",
            trigger: "change",
          },
        ],
        region: [
          {
            required: true,
            message: "区不能为空",
            trigger: "change",
          },
        ],
        street: [
          {
            required: true,
            message: "镇不能为空",
            trigger: "change",
          },
        ],
        village: [
          {
            required: true,
            message: "村不能为空",
            trigger: "blur",
          },
        ],
      },
      provinceOptions: [],
      cityOptions: [],
      regionOptions: [],
      streetOptions: [],
      //   图上点位
      point: null,
    };
  },

  mounted() {},
  methods: {
    initMap(id) {
      // 新增点位
      this.MapVisible = true;
      this.$nextTick(async function () {
        // 重置信息
        this.reset();
        // 获取省级下拉内容
        if (!id) {
          // 如果是新增
          let res = await selectAreaByParentCode({ parentId: 1 });
          this.provinceOptions = res.data;
        }
        // 地图初始化
        this.map = new AMap.Map("mapselectpoint-container", {
          zoom: 15.8,
          //   center: [116.469881, 39.993599], //不设置自动定位到当前所在城市
        });
        this.map.setMapStyle("amap://styles/xxxxxxxxxxxxxxxxxxxx"); //设置地图的显示样式
        // 给地图绑定一个点击事件
        this.map.on("click", this.showInfoClick); //地图点击事件
        if (id) {
          // 如果是修改
          //   回显地址
          // 地址详情查询+回显
          getFarmerAddressInfo(id).then((res) => {
            this.Addressform = res.data;

            // 获取省市区镇下拉数据
            selectAreaByParentCode({ parentId: 1 }).then((res) => {
              // 省
              this.provinceOptions = res.data;
            });
            selectAreaByParentCode({
              parentId: this.Addressform.provinceId,
            }).then((res) => {
              // 市
              this.cityOptions = res.data;
            });
            selectAreaByParentCode({ parentId: this.Addressform.cityId }).then(
              (res) => {
                // 区
                this.regionOptions = res.data;
              }
            );
            selectAreaByParentCode({
              parentId: this.Addressform.regionId,
            }).then((res) => {
              // 镇
              this.streetOptions = res.data;
            });
            // 地址回显之后,给地图打点
            this.setPoint([
              this.Addressform.longitude,
              this.Addressform.latitude,
            ]);
            this.map.setZoomAndCenter(18, [
              this.Addressform.longitude,
              this.Addressform.latitude,
            ]);
          });
        }
      });
    },
    reset() {
      this.point = null;
      this.cityOptions = [];
      this.regionOptions = [];
      this.streetOptions = [];
      this.Addressform = {
        provinceId: undefined,
        province: undefined,
        city: undefined,
        cityId: undefined,
        region: undefined,
        regionId: undefined,
        street: undefined,
        streetId: undefined,
        village: undefined,
      };
      this.resetForm("Addressform");
    },
    setPoint(point) {
      //    保存点位,如果点位存在则可以提交地址
      this.point = point;
      // 添加一个点位
      if (this.marker) {
        this.map.remove(this.marker);
      }
      this.marker = new AMap.Marker({
        icon: "https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
        position: point,
        offset: new AMap.Pixel(-13, -30),
      });
      this.marker.setMap(this.map);
    },
    showInfoClick(e) {
      // 点击地图,在地图上打个标记
      this.setPoint([e.lnglat.getLng(), e.lnglat.getLat()]);

      // 通过点位获取省市区信息并回显
      this.regeoCode([e.lnglat.getLng(), e.lnglat.getLat()]);
    },
    async regeoCode(point) {
      // 获取标记位置信息:省市区镇用于保存信息
      let res = await axios(
        `https://restapi.amap.com/v3/geocode/regeo?location=${point.join(
          ","
        )}&key=f4d2e724f0ba6fe3b1cb5f841bce7a5e`
      );

      if (
        !res.data.regeocode.formatted_address ||
        res.data.regeocode.formatted_address.length == 0
      ) {
        // 如果点的位置不在国内,重置地图
        // 清空省市区
        this.cityOptions = [];
        this.regionOptions = [];
        this.streetOptions = [];
        this.Addressform = {
          provinceId: undefined,
          province: undefined,
          city: undefined,
          cityId: undefined,
          region: undefined,
          regionId: undefined,
          street: undefined,
          streetId: undefined,
          village: undefined,
        };
        this.resetForm("Addressform");
        return;
      }

      let { province, city, district, township } =
        res.data.regeocode.addressComponent;

      // 在这里为了回显,加一些判断方法
      if (province == "北京市") {
        city = "北京城区";
      } else if (province == "上海市") {
        city = "上海城区";
      } else if (province == "天津市") {
        city = "天津城区";
      } else if (province == "重庆市") {
        if (district.indexOf("区") > -1) {
          city = "重庆城区";
        } else {
          city = "重庆郊县";
        }
      }
      this.map.setZoomAndCenter(15.8, point);
      // 逐级回填省市区镇
      // 回填省
      this.provinceOptions.forEach((item) => {
        if (item.name == province) {
          this.Addressform.provinceId = item.id;
          this.Addressform.province = item.name;
        }
      });
      // 回填市 (先获取市的下拉列表)
      let res2 = await selectAreaByParentCode({
        parentId: this.Addressform.provinceId,
      });
      this.cityOptions = res2.data;
      this.cityOptions.forEach((item) => {
        if (item.name == city) {
          this.Addressform.cityId = item.id;
          this.Addressform.city = item.name;
        }
      });
      // 回填区/(先获取区/县的下拉列表)
      let res3 = await selectAreaByParentCode({
        parentId: this.Addressform.cityId,
      });
      this.regionOptions = res3.data;
      this.regionOptions.forEach((item) => {
        if (item.name == district) {
          this.Addressform.regionId = item.id;
          this.Addressform.region = item.name;
        }
      });
      // 回填镇(先获取镇的下拉列表)
      let res4 = await selectAreaByParentCode({
        parentId: this.Addressform.regionId,
      });
      this.streetOptions = res4.data;
      this.streetOptions.forEach((item) => {
        if (item.name == township) {
          this.Addressform.streetId = item.id;
          this.Addressform.street = item.name;
        }
      });
      // 回填详细信息
      this.Addressform.village =
        res.data.regeocode.formatted_address.split(township)[
          res.data.regeocode.formatted_address.split(township).length - 1
        ];
    },
    async regeoAddress(address, zoom) {
      // 获取标记位置信息:省市区镇用于保存信息
      await axios(
        `https://restapi.amap.com/v3/geocode/geo?address=${address}&key=f4d2e724f0ba6fe3b1cb5f841bce7a5e`
      ).then((res) => {
        this.map.setZoomAndCenter(
          zoom,
          res.data.geocodes[0].location.split(",")
        );
        // 给搜索的坐标打点吧 先清除原来的点
        this.setPoint(res.data.geocodes[0].location.split(","));
      });
    },
    async changeProvince(val) {
      this.provinceOptions.forEach((item) => {
        if (item.id == val) {
          this.Addressform.province = item.name;
        }
      });
      // 放大省位置
      await this.regeoAddress(this.Addressform.province, 5.5);
      // 清除市镇街道数据
      this.cityOptions = [];
      this.regionOptions = [];
      this.streetOptions = [];
      this.Addressform.cityId = undefined;
      this.Addressform.regionId = undefined;
      this.Addressform.streetId = undefined;
      this.Addressform.city = undefined;
      this.Addressform.region = undefined;
      this.Addressform.street = undefined;
      //  通过val获取子集市区
      let res = await selectAreaByParentCode({ parentId: val });
      this.cityOptions = res.data;
    },
    async changeCity(val) {
      this.cityOptions.forEach((item) => {
        if (item.id == val) {
          this.Addressform.city = item.name;
        }
      });
      await this.regeoAddress(
        this.Addressform.province + this.Addressform.city,
        8
      );
      // 镇街道数据
      this.regionOptions = [];
      this.streetOptions = [];
      this.Addressform.regionId = undefined;
      this.Addressform.streetId = undefined;
      this.Addressform.region = undefined;
      this.Addressform.street = undefined;
      //  通过val获取子集市区
      console.log(this.Addressform);
      let res = await selectAreaByParentCode({ parentId: val });
      this.regionOptions = res.data;
    },
    async changeRegion(val) {
      this.regionOptions.forEach((item) => {
        if (item.id == val) {
          this.Addressform.region = item.name;
        }
      });
      await this.regeoAddress(
        this.Addressform.province +
          this.Addressform.city +
          this.Addressform.region,
        10
      );
      // 镇街道数据
      this.streetOptions = [];
      this.Addressform.streetId = undefined;
      this.Addressform.street = undefined;
      //  通过val获取子集市区
      let res = await selectAreaByParentCode({ parentId: val });
      this.streetOptions = res.data;
    },
    async changeStreet(val) {
      this.streetOptions.forEach((item) => {
        if (item.id == val) {
          this.Addressform.street = item.name;
        }
      });
      await this.regeoAddress(
        this.Addressform.province +
          this.Addressform.city +
          this.Addressform.region +
          this.Addressform.street,
        12
      );
    },
    async searchAddress() {
      // 搜索具体位置 直接给打点
      await this.regeoAddress(
        this.Addressform.province +
          this.Addressform.city +
          this.Addressform.region +
          this.Addressform.street +
          this.Addressform.village,
        12
      );
    },
    submitAddress() {
      // 提交地址信息
      this.$refs["Addressform"].validate((valid) => {
        if (valid) {
          let address = {
            ...this.Addressform,
            longitude: this.point[0],
            latitude: this.point[1],
            farmerId: this.farmerId,
          };
          console.log(address);

          if (!address.id) {
            addFarmerAddress(address).then((res) => {
              this.$modal.msgSuccess("新增成功");
              this.MapVisible = false;
              this.$emit("updateAddress", { id: this.farmerId });
            });
          } else {
            updateFarmerAddressInfo(address).then((res) => {
              this.$modal.msgSuccess("修改成功");
              this.MapVisible = false;
              this.$emit("updateAddress", { id: this.farmerId });
            });
          }
        }
      });
    },
  },
};
</script>
<style lang="scss" scoped>
::v-deep #mapselectpoint-container {
  width: 100%;
  height: 500px;
  .amap-icon img {
    width: 30px;
    height: 40px;
  }
}
</style>

四、自定义地图

  • 自定义地图
    在这里插入图片描述
  this.map = new AMap.Map("mapselectpoint-container", {
          zoom: 15.8,
          //   center: [116.469881, 39.993599], //不设置自动定位到当前所在城市
          mapStyle: "amap://styles/8c825bfe70db32d900edb766197db660", //设置地图的显示样式
        });
        //添加如下代码即可
        this.map.setMapStyle("amap://styles/你的自定义地图ID");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】感知器

感知器是一种非常早期的线性分类模型&#xff0c;作为一种简单的神经网络模型被提出。感知器是一种模拟生物神经元行为的机器&#xff0c;有与生物神经元相对应的部件&#xff0c;如权重&#xff08;突触&#xff09;、偏置&#xff08;阈值&#xff09;及激活函数&#xff08;…

在项目中使用Volta控制node版本

在项目中使用Volta控制node版本 前端的技术很多年前就已经是井喷的状态了&#xff0c;基本每一年都有技术的迭代&#xff0c;而node作为前端基石之一也是一年一个样&#xff0c;这就导致了不同年代的版本使用不同的项目会经常出问题&#xff0c;高版本的node无法用于老的项目。…

【设计模式】行为型-模板方法模式

方法千变万化&#xff0c;心灵如潮&#xff0c;模板如画&#xff0c;画出生活的韵味。 文章目录 一、茶与咖啡二、模板方法模式三、模板方法模式的核心组成四、运用模板方法模式五、模板方法模式的应用场景六、小结推荐阅读 一、茶与咖啡 场景假设&#xff1a;我们需要完成茶…

测试开发面经分享,面试七天速成 DAY2

1. TCP和UDP的区别 a. TCP是面向连接的协议&#xff0c;而UDP是无连接的协议。 b. TCP提供可靠的数据传输&#xff0c;保证数据的有序性和完整性&#xff0c;而UDP则不提供这些保证。 c. TCP使用流控制和拥塞控制机制&#xff0c;以确保数据的可靠传输&#xff0c;而UDP没有这…

HCIE-QOS基本原理

QOS基本原理 QOS概述什么是QOSQoS服务模型区分服务模型QoS常用技术 (DiffServ模型)QoS数据处理流程 (DiffServ模型) QoS流分类和流标记QoS数据处理流程为什么需要流分类和流标记 简单流分类外部优先级 - VLAN报文外部优先级 - MPLS报文外部优先级 - IP报文各外部优先级间的对应…

Kafka集成flume

1.flume作为生产者集成Kafka kafka作为flume的sink&#xff0c;扮演消费者角色 1.1 flume配置文件 vim $kafka/jobs/flume-kafka.conf # agent a1.sources r1 a1.sinks k1 a1.channels c1 c2# Describe/configure the source a1.sources.r1.type TAILDIR #记录最后监控文件…

计算机视觉基础课程知识点总结

图像滤波 相关: 核与图像同向应用&#xff0c;不翻转。 卷积: 核在应用前翻转&#xff0c;广泛用于信号处理和深度学习&#xff08;现在常说的二维卷积就是相关&#xff09;。 内积: 向量化的点积操作&#xff0c;是相关和卷积的一部分。 模板匹配&#xff1a;通过在图像中…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…

13600KF+3060Ti,虚拟机安装macOS 14,2024年6月

距离上次装macOS虚拟机已经有一段时间了&#xff0c;macOS系统现在大版本升级的速度也是越来越快了&#xff0c;由于Office只支持最新三个版本的macOS&#xff0c;所以现在保底也得安装macOS 12了&#xff0c;我这次是用macOS 14做实验&#xff0c;13和12的安装方式和macOS 14一…

Word同行内的文字如何左右分别对齐

先打开标尺&#xff08;视图-标尺&#xff09; 开右边&#xff0c;选一个制表位置&#xff0c;比如我选34 切回开始&#xff0c;点段落段落右下角 然后 然后 我修改为35&#xff08;因为“6月13日”总共3个字符&#xff09; 在文字中间按下Tab键&#xff0c;效果如下

视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.224

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

《C++程序设计》银行管理系统

莫思身外无穷事 且尽生前有限杯 我们先来看一下项目需求&#xff1a; 【场景】 在日常生活中&#xff0c;我们普遍接触到窗口服务系统&#xff0c;如到银行柜台办理业务、景区现场购买门票等。当需要办理业务的顾客数超过窗口数量时&#xff0c;我们需遵循排队等待原则。 【需…

微服务 | Springboot整合Dubbo+Nacos实现RPC调用

官网&#xff1a;Apache Dubbo 随着互联网技术的飞速发展&#xff0c;越来越多的企业和开发者开始关注微服务架构。微服务架构可以将一个大型的应用拆分成多个独立、可扩展、可维护的小型服务&#xff0c;每个服务负责实现应用的一部分功能。这种架构方式可以提高开发效率&…

怎么用住宅代理IP?使用住宅代理IP有哪些好处?

如何使用住宅代理IP&#xff1a; 使用住宅代理IP主要涉及以下几个步骤&#xff1a; 选择合适的代理IP供应商&#xff1a; 考虑供应商的可靠性、代理IP的质量、速度、稳定性以及价格。选择信誉良好且服务稳定的供应商&#xff0c;确保获得高质量的代理IP服务。配置代理IP&#…

2024年中漫谈

不知不觉&#xff0c;2024年已来到了6月&#xff0c;博主不禁感叹时光易逝&#xff0c;岁月的车轮滚滚向前&#xff0c;永不止步&#xff0c;此刻无关贫穷与富裕&#xff0c;伟大与平凡。 于是乎&#xff0c;宇宙&#xff08;时空&#xff09;看似毫无终点&#xff0c;一望无垠…

辽宁普通测径仪升级智能测径仪后都有哪些改进?

关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果&#xff0c;然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差&#xff0c;使得同一厂家、…

芯片后端对于芯片设计公司的重要性

在芯片设计流程中&#xff0c;后端设计是一个至关重要的环节&#xff0c;它直接关系到芯片从设计到实际生产的转化&#xff0c;以及最终产品的性能、可靠性、成本和上市时间。 以下是为什么芯片后端非常重要的几个关键原因&#xff1a; 物理实现&#xff1a;后端设计是芯片从逻…

【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现

文章目录 前言一、Appium介绍和安装二、python代码功能实现 2.1 hello appium 参数详解 2.2 在脚本内启动其他app 2.3 获取app的包名和界面名 2.4 关闭app和驱动对象 2.5 安装和卸载以及是否安装app 2.6 将应用置于后台总结 前言 一、Appium介绍…

Vertical Layout 、Horizontal Layout 实验窗体自适应布局

实验目的 学习实验使用布局实现如下自适应界面 窗体邮件&#xff0c;布局设置为垂直布局 用同样的方法&#xff0c;添加groupbox&#xff0c;并右键设置为水平布局 拖入一个Horizontal Layout&#xff0c;然后拖入button&#xff0c;拖入 Horizontal Spacer 遇到一个问题&#…

openh264 帧内预测编码过程源码分析

函数关系 说明&#xff1a; 可以看到完成帧内预测编码的核心函数就是 WelsMdI16x16、WelsMdI4x4、WelsMdI4x4Fast 、WelsMdIntraChroma 四个函数。 原理 WelsMdI16x16函数 功能&#xff1a;针对16x16像素块的帧内模式决策过程&#xff1a; 局部变量申明&#xff1b;根据宏块…