記錄--仿貝殼地圖畫圈找房功能實現(高德地圖)

来源:https://www.cnblogs.com/smileZAZ/archive/2023/11/28/17862703.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 仿貝殼地圖畫圈找房功能實現(高德地圖) 前言 在最近租房時,看到貝殼找房上線了一個地圖畫圈找房的功能,感覺很是新奇。接觸地圖開發也有很長一段時間了,以前大部分都是基於web pc端開發,所以一般遇到這種圈選,繪製多邊形圓形都是直接基於官方 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

 

仿貝殼地圖畫圈找房功能實現(高德地圖)

前言

在最近租房時,看到貝殼找房上線了一個地圖畫圈找房的功能,感覺很是新奇。接觸地圖開發也有很長一段時間了,以前大部分都是基於web pc端開發,所以一般遇到這種圈選,繪製多邊形圓形都是直接基於官方API直接修改使用的,對於PC端滑鼠操作來說,現有的交互用起來已經很不錯了,但是對於H5移動端來說,只能通過手指觸摸來模擬滑鼠滑動,直接使用現有的API對於移動端交互體驗來說並不是特別好。因此,看到了貝殼找房上這一新穎的功能,確實讓我眼前一亮。話不多說,直接開搞,自己手動實現一個看看。有需要的小伙伴可以直接查看源碼demo:gitee.com/fcli/map-ed…

效果圖如下:

實現思路

剛看到這個功能時,腦海裡閃過一個想法,點成線、線成面。既然是線,那肯定是由一堆點組成的,那最終的圈選的面,也是由線包圍起來的。然後一頓噼里啪啦操作,當我在PC端模擬的時候發現,並沒有那麼絲滑,這不經讓我思考如此絲滑的滑動體驗是怎麼實現的,難道是通過畫板canvas之類的,然後通過獲取繪製的圈範圍再和地圖經緯度重合計算。事實證明,我完全想多了,當我把它放到H5上時,發現操作起來很絲滑,繪製的線段也是平滑的,這讓我醍醐灌頂。一頓測試發現PC端監聽 mouseMove事件並沒有移動端的touchmove事件的觸發的那麼頻繁,像是瀏覽器有節流之類的操作。

主要代碼

地圖初始化

首先,我使用vue3腳手架,所以在引入地圖時與官方demo不太一樣,通過createElement將地圖API載入到頁面上,併在地圖載入完畢後再觸發對應的地圖操作。

onMounted(() => {
  //創建了一個回調函數,高德地圖載入完畢會調用
  window.onload = () => {
    // 所有關於地圖的邏輯全部都要寫在這個回調裡面
    // 保證高德地圖載入完畢
    myMap.value = new AMap.Map('map', { resizeEnable: true, center: [121.429516, 31.151997], zoom: 13 });
    drawMap();
  };
  // key是申請的值
  let url = 'https://webapi.amap.com/maps?v=2.0&key=0cc611512938634634bac0969fdef3c1';
  //創建一個 script dom元素
  let jsapi = document.createElement('script');
  //設定script標簽屬性
  jsapi.src = url;
  //將API文件引入頁面中,載入完畢以後會調用函數
  document.head.appendChild(jsapi);
})

監聽繪開始制地圖

當開始繪製地圖時,先將地圖固定,即:不可縮放、不可拖動... 同時將之前繪製的圖層remove

myMap.value.on('touchstart', () => {
    myMap.value.setStatus({
      showIndoorMap: false,
      dragEnable: false,
      keyboardEnable: false,
      doubleClickZoom: false,
      zoomEnable: false,
      rotateEnable: false
    });
    if (lastPolyLine.value) {
      myMap.value.remove(lastPolyLine.value)
    }

    if (polygonAfterDraw.value) {
      myMap.value.remove(polygonAfterDraw.value)
    }
    lastPolyLine.value = null;
    polyPointArray.value = [];
    isMouseDown.value = true;
  });

監聽繪製過程

當開始繪製時,監聽touchmove事件,記錄每次move觸發的點並保存,通過這些點的集合繪製多邊形,每次繪製多邊形之前清除之前繪製的線段,在視覺上就能看到一條連續的線。

myMap.value.on('touchmove', (e: any) => {
    if (isMouseDown.value) {
      const point = [e.lnglat.lng, e.lnglat.lat]
      polyPointArray.value.push(point);
      if (lastPolyLine.value) {
        myMap.value.remove(lastPolyLine.value)
      }

      const polyline = new AMap.Polyline({
        path: polyPointArray.value, //多邊形輪廓
        isOutline: true,
        strokeColor: "#3366FF",
        strokeOpacity: 1,
        strokeWeight: 2,
        // 折線樣式還支持 'dashed'
        strokeStyle: "solid",
        // strokeStyle是dashed時有效
        strokeDasharray: [15, 5],
        lineJoin: 'round',
        lineCap: 'round',
        zIndex: 50,
      });
      myMap.value.add([polyline])
      lastPolyLine.value = polyline;
    }
  })

繪製結束

繪製結束,使用線段的點生成一個面的範圍,通過這個範圍就能獲取到範圍內的信息了,最後恢復地圖正常狀態。

document.addEventListener('touchend', () => {
    if (isMouseDown.value) {
      // 退出畫線狀態
      isMouseDown.value = false;
      // 添加多邊形覆蓋物,設置為禁止點擊
      polygonAfterDraw.value = new AMap.Polygon({
        fillOpacity: 0.5,
        fillColor: '#7bccc4',
        strokeOpacity: 1,
        strokeColor: '#3366FF',
        strokeWeight: 4,
        strokeStyle: 'solid',
        strokeDasharray: [5, 5],
        //多邊形數據
        path: polyPointArray.value //多邊形輪廓
      });

      myMap.value.add(polygonAfterDraw.value);
      if (lastPolyLine.value) {
        myMap.value.remove(lastPolyLine.value)
      }

      myMap.value.setStatus({
        showIndoorMap: true,
        dragEnable: true,
        keyboardEnable: true,
        doubleClickZoom: true,
        zoomEnable: true,
        rotateEnable: true
      });

    }
  });

本文轉載於:

https://juejin.cn/post/7306146705971085350

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


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

-Advertisement-
Play Games
更多相關文章
  • 數據服務與數據分析場景是數據團隊在數據應用上兩個大的方向,行業內大家有可能會遇到很多問題,數據服務和數據分析系統也是無法統一,分析產生的數據結果往往是離線的,需要額外開發數據服務,無法快速轉化為線上服務賦能外部系統,使得分析和服務之間難以快速形成閉環。而且在以往數據加工過程中存儲往往只考慮了當時的需... ...
  • 本篇針對row_number() over(partition by order by) rn,並僅把rn列用於分類排序後篩選最大值的場景,分析了性能瓶頸的原因,並給出了兩種改進方案。 ...
  • HarmonyOS 開發入門(二) 日常逼逼叨 在HarmonyOS 開發入門(一)中我們描述了 HarmonyOS 開發的語言ArKTs以及Ts簡單的入門級語法操作,接下來我們進入第二部分HarmonyOS開發編輯器以及helloWorld項目創建,有任何說的不合理的地方,希望各位看官老爺批評指正 ...
  • HarmonyOS 開發入門(一) 日常逼逼叨 因為本人之前做過一些Android相關的程式開發,對移動端的開發興趣比較濃厚,近期也瞭解到了一些關於華為HarmonyOS 4.0 的事件熱點,結合黑馬相關教學視頻以及一些相關的技術博客,對HarmonyOS開發做一個知識總結,有任何說的不合理的地方, ...
  • 原文地址: Android app相容低版本Java環境 - Stars-One的雜貨小窩 起因是修複一個Bug遇到的問題,找到了一個可以讓app相容低版本java的方法 眾所周知,Android版本更新後,其內置的JRE環境也隨之更新了 假如我們在app中用到了JDK8的特有的屬性,而用戶的手機設 ...
  • 原來錯誤代碼 mounted() { .... this.map.addEventListener("click", function(e){//地圖單擊事件 var geocoder = new BMap.Geocoder(); var point = new BMap.Point(e.latln ...
  • typora-copy-images-to: media 數組 一、概念 對象中可以通過鍵值對存儲多個數據,且數據的類型是沒有限制的,所以通常會存儲一個商品的信息或一個人的信息: var obj = { goodsname:"手機", price:"5000", introduce:"手機很時尚,很 ...
  • 不要問自己需要什麼樣的人生,而要問自己想要成為什麼樣的人。 我們從前面的學習知道一個 React 組件不僅僅只包含 DOM 結構的,還應該樣式和 Javascript 邏輯的。這裡我們認識邏輯構造之事件處理。 1. React 事件處理 這裡列舉了在 React 中事件的幾種綁定處理方式: impo ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...