vue3项目使用leaflet 的marker pupop,tooltip伸缩地图报错“_latLngToNewLayerPoint”

vue3 项目使用leaflet 的marker pupop,tooltip伸缩地图报错TypeError: Cannot read properties of null (reading '_latLngToNewLayerPoint')

可以去leaflet 的github上查看issue _latLngToNewLayerPoint
问题描述:点击marker点的弹框信息后伸缩,操作几次就会报以上的错,打印出来看到获取不到地图map信息。
解决办法:重写marker pupop,tooltip方法,判断是否有当前的this._map,有的话继续操作,没有则返回return。

  const map = L.map("map", {
    center: [22.65, 114.1],
    zoom: 6,
    maxZoom: 18,
    minZoom: 3,
    attributionControl: false,
    zoomControl: false,
    // preferCanvas: true,
  });

  // 创建不同地图图层
  const normalLayer = L.tileLayer.chinaProvider("GaoDe.Normal.Map", {
    maxZoom: 18,
    minZoom: 3,
  });

  // 重新Tooltip和L.Popup 的扩展方法(这个需要在你定义地图后重写,位置自己看着放)
  if (map) {
    // 添加 Tooltip 的扩展方法
    // L.Tooltip.include({
    //   _animateZoom(e: any) {
    //     console.log("Tooltip", this, this._map);
    //     if (this._map) {
    //       console.log("添加 Tooltip 的扩展方法 :>> ", this._map);
    //       const pos = this._map._latLngToNewLayerPoint(
    //         this._latlng,
    //         e.zoom,
    //         e.center
    //       );
    //       this._setPosition(pos);
    //     } else {
    //       return;
    //     }
    //   },
    // });
    L.Tooltip.prototype._animateZoom = function (e: any) {
      if (!this._map) {
        return;
      }
      let pos = this._map._latLngToNewLayerPoint(
        this._latlng,
        e.zoom,
        e.center
      );
      this._setPosition(pos);
    };

    L.Tooltip.prototype._updatePosition = function () {
      if (!this._map) {
        return;
      }
      let pos = this._map.latLngToLayerPoint(this._latlng);
      this._setPosition(pos);
    };

    // 添加 Popup 的扩展方法
    L.Popup.include({
      _animateZoom(e: any) {
        console.log("Popup", this._map);
        if (this._map) {
          const pos = this._map._latLngToNewLayerPoint(
            this._latlng,
            e.zoom,
            e.center
          );
          const anchor = this._getAnchor();
          L.DomUtil.setPosition(this._container, pos.add(anchor));
        } else {
          return;
        }
      },
    });
    // 添加 Marker 的扩展方法
    // L.Marker.include({
    //   _animateZoom(opt: any) {
    //     console.log("Marker", this._map);
    //     if (this._map) {
    //       const pos = this._map
    //         ._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center)
    //         .round();
    //       this._setPos(pos);
    //     }
    //   },
    // });
  }
<think>好的,我现在需要帮助用户了解如何使用vue2-leaflet或者找到相关的使用教程。首先,用户提到了vue2-leaflet-markercluster这个插件,还有他们提供的引用资料。我需要整理这些信息,给出一个结构清晰的回答,并且生成相关问题。 首先,我应该从基础开始,比如安装vue2-leaflet。用户可能需要知道如何安装和引入组件。根据引用[2],官网示例和翻译的文档可能有帮助。需要确保用户正确安装leafletvue2-leaflet,可能还要提到peer dependencies的问题。 接下来,基本的地图初始化步骤。需要展示一个简单的示例代码,包括模板部分和脚本部分。引用[2]中的官网示例链接应该放在这里,供用户参考。 然后是关于组件使用的部分,比如添加标记、弹窗、图层等。引用[4]提到了LTooltip使用,可以在这里展示如何添加标记和弹窗。需要给出代码示例,并解释每个部分的作用,比如LMarker、LTooltip的属性和事件。 关于MarkerCluster插件,用户可能想知道如何集成集群标记。引用[1]和[3]提到了vue2-leaflet-markercluster,需要说明安装步骤和基本配置,比如如何引入插件并在模板中使用,同时处理大量标记时的优化方法。 然后,需要列出学习资源,包括官网示例、翻译文档和Leaflet的官方资源。引用[2]中的链接应该分点列出,方便用户查阅。 最后,生成相关问题,可能涉及地图交互、性能优化、其他插件、移动端适配等,这些是用户在使用过程中可能遇到的后续问题。 在检查过程中,需要确保所有LaTeX格式正确,但根据用户的问题,可能数学公式不多,但如果有技术术语或代码变量,要正确使用$...$。例如,变量名如$mapObject可能需要用LaTeX格式,但根据用户提供的示例,似乎代码块更重要,所以可能不需要太多数学公式。不过需注意用户提到的系统级指令,确保行内表达式正确。 还要确认引用标识是否正确添加,每个引用来源末尾都要有[^n],比如引用[1]、[2]、[3]、[4]在适当的位置。 最后,回答结构要符合用户要求,分步骤说明,代码示例用反引号包裹,正确高亮语言,如javascript或html。同时,确保所有链接正确无误,特别是项目地址和官网示例。 现在,整理这些思路,形成一个结构清晰的回答,涵盖安装、基础使用、组件示例、插件集成、学习资源,并生成相关问题。</think>以下是使用$vue2-leaflet$的基础教程与代码示例,结合官方文档与社区资源整理: --- ### 一、环境安装 1. 安装核心依赖: ```bash npm install vue2-leaflet leaflet --save ``` 2. 若需集群功能,添加插件: ```bash npm install vue2-leaflet-markercluster --save # 引用[1] ``` --- ### 二、基础地图初始化 ```html <template> <l-map :zoom="zoom" :center="center" style="height: 400px"> <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer> </l-map> </template> <script> import { LMap, LTileLayer } from &#39;vue2-leaflet&#39;; import &#39;leaflet/dist/leaflet.css&#39;; // 必须引入样式 export default { components: { LMap, LTileLayer }, data() { return { url: &#39;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#39;, attribution: &#39;© OpenStreetMap contributors&#39;, zoom: 8, center: [31.2304, 121.4737] // 上海坐标 }; } }; </script> ``` > 官方示例参考:[vue2-leaflet官网示例](https://vue2-leaflet.netlify.app/components/LIcon.html#demo) [^2] --- ### 三、常用组件示例 #### 1. 添加标记与弹窗 ```html <l-marker :lat-lng="markerPosition"> <l-tooltip :options="{ permanent: true, direction: &#39;auto&#39; }"> 这是一个常驻弹窗 </l-tooltip> </l-marker> ``` > 通过$mapObject$操作底层对象(如动态控制弹窗)[^4] #### 2. 事件绑定 ```javascript <l-marker @click="handleMarkerClick" /> methods: { handleMarkerClick(event) { console.log(&#39;标记被点击&#39;, event.latlng); } } ``` --- ### 四、集成MarkerCluster插件 ```html <l-map> <l-marker-cluster> <l-marker v-for="marker in markers" :key="marker.id" :lat-lng="marker.position" /> </l-marker-cluster> </l-map> <script> import Vue2LeafletMarkerCluster from &#39;vue2-leaflet-markercluster&#39;; import &#39;leaflet.markercluster/dist/MarkerCluster.css&#39;; import &#39;leaflet.markercluster/dist/MarkerCluster.Default.css&#39;; export default { components: { &#39;l-marker-cluster&#39;: Vue2LeafletMarkerCluster } } </script> ``` > 该插件可自动处理$500+$标记的集群优化[^3] --- ### 五、学习资源推荐 1. [Leaflet官方文档(中文翻译)](http://www.360doc.com/content/20/0818/01/21412_930867142.shtml) 2. [Leaflet API参考](http://leafletjs.com/reference-1.3.0.html) 3. [Vue2-Leaflet故障排查指南](http://leafletjs.com/examples.html) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值