2009-07-07 6 views
1

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

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

Спасибо, Kent

ответ

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, чтобы подготовить его.

Смежные вопросы