You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel Blade集成Leaflet热力图失败:L.heatLayer未定义问题

问题分析与解决方案

你遇到的两个错误本质上是同一个核心问题导致的,再加上一个小语法疏漏,我来帮你拆解清楚:

1. 脚本加载顺序完全颠倒了

leaflet-heat.js是Leaflet的第三方插件,它必须依赖Leaflet核心库leaflet.js才能正常初始化。你现在的代码是先加载leaflet-heat.js,再加载leaflet.js——这就像先装插件再装主程序,插件根本找不到L这个核心对象,直接引发两个连锁错误:

  • 加载heat插件时,L还未被定义,抛出Uncaught ReferenceError: L is not defined
  • 后续即便加载了Leaflet,heat插件已经在错误时机执行过,没有正确挂载到L的原型上,自然就会出现Uncaught TypeError: L.heatLayer is not a function

2. 一处小语法错误

你的图片URL定义行末尾多了一个多余的括号:

url = "{{ asset('ElaAdmin/images/Tower A 1st floor.jpg')}}");
// 这里多了一个闭合括号 --------------------------^

这个语法错误会直接打断JavaScript代码的执行,也是导致功能失效的潜在原因。


修正后的Blade代码片段

调整脚本加载顺序,同时去掉多余的括号:

@section('content')
<div id="image-map"></div>
<!-- 先加载Leaflet核心库 -->
<script type="text/javascript" src="{{ asset('ElaAdmin/assets/js/leaflet/leaflet.js') }}"></script>
<!-- 再加载heat插件 -->
<script type="text/javascript" src="{{ asset('ElaAdmin/assets/js/leaflet/leaflet-heat.js') }}"></script>
<script type="text/javascript">
var addressPoints = [
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
    [-60, 170, "1"],
];

// create the slippy map
var map = L.map('image-map', {
    minZoom: 1,
    maxZoom: 4,
    center: [-58, 133],
    zoom: 2,
    crs: L.CRS.Simple
});

// dimensions of the image
var w = 2093, h = 925, url = "{{ asset('ElaAdmin/images/Tower A 1st floor.jpg')}}";
// 已移除末尾多余的括号

// calculate the edges of the image, in coordinate space
var southWest = map.unproject([0, h], map.getMaxZoom()-1);
var northEast = map.unproject([w, 0], map.getMaxZoom()-1);
var bounds = new L.LatLngBounds(southWest, northEast);

// add the image overlay
L.imageOverlay(url, bounds).addTo(map);

var heat = L.heatLayer(addressPoints).addTo(map);

// tell leaflet that the map is exactly as big as the image
map.setMaxBounds(bounds);
</script>
@endsection

另外建议你打开浏览器开发者工具(F12)的Network标签,确认leaflet.jsleaflet-heat.js都能正常加载(状态码为200),排除路径的隐性问题(比如文件名大小写、空格解析异常等)。

内容的提问来源于stack exchange,提问作者Ikra

火山引擎 最新活动