osmdroid отображение карт yandex

Кто может подсказать, как реализовать отображение карт яндекса? У гугла и других провайдеров используется сферическая система координат, а у яндекса эллиптическая.. Если просто в XYTileSource или OnlineTileSourceBase отдать ссылку на карты, то карты отображаются со значительным смещением.


Ответы (1 шт):

Автор решения: Falchio

Можно отобразить при помощи Yandex MapKit SDK.
Можно при помощи Osmdroid.

Для Osmdroid только понадобится кастомный XYTileSource и API ключ Yandex, есть бесплатная версия с ограничениями.

YandexTileSource:

import org.osmdroid.tileprovider.tilesource.TileSourcePolicy
import org.osmdroid.tileprovider.tilesource.XYTileSource
import org.osmdroid.util.MapTileIndex



class YandexTileSource : XYTileSource(
    NAME,
    MIN_ZOOM_LEVEL,
    MAX_ZOOM_LEVEL,
    TILE_SIZE_PIXELS,
    FILE_EXT,
    baseUrls,
    COPYRIGHT,
    tileSourcePolicy
) {

    companion object {
        private const val API_KEY = "..." 
        private const val NAME = "AppName"
        private const val MIN_ZOOM_LEVEL = 6
        private const val MAX_ZOOM_LEVEL = 20
        private const val TILE_SIZE_PIXELS = 256
        private const val FILE_EXT = ".png"
        private val baseUrls = arrayOf("https://core-renderer-tiles.maps.yandex.net/tiles?l=map")
        private const val COPYRIGHT = "©Yandex"
        private val tileSourcePolicy = TileSourcePolicy(
            1,
            TileSourcePolicy.FLAG_NO_BULK or
            TileSourcePolicy.FLAG_NO_PREVENTIVE or 
            TileSourcePolicy.FLAG_USER_AGENT_MEANINGFUL or 
            TileSourcePolicy.FLAG_USER_AGENT_NORMALIZED
        )
    }

    override fun getTileURLString(pMapTileIndex: Long): String {
        return (buildString {
            append(baseUrl)
            append("&x=")
            append(MapTileIndex.getX(pMapTileIndex))
            append("&y=")
            append(MapTileIndex.getY(pMapTileIndex))
            append("&z=")
            append(MapTileIndex.getZoom(pMapTileIndex))
            append("&scale=1")
            append("&lang=ru_RU")
            append("&apikey=")
            append(API_KEY)
            append("&ads=enabled")
            // просто просим у Yandex тайлы в подходящей проекции меркатора: 
            // https://yandex.ru/dev/tiles/doc/ru/request
            append("&projection=web_mercator") 
        })
    }
}

При этом координаты надо брать для правильной проекции, скажем с openstreetmap.org

UPD Странно, но работает и без API ключа.

→ Ссылка