web端使用高德地图

news2024/11/27 8:46:14

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");

私密限制

  • 1.限制key所有人都可以使用
    在这里插入图片描述
  • 2.完成上步配置后你的地图展示的将会是空白
  • 3.本地测试使用时可以将你的主机代理设置成此ip
    在这里插入图片描述
  • 4.这样地图就可以正常展示了
  • 5.如果项目中使用了webapi,将webapi转换成ajax接口,让后端去转化即可!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型网信办备案全网最详细说明(附附件)

本文共分为以下几个章节 一、大模型算法备案的强制性 二、生成式人工智能(大语言模型)安全评估要点 三、大模型备案必备材料重点说明 四、大模型备案填报流程 五、大模型备案时间成本对比 六、备案建议 附录、过程性材料 一、大模型算法备案的强制性 1、强制要求备案 …

JMeter详解

一、线程组 作用:线程组就是控制Imeter用于执行测试的一组用户 位置:右键点击测试计划’-->添加 -->线程(用户)--> 线程组 特点: 模拟多人操作线程组可以添加多个&#xff0c;多个线程组可以并行或串行取样器(请求)和逻辑控制器必须依赖线程组才能使用线程组下可以…

ECM和MEMS技术在心肺声学监测中的应用

心肺疾病是全球范围内导致死亡的主要原因。因此&#xff0c;对这些疾病迹象的准确和快速评估对于为患者提供适当的医疗保健至关重要。心血管疾病最重要的迹象之一是心脏周期的异常。大多数呼吸系统疾病则表现为呼吸周期的异常。有多种方法可以监测心脏和肺部的周期。听诊是监测…

【面试干货】Java中的访问修饰符与访问级别

【面试干货】Java中的访问修饰符与访问级别 1、public2、protected3、默认&#xff08;没有访问修饰符&#xff09;4、private &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;访问修饰符用于控制类、变量、方法和构造器…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解决办法&#xff1a;视图-裁剪起点&#xff0…

“Docker入门指南:概念与安装详解“

目录 # 概念 1. Docker常见问题 2. docker概念和安装 2.1 Docker的组成 2.2 Docker 组件及关系表 2.3 docker核心思想 2.4 docker镜像与容器两个核心概念 2.5 容器概念图 2.6 docker核心技术 2.6.1 镜像 (Image) 概述 关系 示例 2.6.2 容器 (Container) 概述 关…

贪吃蛇——c语言版

文章目录 演示效果实现的基本功能技术要点源代码实现功能GameStart打印欢迎界面和功能介绍绘制地图创建蛇创建食物 GameRun打印提示信息蛇每走一步 GameEnd蛇死亡后继续游戏 演示效果 贪吃蛇1.0演示视频 将终端应用程序改为控制台主机 实现的基本功能 贪吃蛇地图绘制蛇吃食物的…

[Mysql] 数据库基本概念

前言---数据库系统发展史 当今主流数据库介绍 一、操作系统 Linux操作系统 &#xff1a;RedHat CentOS Debian Ubuntu OpenSUSE 信创标准 会让系统逐渐国产化 国产系统&#xff1a;华为 欧拉 阿里 龙蜥 腾讯 tencentOS 银河麒麟 中标麒麟…

分享:MoneyPrinterTurbo只需一个视频主题或关键词全自动生成一个高清的短视频

MoneyPrinterTurbo是基于原有的MoneyPrinter项目进行优化和重构后推出的新版本。它利用先进的AI技术&#xff0c;通过用户提供的视频主题或关键词&#xff0c;全自动生成视频文案、素材、字幕以及背景音乐&#xff0c;并最终合成高清的短视频。 功能特性 AI智能文案生成&…

redis高可用-主从同步

目录 一&#xff1a;背景 二&#xff1a;实现方式 三&#xff1a;实际使用 一&#xff1a;背景 上一节我们介绍了centos下redis下的安装配置&#xff0c;是在单台服务器部署一个redis服务&#xff0c;这种模式是单机模式下使用的&#xff0c;如果出现服务故障&#xff0c;re…

Spring AI 调用 openAI 进行语音识别

Spring AI支持语音识别功能&#xff0c;目前仅支持OpenAI的Transcription模型。 项目搭建&#xff1a; 参考 Spring AI 介绍以及与 Spring Boot 项目整合 源码示例&#xff1a; RestController RequestMapping("/openai") public class OpenAiIAudioTranscriptionC…

幂集000

题目链接 幂集 题目描述 注意点 集合中不包含重复的元素 解答思路 可以使用深度优先遍历的思想按顺序将相应的元素添加到子集中&#xff0c;并将每个子集添加到结果集 代码 class Solution {public List<List<Integer>> subsets(int[] nums) {List<List&…

VirtualBox虚拟机下安装Ubuntu24.04操作系统

目录 0 背景1 虚拟机的安装1.1 下载安装包1.2 走安装向导 2 操作系统的安装2.1 下载光盘镜像文件2.2 安装操作系统到虚拟机上 3 基本配置3.1 网络连接方式3.2 共享文件夹3.3 设置显存大小 0 背景 首先说说Ubuntu系统&#xff0c;或者更普遍一点&#xff0c;Linux系统究竟有什么…

Java项目学习(员工管理)

新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API&#xff0c;其中每个方法的返回值会直接序列化为 JSON 或…

Mirillis Action v4 解锁版安装教程(专业高清屏幕录像软件)

前言 Mirillis Action!&#xff08;暗神屏幕录制软件&#xff09;专业高清屏幕录像软件&#xff0c;被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件&#xff0c;拥有三大硬件加速技术&#xff0c;支持以超高清视频画质录制桌面和实况直播&#xff0c;超清视频画…

90 Realistic Arctic Environment Textures snow(90+种逼真的北极环境纹理--雪、冰及更多)

一组90多个逼真的雪、冰、雪地岩石和其他被雪覆盖的地面纹理,供在雪地环境中使用。每个纹理都是可贴的/无缝的,并且完全兼容各种不同的场景--标准的Unity地形、Unity标准着色器、URP、HDRP等等都兼容。 所有的纹理都是4096x4096,并包括一个HDRP掩码,以完全支持HDRP。 特点。…

揭示数据库内核的奥秘--手写数据库toadb开源项目

揭示数据库内核的奥秘–手写数据库toadb 数据为王的时代 在信息化时代&#xff0c;数据已成为企业和应用不可或缺的核心&#xff0c;而数据库不仅是数据的仓库&#xff0c;更是支撑业务决策、系统运行的基石。对于求职者而言&#xff0c;掌握数据库知识已成为求职市场上的必考…

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

基于AT32_Work_Bench配置AT32工程

基于AT32_Work_Bench配置AT32工程 ✨AT32_Work_Bench工具是用来给AT32 MCU快速构建外设初始化工程软件&#xff0c;类似STM32的STM32CubeMX工具软件。 &#x1f4cd;AT32 TOOL系列工具下载地址&#xff1a;https://www.arterytek.com/cn/support/index.jsp?index4&#x1f3f7…

递归乘法00

题目链接 递归乘法 题目描述 注意点 保证乘法范围不会溢出 解答思路 使用加法代替乘法&#xff0c;递归计算A * B&#xff0c;每个递归的过程加上一个A&#xff0c;且对B减1&#xff0c;直到B为0为止 代码 class Solution {public int multiply(int A, int B) {if (B 0…