Пользовательский рендеринг в Bing Silverlight Control

Я работаю над проектом Silverlight 2, в котором используется элемент управления Bing Maps. Наши ребята из UX задаются вопросом: можно ли полностью настроить внешний вид карты? Например, нарисуйте страны в виде простых контуров с различными цветными интерьерами. Или нарисуйте океан белым цветом, а страны - черными пунктирными фигурами.

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

Спасибо Кент

1 ответ

Решение

Чтобы ответить на мой собственный вопрос, да, это возможно.

Во-первых, добавьте свой собственный слой с пользовательским источником плиток:

<m:Map>
    <m:Map.Mode>
        <mCore:MercatorMode/>
    </m:Map.Mode>
    <m:Map.Children>
        <m:MapTileLayer>
            <m:MapTileLayer.TileSources>
                <local:CustomTileSource/>
            </m:MapTileLayer.TileSources>
        </m:MapTileLayer>
    </m:Map.Children>
</m:Map>

Затем определите CustomTileSource, Вот пример:

public class CustomTileSource : TileSource
{
    public CustomTileSource()
        : base(GetAbsoluteUrl("/ClientBin/Resources/{0}.png"))
    {
    }

    public override Uri GetUri(int x, int y, int zoomLevel)
    {
        var quadKey = new QuadKey(x, y, zoomLevel);
        return new Uri(String.Format(this.UriFormat, quadKey.Key));
    }

    public static string GetAbsoluteUrl(string strRelativePath)
    {
        if (string.IsNullOrEmpty(strRelativePath))
            return strRelativePath;

        string strFullUrl;
        if (strRelativePath.StartsWith("http:", StringComparison.OrdinalIgnoreCase)
          || strRelativePath.StartsWith("https:", StringComparison.OrdinalIgnoreCase)
          || strRelativePath.StartsWith("file:", StringComparison.OrdinalIgnoreCase)
          )
        {
            //already absolute
            strFullUrl = strRelativePath;
        }
        else
        {
            //relative, need to convert to absolute
            strFullUrl = System.Windows.Application.Current.Host.Source.AbsoluteUri;
            if (strFullUrl.IndexOf("/ClientBin") > 0)
                strFullUrl = strFullUrl.Substring(0, strFullUrl.IndexOf("/ClientBin")) + strRelativePath;
        }

        return strFullUrl;
    }
}

Обратите внимание, как источник плитки должен возвращать URL. Если у вас есть изображение, которое вы хотите использовать в качестве карты, вы можете использовать инструмент MapCruncher для его подготовки.

Другие вопросы по тегам