百度GL地图实现选点获取经纬度并且地址逆解析

news2025/1/7 7:40:51

 

index.html引入

    <script src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=你的ak"></script>

 组件使用

            <el-input
                :disabled="['详情'].includes(title)"
                v-model="formData.site"
                placeholder=""
              >
                <template slot="append">
                  <el-button
                    type="primary"
                    icon="iconfont if-ditudingwei"
                    :disabled="['详情'].includes(title)"
                    style="color: #1492ff"
                    @click="choosePosition"
                    >选择
                  </el-button>
                </template>
              </el-input>



    <positionDialog @on-response="getPosition" ref="positionDialog" />

import positionDialog from "@/components/Map/positionDialog/positionDialog.vue";
  components: {positionDialog},



    getPosition(e) {
      console.log(e);
      this.$set(this.formData, "longitude", e.lng);
      this.$set(this.formData, "latitude", e.lat);
    },

    choosePosition() {
      let passData = {
        data: JSON.parse(JSON.stringify({
            lng: this.formData.longitude,
            lat: this.formData.latitude,
        })),
        type: "地图选点",
      };
      this.$refs.positionDialog.showDialog(passData);
    },

positionDialog组件封装

<template>
  <el-dialog
    width="1000px"
    v-dialog-drag
    :title="title"
    :visible.sync="dialogVisible"
    :before-close="hideDialog"
    append-to-body
  >
    <div class="wrap-box">
      <!-- 搜索显示框 -->
      <el-form v-if="!hasNoSearch" class="formWrap" label-width="90px">
        <el-col :span="12">
          <el-form-item
            label="搜索 : "
            prop="keyword"
            style="position: relative"
          >
            <el-input id="search" v-model="keyword" @input="searchPositionList">
            </el-input>
            <div class="wrap-search" v-if="searchList.length > 0">
              <div
                class="wrap-search-item"
                v-for="(item, index) in searchList"
                :key="index"
                @click="selectAddress(item)"
              >
                <div style="width: 80%">{{ item }}</div>
                <div style="width: 20%; text-align: right">
                  <i class="iconfont if-biaodancaozuo-fabu"></i>
                </div>
              </div>
            </div>
          </el-form-item>
          <!-- <label
            >搜索:<el-input v-model="keyword">
              <el-button
                slot="append"
                icon="el-icon-search"
              ></el-button></el-input
          ></label> -->
        </el-col>
        <el-col :span="6">
          <el-form-item label="经度: " prop="lng">
            <el-input v-model="formData.lng"></el-input>
          </el-form-item>
          <!-- <label>经度:<el-input v-model="formData.lng" /></label> -->
        </el-col>
        <el-col :span="6">
          <el-form-item label="纬度: " prop="lat">
            <el-input v-model="formData.lat" />
          </el-form-item>
        </el-col>
      </el-form>
      <!-- 地图盒子 -->
      <div id="allmap"></div>
    </div>
    <span slot="footer" class="dialog-footer">
      <el-button @click="hideDialog">取 消</el-button>
      <el-button type="primary" @click="submitForm">确 定</el-button>
    </span>
  </el-dialog>
</template>

<script>
export default {
  name: "positionDialog",
  components: {},
  props: {
    hasNoSearch: {
      type: Boolean,
      defalut: false, //是否有搜索框
    },
    hasNoChoosePosition: {
      type: Boolean,
      defalut: false, //是否可以改变选择的坐标点
    },
  },
  data() {
    return {
      dialogVisible: false,
      title: "",
      keyword: "",
      location: "",
      mapCenter: {
        lng: 103.653534,
        lat: 30.998257,
      },
      formData: {},
      mapZoom: 13,
      map: null,
      marker: null, //坐标点
      searchInput: null, //搜索
      searchList: [],
    };
  },
  methods: {
    // 选择检索的列表项
    selectAddress(value) {
      this.keyword = value;
      this.getAddress(value);
    },
    // 解析地址
    getAddress(e) {
      let that = this;
      let myGeo = new BMapGL.Geocoder();
      // 将地址解析结果显示在地图上,并调整地图视野
      myGeo.getPoint(
        e,
        function (point) {
          if (point) {
            console.log(point);
            point = {
              lng: point.lng.toFixed(6),
              lat: point.lat.toFixed(6),
            };
            that.$set(that.formData, "lng", point.lng);
            that.$set(that.formData, "lat", point.lat);

            that.map.centerAndZoom(new BMapGL.Point(point.lng, point.lat), 14); //设置中心点
            that.setMarker(point.lng, point.lat); //设置坐标点
            that.searchList = [];
          }
        },
        ""
      );
    },
    searchPositionList(e) {
      let that = this;
      let option = {
        onSearchComplete: function (results) {
          // 判断状态是否正确
          if (local.getStatus() == BMAP_STATUS_SUCCESS) {
            var list = [];
            for (var i = 0; i < results.getCurrentNumPois(); i++) {
              // console.log(results.getPoi(i));
              list.push(results.getPoi(i).address);
            }
            that.searchList = list;
          }
        },
        // pageCapacity: 5,
      };
      var local = new BMapGL.LocalSearch(this.map, option);
      local.search(e);
    },
    showDialog(data) {
      console.log("showDialog", data);
      this.title = data.type;
      this.formData = data.data;
      if (this.formData.lng && this.formData.lat) {
        this.mapCenter.lng = this.formData.lng;
        this.mapCenter.lat = this.formData.lat;
      }
      this.dialogVisible = true;
      this.initMap();
    },
    setMarker(lng, lat) {
      if (this.marker) {
        this.map.removeOverlay(this.marker);
        this.marker = null;
      }
      setTimeout(() => {
        let point = new BMapGL.Point(lng, lat); //创建点
        this.marker = new BMapGL.Marker(point); // 创建标注
        this.map.addOverlay(this.marker);
        console.log(lng, lat);
      }, 100);
    },

    hideDialog() {
      console.log("hideDialog");
      this.formData = {};
      this.keyword = "";
      this.dialogVisible = false;
    },
    getClickInfo(e) {
      console.log("地图点击", e);
    },
    submitForm() {
      if (!this.formData.lng || !this.formData.lat) {
        this.$message.error("请选择位置");
      } else {
        this.$emit("on-response", this.formData);

        this.hideDialog();
      }
    },
    initMap() {
      let that = this;
      this.$nextTick(() => {
        // 按住鼠标右键,修改倾斜角和角度
        this.map = new BMapGL.Map("allmap"); // 创建Map实例

        this.map.centerAndZoom(
          new BMapGL.Point(this.mapCenter.lng, this.mapCenter.lat),
          12
        ); // 初始化地图,设置中心点坐标和地图级别
        // this.searchInput = new BMapGL.Autocomplete({
        //   //建立一个自动完成的对象
        //   input: "search",
        //   location: this.map,
        // });
        this.setMarker(this.mapCenter.lng, this.mapCenter.lat);
        this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
        this.map.setHeading(64.5); //设置高度
        this.map.setTilt(0); //设置角度

        var geoc = new BMapGL.Geocoder();
        if (!this.hasNoChoosePosition) {
          this.map.addEventListener("click", function (e) {
            console.log(e);
            // let pt = {
            //   lng: e.latlng.lng.toFixed(6),
            //   lat: e.latlng.lat.toFixed(6),
            // };
            let pt = e.latlng
            that.$set(that.formData, "lat", pt.lat);
            that.$set(that.formData, "lng", pt.lng);
            // that.$set(that.mapCenter, "lat", pt.lat);
            // that.$set(that.mapCenter, "lng", pt.lng);
            that.setMarker(pt.lng, pt.lat);
            geoc.getLocation(pt, function (rs) {
              console.log(rs, "res")
              var addComp = rs.addressComponents;
              that.keyword =
                addComp.province +
                addComp.city +
                addComp.district +
                addComp.street +
                addComp.streetNumber;
            });
          });
        }
      });
    },
  },
  created() {},
  mounted() {
    // this.initMap();
  },
};
</script>

<style lang="scss" scoped>
::v-deep .el-dialog__body {
  padding: 10px 0 0 !important;
}
#allmap {
  height: 500px;
  width: 100%;
  overflow: hidden;
}
.wrap-box {
  position: relative;
  .formWrap {
    position: absolute;
    top: 10px;
    left: 10px;
    z-index: 99999;
  }
  .wrap-search {
    position: absolute;
    z-index: 9999;
    width: 100%;
    background-color: #fff;
    box-shadow: 1px 1px 4px #f0f0f0;
    max-height: 300px;
    // width: 250px;
    overflow-y: auto;
    &-item {
      width: 100%;
      padding: 10px 10px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      cursor: pointer;
      &:hover {
        background-color: #f0f0f0;
      }
    }
  }
}
</style>

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

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

相关文章

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

ESLint 、 e2e test 学习

Lint和Format的区别&#xff1a; Lint只会告诉你代码中的错误或者不符合规范的地方&#xff0c;而Format是用来对格式作调整的 HTML/tpl&#xff1a;HTMLLint CSS/SCSS&#xff1a;Stylelint JS/JSX&#xff1a;Eslint JSLint&#xff1a;古老&#xff0c;不能配置和扩展JSHin…

jvm中的引用类型

Java中的引用类型 1.强引用 一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的&#xff0c;所以被引用的对象A&#xff0c;就在GC Root的引用链上了。只要这一层关系存在&#xff0c;对象A就不会被垃圾回收器回收。所以只要…

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作&#xff1a; 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚&#xff08;根据电路图&#xff09; 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码&#xff0c;并且修改代码 2.1 看看效果 2.2 写代码

线程-条件变量和生产者消费者模型

这个内容比较重要&#xff0c;并且面试很容易被问道。所以把他单独拿出来了。 条件变量 条件变量是一种线程同步机制 当条件不满足时&#xff0c;相关线程被一直阻塞&#xff0c;直到某种条件出现&#xff0c;这些线程才会被唤醒。为了保护共享资源&#xff0c;条件变量需要…

tiktok如何影响用户行为的分析兼论快速数据分析的策略

tiktok如何影响用户行为的分析 快速数据分析的策略流程&#xff1a; 1.确定指标变量&#xff0c;也就确定了数据分析想要回答的问题。想回答不同的问题&#xff0c;就选择不同的指标变量。 变量筛选方法选出指标变量相关的变量&#xff1b; 针对筛选出的变量进行描述性分析和因…

【软考经验分享】软考-中级-嵌入式备考

这里写目录标题 教辅用书嵌入式系统设计师考试大纲嵌入式系统设计师教程嵌入式系统设计师5天修炼嵌入式系统设计师考前冲刺100题 刷题软件希赛网软考真题 视频教程希赛网王道-计组计网 教辅用书 嵌入式系统设计师考试大纲 50页左右&#xff0c;内容为罗列一些考点&#xff0c…

【hackmyvm】 Quick2靶机

渗透流程 渗透开始1.IP地址 获取2.端口扫描3.任意文件读取4.扫描目录5.总结信息6.漏洞扫描7.php_filter_chain_generator.py使用8.提权 渗透开始 1.IP地址 获取 ┌─[✗]─[userparrot]─[~] └──╼ $fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.124 本机 192.1…

密码学 | Schnorr 协议:零知识身份证明和数字签名

&#x1f955;原文&#xff1a; Schnorr 协议&#xff1a;零知识身份证明和数字签名 &#x1f955;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。文中的小写字母表示标量&#xff0c;大写字母表示椭圆曲线中的点。 1 Schnorr 简介 Schnorr 由德国数学家和密…

Opencv_10_自带颜色表操作

void color_style(Mat& image); Opencv_10_自带颜色表操作&#xff1a; void ColorInvert::color_style(Mat& image) { int colormap[] { COLORMAP_AUTUMN, COLORMAP_BONE , COLORMAP_JET , COLORMAP_WINTER, COLORMAP_RAINBOW , COLOR…

图像处理之Retinex算法(C++)

图像处理之Retinex算法&#xff08;C&#xff09; 文章目录 图像处理之Retinex算法&#xff08;C&#xff09;前言一、单尺度Retinex&#xff08;SSR&#xff09;1.原理2.代码实现3.结果展示 二、多尺度Retinex&#xff08;MSR&#xff09;1.原理2.代码实现3.结果展示 三、带色…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

JetBrains PhpStorm v2024.1 安装教程 (PHP集成开发IDE)

前言 PhpStorm是由JetBrains推出的一款轻量级集成开发环境&#xff0c;专为PHP开发者而设计。该软件融合了智能的HTML/CSS/JavaScript/PHP编辑器、代码质量分析工具、版本控制系统集成&#xff08;包括SVN和GIT&#xff09;、调试和测试等功能。除此之外&#xff0c;PhpStorm还…

FPGA秋招-笔记整理(1)

一、关键路径 关键路径通常是指同步逻辑电路中&#xff0c;组合逻辑时延最大的路径&#xff08;这里我认为还需要加上布线的延迟&#xff09;&#xff0c;也就是说关键路径是对设计性能起决定性影响的时序路径。也就是静态时序报告中WNS&#xff08;Worst Nagative Slack&…

【计算机毕业设计】jspm医院门诊挂号系统——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

【服务器部署篇】Linux下Ansible安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

编译器的学习

常用的编译器&#xff1a; GCCVisual CClang&#xff08;LLVM&#xff09;&#xff1a; Clang 可以被看作是建立在 LLVM 之上的一个项目, 实际上LLVM是clang的后端&#xff0c;clang作为前端前端生成LLVM IR&#xff0c;https://zhuanlan.zhihu.com/p/656699711MSVC &#xff…

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

计算机网络相关知识总结

一、概述 计算机网络可以极大扩展计算机系统的功能机器应用范围&#xff0c;提高可靠性&#xff0c;在为用户提供放方便的同时&#xff0c;减少了整体系统费用&#xff0c;提高性价比。 计算机网络的功能主要有&#xff1a;1. 数据共享&#xff1b;2. 资源共享&#xff1b;3. 管…