效果如图:
一、创建自定义切片层
要创建自定义图块层,您必须调用BaseTileLayer
类的createSubclass()
方法。命名自定义层为TintLayer
由于这一层需要知道在哪里访问预定义的图块,我们将创建一个属性。应用程序将为图层提供值,图层将从生成的 URL 中获取切片。然后在显示每个图像之前将差异混合操作应用于 Stamen 块。我们将在该层上创建一个属性,以便应用程序可以指定一种颜色,该颜色将用于混合操作
const TintLayer = BaseTileLayer.createSubclass({
// 设置特定于此图层的特性
properties: {
// tile的url,由应用程序提供
urlTemplate: null,
// 更改图层颜色
tint: {
value: null,
type: Color
}
}
});
可以通过两种不同的方式扩展 BaseTileLayer
:
- 请求图块,因为它们是从数据源预定义的
- 图像或数据需要在视图中显示之前进行预处理
二、请求图块
要请求从数据源预定义的图像,请覆盖getTileUrl()
方法,以便它返回给定级别、行和列的所请求图块的 URL。
const MyCustomTileLayer = BaseTileLayer.createSubclass({
properties: {
urlTemplate: null
},
// 重写getTileUrl()
// 为LayerView提供的给定级别、行和列生成tile url
getTileUrl: function(level, row, col) {
return this.urlTemplate
.replace("{z}", level)
.replace("{x}", col)
.replace("{y}", row);
}
});
三. 图像或数据在视图中显示之前需要进行预处理
如果数据或图块需要在显示前进行预处理,则覆盖fetchTile()
方法。图像和颜色混合后,最终结果将显示在视图中
const TintLayer = BaseTileLayer.createSubclass({
properties: {
urlTemplate: null,
tint: {
value: null,
type: Color,
},
},
//为LayerView提供的给定级别、行和列生成tile url
getTileUrl: function (level, row, col) {
return this.urlTemplate.replace("{z}", level).replace("{x}", col).replace("{y}", row);
},
// 此方法获取指定级别和大小的瓦片
// 重写此方法以处理从服务器返回的数据
fetchTile: function (level, row, col, options) {
// 调用getTileUrl()方法来构造tiles的URL
// 对于LayerView提供的给定级