Карты yandex в Gmap.net

Уже несколько лет в своем приложении на C# Winforms для работы с картами я использую библиотеку Gmap.Net. Отличная библиотека для работы с различными картами: googl, openstreet и др. Карты yandex в Gmap.net так же реализованы и прекрасно работали.

Карты yandex не работают в Gmap

Некоторое время все отлично работало, но вскоре от пользователей приложения посыпались сообщения, что yandex карты перестали отображаться. Начав разбираться в вопросе, понял что карты yandex не работают в Gmap.

Произошло это из-за того, что yandex добавил обязательное использование ключа для доступа к тайтлам карт. Разработчики библиотеки gmap не ввели данное изменение в свою библиотеку. К сожалению последние изменение было в июне 2022, по этому вряд ли что то изменится.

Как запустить карты yandex в Gmap

Алгоритм работы с картами yandex в gmap таков:

  • Получить ключ для работы с тайтлами;
  • Сделать своего кастомного провайдера карт.

Ключ yandex tiles

для того что бы получить ключ yandex tiles, необходимо пройти в кабинет разработчика (https://developer.tech.yandex.ru/services) и войти в систему под нужным пользователем. Затем нажать кнопку “Подключить API” и выбрать из списка Tiles API.

Получение API ключа Tiles

ВНИМАНИЕ! После подключения ключ можно будет использовать через 15-20 минут.

Custom Provider в Gmap

И так, после получения ключа для работы с tiles (тайтлами), переходим к второму пункту. Пишем свой Custom proveder в gmap для активации работы карты yandex в Gmap.net В этой задаче нет ничего сложного, мы просто объявляем новый класс наследуемый от GMapProvider.

public class CustomTileProviderGoogle : GMapProvider
{
    public static readonly CustomTileProviderGoogle Instance = new CustomTileProviderGoogle();
    private readonly HttpClient client;
    public override Guid Id => Guid.NewGuid();
    public override string Name => "CustomTileProviderGoogle";
    public override PureProjection Projection => MercatorProjection.Instance;
    public override GMapProvider[] Overlays => new GMapProvider[] { this };

    private CustomTileProviderGoogle()
    {
        HttpClientHandler handler = new HttpClientHandler { Proxy = WebRequest.GetSystemWebProxy(), UseProxy = true, };

        client = new HttpClient(handler);
        client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");

        MaxZoom = 18;
        MinZoom = 0;
    }

    public override PureImage GetTileImage(GPoint pos, int zoom)
    {
        try
        {
            string url = MakeTileUrl(pos, zoom);
            byte[] data = client.GetByteArrayAsync(url).GetAwaiter().GetResult();

            if (data != null && data.Length > 0)
            {
                return GMapImageProxy.Instance.FromArray(data);
            }
        }
        catch ()
        {
           
        }

        return null;
    }

    private string MakeTileUrl(GPoint pos, int zoom)
    {
        return $"https://tiles.api-maps.yandex.ru/v1/tiles/?projection=web_mercator&x={pos.X}&y={pos.Y}&z=zoom}&lang=ru_RU&l=map&apikey=b3a9de01-b16f-4942-a305-7c6a3f3f5ad5";
    }
}
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии