Нестандартное наложение плиток не работает в последней версии Google Maps SDK для Android - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь отобразить OpenCycleMaps внутри Google Maps SDK для Android, используя addTileOverlay и пользовательский поставщик плиток, но он не работает в последней версии SDK.

Это версия SDK, которую я использую -

com.google.android.gms:play-services-maps:17.0.0

И это код, который я использую для отображения пользовательских плиток. Здесь я устанавливаю карту в none и затем отображаю вместо нее пользовательские плитки -

val SYDNEY = LatLng(-33.862, 151.21)
val ZOOM_LEVEL = 13f

override fun onMapReady(googleMap: GoogleMap?) {
        googleMap ?: return
        with(googleMap) {
            moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, ZOOM_LEVEL))
            addMarker(MarkerOptions().position(SYDNEY))
            mapType = GoogleMap.MAP_TYPE_NONE
            val mTileProvider = MyUrlTileProvider(256, 256, "http://a.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png")
            addTileOverlay(TileOverlayOptions().tileProvider(mTileProvider))
        }
    }

Это класс провайдера пользовательских плиток -

class MyUrlTileProvider(width: Int, height: Int, private val baseUrl: String) : UrlTileProvider(width, height) {

    override fun getTileUrl(x: Int, y: Int, zoom: Int): URL? {
        try {
            return URL(baseUrl.replace("{z}", "" + zoom).replace("{x}", "" + x).replace("{y}", "" + y))
        } catch (e: MalformedURLException) {
            e.printStackTrace()
        }

        return null
    }
}

Чтобы убедиться, что проблема не была вмой код, я попробовал то же самое с этим ^ кодом в https://github.com/googlemaps/android-samples/tree/master/ApiDemos/kotlin, и, поскольку они не обновились до androidX и все еще используют play-services-maps:11.8.0, он работал там;пользовательские плитки были показаны. При обновлении того же кода для использования последних SDK карт он перестал работать.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Проблема не была в TileProvider или компоненте Google Maps вообще. Проблема была с URL-адресом плитки. Первой проблемой было то, что URL был http, запросы к которому не выполнялись. Вторая проблема в том, что a.tile.opencyclemap.org почему-то не решалась на Android. Поэтому я посмотрел вики OSM и нашел этот URL для opencyclemaps - http://tile.thunderforest.com/cycle/${z}/${x}/${y}.png, который отлично работает.

Это рабочий код -

mapType = GoogleMap.MAP_TYPE_NONE
val mTileProvider = MyUrlTileProvider(256, 256, "https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png.png")
addTileOverlay(TileOverlayOptions().tileProvider(mTileProvider))
0 голосов
/ 15 октября 2019

У меня все работает нормально.

  1. Попробуйте добавить .visible(true) к .tileProvider(mTileProvider)).visible(true)
  2. Сделать лучший URL в TileProvider:
class TileProvider(var time: Long) : UrlTileProvider(256, 256) {
   override fun getTileUrl(x: Int, y: Int, z: Int): URL {
       return URL(String.format(Locale.GERMAN, "https:// domain.com/256/%d/%d/%d/image.png", z, x, y))
   }
}
...