自定義圖標偏移問題

来源:https://www.cnblogs.com/csincs/archive/2023/07/14/17553978.html
-Advertisement-
Play Games

對於各種類型的埋點來說,曝光埋點往往最為複雜、需要用到的技術也最全面、如果實現方式不合理可能造成的影響也最大,因此本文將重點介紹曝光埋點尤其是長列表(或滾動視圖)內元素曝光埋點的實現思路及避坑技巧 ...


在地圖開發中使用自定義圖標(icon)在地圖上表達專題信息十分常見

leaflet中常使用L.marker添加圖標L.icon,非常方便

給定坐標將圖標固定在地圖中的某個位置,由於圖標是有具體大小,並且大小固定不變,在縮放過程中有明顯感覺隨著地圖比例尺縮小,圖標會有一定的偏移

這篇文章主要介紹使用L.icon的iconAnchor屬性解決自定義圖標偏移問題

1 問題復現

上代碼 (後面有完整代碼)

<script>
  // 高德衛星影像
  const layerC = L.layerGroup([
    L.tileLayer('https://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}', {
      maxZoom: 18,
      maxNativeZoom: 16,
      minZoom: 3,
      attribution: '高德地圖 AutoNavi.com',
      subdomains: '1234'
    })
  ])
  var map = L.map('map', {attributionControl: false, layers: [layerC]}).setView([29.324720, 112.494506], 13);

  const defaultLatlng = [29.324720, 112.494506]
  // 添加圓形 顯示定位點
  L.circle(defaultLatlng, {radius: 100, color: 'red'}).addTo(map)
  // 預設圖標
  L.marker(defaultLatlng).addTo(map)

  const iconLatlng = [29.31080, 112.50291]
  // 自定義圖標
  const icon = L.icon({
    iconUrl: './船.png',
    iconSize: [37, 53], // 設置圖片大小 寬度50.高度100
  })
  L.circle(iconLatlng, {radius: 100, color: 'red'}).addTo(map)
  L.marker(iconLatlng, {icon: icon}).addTo(map)
</script>

在這裡插入圖片描述
在這裡插入圖片描述

使用紅色小圓圈展示圖標的定位點

使用預設圖標,圖標的下方在紅色圓圈中心

使用自定義圖標,最開始圖標直接擋住了紅色圓圈,放大後慢慢的圖標顯示在紅色圓圈裡面,在縮放的過程中自定義圖標的最下方有明顯的偏移(底部指向的位置一直在變)

2 解決方案

探究是什麼導致預設圖標和自定義圖標的區別

leaflet沒有開啟canvas繪製,圖標都是dom元素疊加在底圖上

查看dom元素的css樣式

image.png

image.png

從圖標樣式中可以看出,圖標使用了margin屬性來實現圖標位置的調整

與預設圖標相比,自定義圖標的margin-top只是height的一半

使用iconAnchor屬性調整一下

 const icon = L.icon({
    iconUrl: './採砂船正常.png',
    iconSize: [37, 53], // 設置圖片大小 寬度50.高度100
    iconAnchor: [18.5, 53]
 })

在這裡插入圖片描述

自定義圖標縮放的效果沒有偏移的感覺了

完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css"/>
     <!-- Make sure you put this AFTER Leaflet's CSS -->
    <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
  <div id="map" style="height: 500px; width: 500px"></div>
    <script>
      // 高德衛星
      const layerC = L.layerGroup([
        L.tileLayer('https://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}', {
          maxZoom: 18,
          maxNativeZoom: 16,
          minZoom: 3,
          attribution: '高德地圖 AutoNavi.com',
          subdomains: '1234'
        })
      ])
      var map = L.map('map', {attributionControl: false, layers: [layerC]}).setView([29.324720, 112.494506], 13);

      const defaultLatlng = [29.324720, 112.494506]
      // 添加圓形 顯示定位點
      L.circle(defaultLatlng, {radius: 100, color: 'red'}).addTo(map)
      // 預設圖標
      L.marker(defaultLatlng).addTo(map)

      const iconLatlng = [29.31080, 112.50291]
      // 自定義圖標
      const icon = L.icon({
        iconUrl: './船.png',
        iconSize: [37, 53], // 設置圖片大小 寬度50.高度100
        iconAnchor: [18.5, 53]
      })
      L.circle(iconLatlng, {radius: 100, color: 'red'}).addTo(map)
      L.marker(iconLatlng, {icon: icon}).addTo(map)
      // map.on('click', e => {
      //   console.log(e.latlng)
      // })
    </script>
</body>
</html>

3 結論

出現這個偏移的感覺主要是由數學坐標系和屏幕坐標的區別導致的。

在數學坐標系中,中心是原點,向上是y軸正方向,所以我們常將一個圖標的底部作為這個圖標的定位點

但在屏幕坐標系,是以左上角作為坐標原點,右方向作為x軸正方向,下方向作為y軸正方向

image.png

在屏幕坐標系中,圖標左上角固定不變,縮放過程中,底部指向的位置一直在變,給人感覺就是圖標在慢慢偏移

使用marker預設圖標x和y會自動偏移,使用自定義圖標需要手動偏移

iconAnchor參數是反符號偏移 [18.5, 53] 對應的樣式是margin-left: -18.5 和 margin-top: -53


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

-Advertisement-
Play Games
更多相關文章
  • ![file](https://img2023.cnblogs.com/other/2685289/202307/2685289-20230714100921932-1108940383.jpg) ## 用戶案例 | 自如 隨著自如業務的快速發展,不斷增長的調度任務和歷史逾萬的存量任務對平臺穩定性提 ...
  • MySQL資料庫遷移(直接複製文件) - 簡書 (jianshu.com) 看了幾種方法: 1、修改註冊表的 windows下遷移mysql數據 - 程式員丁先生 - 博客園 (cnblogs.com) 2、mysqldump指令將資料庫表/數據保存成xx.sql文件存到本地的 (157條消息) 如 ...
  • #### 先說些廢話 作為一個全棧開發工作者,曾經對公司專職的大數據開發有著濃厚的興趣,所以嘗試學習大數據開發所需要的各種技術棧。 本文就是我在學習過程中記錄下,所遇到的一些大數據面試的提問,僅供參考。 當然,因為時間精力有限,並非所有的問題我都去記錄了答案,如果您不瞭解某些問題或者不認可我記錄的解 ...
  • 1、簡介 人大金倉資料庫(KingbaseES)是面向事務處理類、兼顧分析類應用領域的新型資料庫產品,致力於解決高併發、高可靠數據存儲計算問題,是一款為企事業單位管理信息系統、業務系統量身打造的承載資料庫,目前性能已全面升級,是具有高成熟度的資料庫產品。 2、準備工作 資料庫的安裝包可以在人大金倉官 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230711162608661-1958587529.png) # 1. 一個季度的開始日期和結束日期 ## 1.1. 以yyyyq格式(前面4位是年份,最後1位是季度序號)給 ...
  • 原文地址:https://blog.csdn.net/zhanglei5415/article/details/131434931 ## 一、問題 當對含有中文的url字元串,進行NSURL對象包裝時,是不能被識別的。 不會得到期望的NSURL對象,而是返回一個nil 值 ; ```objectiv ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本文的起因是有在代碼倉庫發包後,同事問我“為什麼package.json 里的版本還是原來的,有沒有更新?”,這個時候我意識到,我們完全沒有必要在每次發佈的時候還特意去關註這個倉庫的版本號,只要在發佈打tag的時候同步一下即可,於是有了本 ...
  • ![你真的瞭解bind嗎](https://guizimo.oss-cn-shanghai.aliyuncs.com/img/%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BA%86%E8%A7%A3bind%E5%90%97.png) # 引言 ## 內容速遞 > 看了本文您能瞭解 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...