首页 > 其他分享 >自定义图标偏移问题

自定义图标偏移问题

时间:2023-07-14 16:13:59浏览次数:45  
标签:map const 自定义 偏移 图标 icon

在地图开发中使用自定义图标(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

标签:map,const,自定义,偏移,图标,icon
From: https://www.cnblogs.com/csincs/p/17553978.html

相关文章

  • Cygwin、Linux Bash计算某个时刻偏移一定时间长度后的时间通用函数:datetimecount
    datetimecount函数代码datetimecount(){ #计算某个日期时间偏移一定时间长度后的时刻(目前主要供录制IPTV直播源时计算视频时长使用) #$1-->偏移量:符合date命令的描述参数即可,也支持传递标准时间格式:eg:+01:23:35(标记符号(加减号)可省略,小时字段可省略) #$2-->要计算偏移......
  • vue 实现自定义主题切换+日夜切换
    此处只参考修改主题色,日夜模式参考elep官网functiongradientColor(this:any,startColor:any,endColor:any,step:any){letstartRGB=gradientColor.prototype.colorRgb(startColor);//转换为rgb数组模式letstartR=startRGB[0];letstartG=star......
  • java8 自定义函数编程
    Java8自定义函数编程在传统的Java编程中,我们通常使用面向对象的方式来组织代码。然而,在某些场景下,面向对象的方式并不是最合适的选择。Java8引入了函数式编程的概念,提供了一些新的特性,例如Lambda表达式和函数接口,使得我们可以更方便地进行函数式编程。Lambda表达式Lambda表达......
  • Win10每次重启后桌面图标排列被打乱的问题?
    一般桌面图标都和我们常用的软件放在一起,这样我们需要的时候就可以马上开始使用。可以说桌面图标是windows系统中教具的代表特征,但是今天发现每次重启Win10后桌面图标自动重新排列? 1.打开操作,输入命令gpedit.msc,然后单击确定。 2.在本地策略组编辑器中打开用户配置/管理模......
  • java设置excel自定义列宽
    Java设置Excel自定义列宽在Java中,我们经常需要操作Excel文件。Excel文件的列宽度对于数据的展示非常重要。默认情况下,Excel中的列宽度是根据内容自动调整的,但有时我们需要手动设置列宽度来确保数据的可读性和美观性。本文将介绍如何使用Java程序来设置Excel文件的自定义列宽。使......
  • 前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • Tomcat中配置自定义404错误页面
    (1)%CATALINA_HOME%\conf\web.xml中web-app节点中添加<error-page><error-code>404</error-code><location>/404.html</location></error-page>在webapps下ROOT新增404.html页面<htmllang="en"><head&g......
  • 六月学习之Haproxy高级功能(自定义HTTP报文)
    6、Haproxy高级功能6.8、自定义HTTP报文6.8.1、reqaddreqadd<string>[{if|unless}<crond>]在请求报文中添加指定首部实现原理:client-->haproxy-->reqadd(添加header)-->web1、在frontend中使用reqadd,将发往后端集群的请求中添加一个headercat/etc/haproxy/haproxy.cfgf......
  • emoji与自定义表情符号分割问题
    在很多ugc场景中,会有用户发布很多表情......
  • react-d3-tree自定义节点使用案例
    react-d3-tree主要API及其中文解释:Tree组件的props:这些API提供了丰富的配置选项,可以用来定制树的外观和行为。例如,可以使用nodeSize属性调整节点的大小,使用pathFunc属性绘制自定义的连线,使用onClick属性处理节点的点击事件等等。data:树的数据对象。zoomable:指......