Уже несколько лет в своем приложении на 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.

ВНИМАНИЕ! После подключения ключ можно будет использовать через 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";
}
}



