VUE組件 之 高德地圖地址選擇

来源:https://www.cnblogs.com/similar/archive/2019/06/21/11064033.html
-Advertisement-
Play Games

註:本文基於上一篇文章【 Vue-Cli 3.0 中配置高德地圖 】 ,採用直接引入高德 SDK 的方式來使用高德地圖api 一、效果圖 二、組件要實現的功能 1. 如果有傳入坐標點,則定位到坐標點 2. 如果沒有傳入坐標點,則定位到當前所在位置 3. 定位成功要在右側顯示經緯度和地址 4. 可以通 ...


註:本文基於上一篇文章【 Vue-Cli 3.0 中配置高德地圖 】 ,採用直接引入高德 SDK 的方式來使用高德地圖api

 

一、效果圖

 

二、組件要實現的功能

1. 如果有傳入坐標點,則定位到坐標點

2. 如果沒有傳入坐標點,則定位到當前所在位置

3. 定位成功要在右側顯示經緯度和地址

4. 可以通過拖動 標記 來調整定位點

5. 標記 拖動後,右側要顯示拖動後的經緯度和地址

6. 點擊確定按鈕,返回最後的坐標點和地名給父組件

 

三、 組件實現具體代碼

<template>
  <div class="map-box" :style="{ width: width, height: height }">
    <div id="amap" class="amap"></div>
    <div class="detail">
      <p>經度:{{point ? point[0] : '-'}}</p>
      <p>緯度:{{point ? point[1] : '-'}}</p>
      <p>地址:{{address}}</p>
      <button size="mini" class="btnmap" @click="commit">確定</button>
    </div>
  </div> 
</template>

<script>
import AMap from 'AMap'
export default {
  props: {
    width: { type: String, default: '100%' },
    height: { type: String, default: '400px' },
    lnglat: {
      type: Array,
      validator: (value) => {
        return value.length === 2
      }
    }
  },
  data () {
    return { address: '', point: this.lnglat }
  },
  mounted () {
    this.init(this.point)
  },
  methods: {

    // 初始化
    init (lnglat) {

      // 地圖實例對象 (amap 為容器的id)
      let amap = new AMap.Map('amap', {
        resizeEnable: true,
        zoom: 15
      })

      // 註入插件(定位插件,地理編碼插件)
      amap.plugin(['AMap.Geolocation', 'AMap.Geocoder'])

      // 定位
      this.currentPosition(amap, lnglat)
    },

    currentPosition (map, lnglat) {
      if (lnglat) {
        // 有傳入坐標點,直接定位到坐標點
        map.setCenter(lnglat)
        this.addMark(map, lnglat)

        // 獲取地址
        this.getAddress(lnglat)
      } else {
        // 沒有傳入坐標點,則定位到當前所在位置
        let geolocation = new AMap.Geolocation({
          enableHighAccuracy: true,
          timeout: 10000,
          zoomToAccuracy: true,     
          buttonPosition: 'RB'
        })
        geolocation.getCurrentPosition((status, result) => {
          if (status === 'complete') {
            let points = [result.position.lng, result.position.lat]
            map.setCenter(points) // 設置中心點
            this.addMark(map, points) // 添加標記

            // 存下坐標與地址
            this.point = points
            this.getAddress(points)
          } else {
            console.log('定位失敗', result)
          }
        })
      }
    },

    // 添加標記
    addMark (map, points) {
      let marker = new AMap.Marker({
        map: map,
        position: points,
        draggable: true, // 允許拖動
        cursor: 'move',
        raiseOnDrag: true
      })
      marker.on('dragend', (e) => {
        let position = marker.getPosition()

        // 存下坐標與地址
        this.point = [position.lng, position.lat]
        this.getAddress([position.lng, position.lat])
      })
    },

    // 根據坐標返回地址(逆地理編碼)
    getAddress (points) {
      let geocoder = new AMap.Geocoder({ radius: 1000 })
      geocoder.getAddress(points, (status, result) => {
        if (status === 'complete' && result.regeocode) {
          this.address = result.regeocode.formattedAddress
        }
      })
    },

    commit () {
      this.$emit('location', this.point, this.address)
    }
  }
}
</script>

<style lang="scss" scoped>
.map-box {
  box-sizing: border-box;
  background-color: #ddd;
  padding: 15px;
  &:after {
    content: '';
    display: block;
    clear: both;
  }
  .amap, .detail {
    float: left;
    height: 100%;
  }
  .amap {
    width: 75%;    
  }
  .detail {
    width: 25%;
    background-color: #fff;
    padding: 0 15px;    
    border-left: 1px solid #eee;
    box-sizing: border-box;
    word-wrap: break-word;
  }
  .btnmap {
    width: 100%;
    margin: 30px 0 0 0;
    padding: 5px 0;
    color: #fff;
    cursor: pointer;
    background-color: #409eff;
    border: none;    
    border-radius: 3px;
    &:hover {
      background-color: #66b1ff;
    }
  }
}
</style>

 

四、調用組件

<template>
  <div class="box">
    <xmap width="700px" height="500px" :lnglat="[114.433703, 30.446243]" @location="location"></xmap>
  </div>
</template>

<script>
import xmap from '@/components/map'
export default {
  components: { xmap }, 
  methods: {
    location(point, address) {
      alert(`坐標:${point[0]},${point[1]} - 地址:${address}`)
    }
  }
}
</script>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實現代碼如下: 一、Html代碼 二、jQuery代碼 ...
  • 註: ** 先來說下前端為什麼需要學習webpack吧!** 因為現在SPA流行,javascript的依賴包,less,scss.sass樣式文件的編譯。 更重要的是前端現在三大主流Vue.js 、React.js和AngluarJs都和webpack緊緊相連了。 說實話,現在不會一點webpac ...
  • 1.移動端視口問題 視口是指瀏覽器的可視區域,移動端的視口到底是多寬呢? 現在市面上的大部分手機,比如iphone X,它的預設視口寬度為980px,而一個iphone X的屏幕寬度僅僅為375px。看到問題了嗎?一個寬度只有375像素的手機,卻能夠顯示寬度為980像素的網頁,自然而然,網頁會被縮小 ...
  • filter 將模糊或者顏色偏移等圖像效果用於元素,通常用於調整圖像,背景和邊框的渲染 css 標準中已內置一些預定義效果的函數,也可通過url使用 "SVG濾鏡" 語法 濾鏡屬性 需要設定某一函數的值。如果該值無效,函數返回“none“。 url() url 函數接收一個XML文件,該文件是一個 ...
  • 今天是2019年6月21日,周五了。在這裡寫上一篇隨筆,主要內容是css基礎中的一些細節部分,話不多說,直接上! 一、背景漸變: background-image 線性漸變:linear-gradient(漸變方向,色標,色標,色標) 方向: 關鍵字: to top 從下往上 to bottom 從 ...
  • 首先要知道Location這個對象以及這個對象中的一些屬性: href:設置或返回完整的url.如本博客首頁返回http://www.cnblogs.com/wymninja/ host:設置或返回主機名和當前的URL的埠號。本博客首頁返回www.cnblogs.com hostname:設置或返 ...
  • 本文主要是從性能優化的角度來探討JavaScript在載入與執行過程中的優化思路與實踐方法,既是細說,文中在涉及原理性的地方,不免會多說幾句,還望各位讀者保持耐心,仔細理解,請相信,您的耐心付出一定會讓您得到與之匹配的回報。 緣起 隨著用戶體驗的日益重視,前端性能對用戶體驗的影響備受關註,但由於引起 ...
  • 效果如圖: 菜鳥教程(runoob.com) 我的網頁 重置瀏覽器大小查看效果。 我的網頁 重置瀏覽器大小查看效果。 鏈接 鏈接 鏈接 鏈接 文章標題 2019 年 4 月 17日 圖片 一些文本... 菜鳥教程 - 學的不僅是技術,更是夢想!菜鳥教程 - 學的不僅是技術,更是夢想!菜鳥教程 - 學 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...