我如何获得 WMTS 的 zyx mapbox

How i can get zyx mapbox for WMTS

我想在我的应用程序目录中保存一些磁贴。我想,我可以从 bbox 开始,但我不知道当前的坐标 (z,y,x) 可供下载。
Bbox 总是喜欢:

[
   southwest: Point{type=Point, bbox=null, coordinates=[-180.0, -90.0]}, 
   northeast: Point{type=Point, bbox=null, coordinates=[180.0, 90.0]}, 
   infiniteBounds: true
]

如何获取 z、y、x 以供手动下载?喜欢后台任务(没有UI,只是将图像保存在应用程序目录中)。

binding.mapView.getMapboxMap().getStyle { style ->
                    style(styleUri = MAP_STYLE) {

                        val url = "https://.../wmts/...:{z}/{y}/{x}?format=image/png"
                        //val url = "file://" + requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/{z}/{y}/{x}.png"

                        style.addSource(
                            rasterSource("tile_source_id") {
                                tileSize(256)
                                tileSet(url, listOf(url)) {}
                            }
                        )
                        style.addLayerAbove(rasterLayer("tile_layer_id", "tile_source_id") {}, "water")
                    }
                }

指定图块的 {x} 列和 {y} 行,如 Slippy Map Tilenames specification 中所述。

import kotlin.math.*

fun getXYTile(lat : Double, lon: Double, zoom : Int) : Pair<Int, Int> {
        val latRad = Math.toRadians(lat)
        var xtile = floor( (lon + 180) / 360 * (1 shl zoom) ).toInt()
        var ytile = floor( (1.0 - asinh(tan(latRad)) / PI) / 2 * (1 shl zoom) ).toInt()

        if (xtile < 0) {
            xtile = 0
        }
        if (xtile >= (1 shl zoom)) {
            xtile= (1 shl zoom) - 1
        }
        if (ytile < 0) {
            ytile = 0
        }
        if (ytile >= (1 shl zoom)) {
            ytile = (1 shl zoom) - 1
        }

        return Pair(xtile, ytile)
}