gpt4 book ai didi

javascript - 何时使用 L.TileLayer 与 L.tileLayer

转载 作者:行者123 更新时间:2023-12-01 16:04:48 26 4
gpt4 key购买 nike

我刚刚一直在使用 Leaflet 为网站构建 map ,并注意到要添加 Tile Layer 至少可以使用两种方法,L.TileLayer()L。 tileLayer(),它们的名称仅在单个字符的大小写上有所不同。

但是,虽然这两种方法返回的对象都可以添加到 L.map() 返回的 map 对象中,但 L.TileLayer() 返回的对象> 似乎没有 addTo() 方法,而 L.tileLayer() 返回的对象。例如。两者

var map = L.map('map');
var tiles = new L.TileLayer(<tileUrl>, {attribution: <tileAttrib>});
map.addLayer(tiles);

var map = L.map('map');
var tiles = new L.tileLayer(<tileUrl>, {attribution: <tileAttrib>});
map.addLayer(tiles);

还有

var map = L.map('map');
L.tileLayer(<tileUrl>, {attribution: <tileAttrib>}).addTo(map);

同时

var map = L.map('map');
L.TileLayer(<tileUrl>, {attribution: <tileAttrib>}).addTo(map);

失败。浏览 Leaflet 的文档,似乎正确的使用方法是 L.tileLayer() 所以问题是 L.TileLayer() 的用途是什么?

到目前为止,这是我的代码的完整示例,要尝试不同的替代方案,只需取消注释要测试的代码并确保其他代码已注释

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.3/dist/leaflet.css"
integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.3.3/dist/leaflet.js"
integrity="sha512-tAGcCfR4Sc5ZP5ZoVz0quoZDYX5aCtEm/eu1KhSLj2c9eFrylXZknQYmxUssFaVJKvvc0dJQixhGjG2yXWiV9Q=="
crossorigin=""> </script>
</head>
<body onload="makeMap()">
<script type="text/javascript">
function makeMap() {
var tileUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var tileAttrib = 'Map data &copy <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
var map = L.map('map').setView([63,15],9);

// using tileLayer and addLayer - this works
var tiles = new L.tileLayer(tileUrl, {attribution: tileAttrib});
map.addLayer(tiles);

// using tileLayer and addTo - this works
// L.tileLayer(tileUrl, {attribution: tileAttrib}).addTo(map);

// using TileLayer and addLayer - this works
// var tiles = new L.TileLayer(tileUrl, {attribution: tileAttrib});
// map.addLayer(tiles);

// using TileLayer and addTo - this fails
// L.TileLayer(tileUrl, {attribution: tileAttrib}).addTo(map);
}

</script>
<table border=1 style="position: absolute; top: 0; bottom: 0; left: 0; right: 0; width: 100%; height: 100%;">
<tr style="height: 100%;">
<td>
<div id="map" style="width: 100%; height: 100%;"></div>
</td>
</tr>
</table>
</body>
</html>

最佳答案

长话短说:

这两个都是有效且等价的:

var foo = L.tileLayer(arguments);
var foo = new L.TileLayer(arguments);

这两个在语法上是有效的(因为 Javascript 的历史包袱)但最终会导致错误:

var foo = new L.tileLayer(arguments);
var foo = L.TileLayer(arguments);

to add a tilelayer at least two methods can be used, L.TileLayer() and L.tileLayer()

嗯,它们并不是真正的两种方法。技术上L.TileLayerObject 的实例, 和 L.tileLayerFunction 的实例, 它继承了 Object 的原型(prototype).和 L充当命名空间而不是类实例。

你看,Javascript 中的面向对象编程很奇怪。您可以使用 new keyword几乎任何具有原型(prototype)的对象。和 prototype-based inheritance对于大多数精通“适当的”OOP 的人来说,理解起来很困惑。

如今,有了 ES2015 标准和花哨的 class关键字这不是真正的问题(我会说这是一个问题,但隐藏在语法糖层之下)。但在过去,开发人员不得不求助于,比方说,creative solutions for class inheritance有时涉及 messing with the prototype chain .

Leaflet 使用了这些方法的组合 - 作为不良副作用L.TileLayer变成 Function可以调用L.TileLayer()直接,这很令人困惑。

Leaflet 还使用了 factory functions 的概念:返回类实例的函数。引自 one of the Leaflet tutorials :

Most Leaflet classes have a corresponding factory function. A factory function has the same name as the class, but in lowerCamelCase instead of UpperCamelCase:

function myBoxClass(name, options) {
return new MyBoxClass(name, options);
}

这只是为了方便:它使用户无需输入 new关键词回到new的时代关键字是害怕

但这会产生另一个不希望的副作用,因为在 Javascript 中所有 Function我们有一个原型(prototype),这意味着您可以做类似的事情

 function myFunction() { ... }
var wtf = new myFunction();

因此,new L.tileLayer()也是有效的语法(但在运行时失败)。


then what is the use of L.TileLayer()?

再一次,L.TileLayer()作为函数调用是一个不受欢迎的副作用。但是L.TileLayer代表一个类,引用它很重要,因为:

 if (layer instanceof L.TileLayer)

关于javascript - 何时使用 L.TileLayer 与 L.tileLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com