当前位置: 首页 > article >正文

使用谷歌地图google实现功能去选择定点位置,可以搜索位置。实现地图选择器组件:Vue + Google Maps API 实战

在现代Web应用中,地图选择器是一个常见的功能需求,尤其是在需要用户选择地理位置时。本文将详细介绍如何使用Vue.js和Google Maps API实现一个功能完善的地图选择器组件,并分享相关的技术细节和实现思路。


1. 功能概述

我们的地图选择器组件需要实现以下功能:

  1. 地图展示:使用Google Maps API展示地图,并允许用户通过点击或拖动标记来选择位置。

  2. 地址搜索:用户可以通过输入地址搜索并定位到指定位置。

  3. 地址与坐标绑定:将用户选择的位置信息(地址、纬度、经度)返回给父组件。

  4. 初始值设置:支持根据父组件传入的初始值(地址、纬度、经度)初始化地图位置。

  5. 重置功能:支持将地图重置为默认位置。


2. 技术栈
  • Vue.js:用于构建组件化的前端应用。

  • Google Maps API:用于地图展示、地址搜索和坐标解析。

  • Element Plus:用于UI组件(如输入框、按钮等)。


3. 实现细节
3.1 父组件:地图选择器的调用

在父组件中,我们通过一个表单项来触发地图选择器的显示,并将选择的结果绑定到表单数据中。

<el-form-item :label="$t('h.Tasklocation')" prop="address">
  <el-input
    v-model="form.address"
    :placeholder="$t('h.PleaseEnter') + $t('h.Tasklocation')"
    disabled
    maxlength="255"
    show-word-limit
  >
    <template #append>
      <el-button @click="openMapSelector(form.address)">
        {{ $t("h.Selectbtn") }}
      </el-button>
    </template>
  </el-input>
</el-form-item>
  • openMapSelector 方法:用于打开地图选择器弹窗,并根据当前操作类型(如创建或编辑)初始化地图位置。

openMapSelector() {
  this.mapDialogVisible = true;
  if (this.$refs.mapSelector) {
    if (this.approve === "Create") {
      this.$refs.mapSelector.reset(); // 重置为默认值
    } else {
      this.$refs.mapSelector.updatePosition(
        this.form.address,
        parseFloat(this.form.latitude),
        parseFloat(this.form.longitude)
      ); // 更新为当前值
    }
  }
}
  • handleLocationSelected 方法:用于处理地图选择器返回的数据,并更新表单数据。

handleLocationSelected({ address, latitude, longitude }) {
  this.form.address = address;
  this.form.latitude = latitude;
  this.form.longitude = longitude;
  this.mapDialogVisible = false; // 关闭地图选择器弹窗
}
3.2 子组件:地图选择器的实现

子组件是地图选择器的核心部分,负责地图的初始化、地址搜索、坐标解析等功能。

3.2.1 模板部分
<template>
  <div class="map-selector">
    <div class="search-container">
      <div class="search-box-container">
        <input
          ref="searchBox"
          v-model="searchText"
          type="text"
          class="search-box"
          :placeholder="$t('h.Search') || 'Enter a location'"
        />
        <i
          v-if="searchText"
          class="el-icon-close clear-icon"
          @click="clearSearch"
        ></i>
      </div>
      <button @click="searchAddress">{{ $t("h.Search") || "Search" }}</button>
    </div>

    <div ref="mapContainer" class="map-container"></div>

    <div class="address-container">
      <p v-if="selectedAddress">
        {{ $t("h.selectedAddress") || "Selected Address" }}:
        {{ selectedAddress }}
      </p>
      <p v-if="selectedLatitude && selectedLongitude">
        {{ $t("h.latitude") || "Latitude" }}: {{ selectedLatitude }},
        {{ $t("h.longitude") || "Longitude" }}: {{ selectedLongitude }}
      </p>
      <button @click="confirmSelection" :disabled="!selectedAddress">
        {{ $t("h.Confirm") || "Confirm" }}
      </button>
    </div>
  </div>
</template>
3.2.2 脚本部分
  • initMap 方法:初始化地图,并设置标记(Marker)和点击事件。

    initMap() {
      this.map = new google.maps.Map(this.$refs.mapContainer, {
        center: { lat: this.selectedLatitude, lng: this.selectedLongitude },
        zoom: 12,
      });
      this.marker = new google.maps.Marker({
        map: this.map,
        draggable: true,
        position: { lat: this.selectedLatitude, lng: this.selectedLongitude },
      });
      this.map.addListener("click", (event) => {
        this.marker.setPosition(event.latLng);
        this.geocodeLatLng(event.latLng);
      });
      this.marker.addListener("dragend", (event) => {
        this.geocodeLatLng(event.latLng);
      });
    }
  • geocodeLatLng 方法:将经纬度解析为地址。

geocodeLatLng(latLng) {
  this.geocoder.geocode({ location: latLng }, (results, status) => {
    if (status === "OK" && results[0]) {
      this.setSelectedAddressWithLatLng(
        results[0].formatted_address,
        latLng
      );
    } else {
      console.error("Geocoder failed due to: " + status);
    }
  });
}
  • confirmSelection 方法:将选择的位置信息返回给父组件。

confirmSelection() {
  if (this.selectedAddress) {
    this.$emit("location-selected", {
      address: this.selectedAddress,
      latitude: this.selectedLatitude,
      longitude: this.selectedLongitude,
    });
    this.$emit("close-dialog");
  }
}
4. 关键点总结
  1. Google Maps API 的使用:通过 google.maps.Map 和 google.maps.Marker 实现地图展示和标记功能。

  2. 双向数据绑定:通过 v-model 实现搜索框与数据的绑定。

  3. 组件通信:通过 $emit 将子组件的数据传递给父组件。

  4. 动态初始化:根据父组件传入的初始值动态初始化地图位置。


http://www.kler.cn/a/583041.html

相关文章:

  • 如何使用Cursor的claude-3.7模型来开发高保真的原型设计图,学会写好的提示词人人都是设计师
  • Android Retrofit 请求执行模块执行原理深入源码分析(三)
  • c语言笔记 函数入门
  • 【uniapp】textarea maxlength字数计算不准确的问题
  • Go Context深度剖析
  • doris:Elasticsearch
  • 【K8s】使用Kubernetes的resources字段中的requests和limits字段控制Pod资源使用
  • uni-app如何发布项目为app_2025
  • Linux进程基础知识
  • 在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件
  • linux和windows之间的复制
  • Github 2025-03-11 Python开源项目日报Top10
  • jira操作笔记
  • C++相关数据结构的API调用
  • 算力服务器主要是指什么?
  • 基于SpringBoot的七彩云南文化旅游网站设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 数组总和 (leetcode 40
  • css 知识点整理
  • Qt 数据库操作(Sqlite)
  • Java虚拟机之垃圾收集(一)