微软Bing Maps Silverlight Control开发网友问题解答(2010年4月11日)

一、riancy提问:你好,请问一下,使用bing map api,中间的地图,能换成自己的XAML图形显示出来吗?实现自定义XAML图形的放大与缩小,和定义。

  我希望:
  1.地图不要显示了
  2.XAML图形显示出来
  3.可以移动这个XAML图形,放大与缩小时,这个XAML也能跟着放大缩小
  4.描定图标要显示在这个XAML图形上

 

  Beniao解答:

  地图不显示只显示自定义图层可以直接设置地图的Mode属性为MercatorMode就可以了。

  Bing Maps Silverlight Control或者是Bing Maps Ajax Control都是基于地图图片的地图数据模型加载呈现出来的,你想实现自定义XAML图形并呈现在Bing Maps中是可以的,自定义的XAML图形其实也就是一个Silverlight UIElement,可以直接作为Bing Maps Silverlight Control的子元素添加到空间的地图图层中呈现出来。

 

  在操作图层的时候其实就是把自定义图层当做地图图层一样的操作,移动、放大、缩小等功能都可直接使用地图提供的,标注图标显示在XAML图形上主要就是一个定位功能,取决于地理坐标(经度、纬度),要显示在自定义XAML图形中只需要计算出当前图形中的物理坐标对应于Bing Maps的地理坐标就可以实现了。

 

  如果要实现自定义图层的缩放,也是可以实现的,不过在实现中如要要保证自定义图形的效果可能比较麻烦,图形放大后肯定会影响其效果的,要实现自定义XAML中定义的图层的放大和缩小,Silverlight中提供有ScaleTransform特性,专门应用于Silverlight中对象的缩放动画实现,如果将其应用到Bing Maps中,你需要根据地理坐标、放大级别等相关参数去进行计算出放大比例程度,然后动态控制自定义图形的ScaleTransform就可以了。

 

  参考博文:Silverlight & Blend动画设计系列三:缩放动画(ScaleTransform)

  

二、xiaosonl提问:你好: 我在开发Bing Map中, 遇到两个问题无法解决, 不知能否帮我解答一下, 万分感谢. 一个是在地图中加了一个图钉标注, 位于路的正中间, 但是随着不断放大后, 图钉会向下偏移到路的外面去, 缩小的话就会向上偏移. 另一个是我们控制地图的显示级别只能到18级, 这个要怎么设置?

 

  Beniao解答:

  你添加图钉标注随着地图的缩放级别改变存在偏移的情况主要是由于位图愿意造成的,Bing Maps Silverlight Control中提供的Pushpin类使用了图片,应该是图标控件没有以矢量图的形式呈现出来,如果以矢量图的形式呈现出来是不会出现你所说的情况的。我在《如何在DeepEarth中进行图形绘制(点、线、多边形以及自定义图片图层)》这篇文章里介绍的添加自定义图层的方式就存在你所说的情况。

 

  要解决这个问题可以自定义图钉标注控件或是重写其呈现的实现,将图片等元素作为自定义图钉的内容呈现(比如布局在Grid中),然后设置Grid为自定义图钉控件的模板对象,如下是使用DeepEarth开发中的实现,Bing Maps Silverlight Control中开发同理:

[TemplatePart(Name = "RootElement", Type = typeof(Grid))]
public class PushpinLayer : PointBase
{
    
protected Grid RootElement;

 

 

  如下是我定义的一个图钉样式:

<!-- 自定义地图标注控件 -->
<Style x:Name="PushpinStyle" TargetType="layer:PushpinLayer">
    
<Setter Property="Template">
        
<Setter.Value>
            
<ControlTemplate TargetType="layer:PushpinLayer">
                
<Grid x:Name="grdRoot" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" RenderTransformOrigin="0,0">
                    
<Grid.RenderTransform>
                        
<TransformGroup>
                            
<ScaleTransform x:Name="_ScaleTransform" ScaleX="1" ScaleY="1"/>
                            
<SkewTransform/>
                            
<RotateTransform/>
                            
<TranslateTransform/>
                        
</TransformGroup>
                    
</Grid.RenderTransform>
                    
<Image x:Name="pushImage" Source="Resources/Pushpin.png"></Image>
                
</Grid>
            
</ControlTemplate>
        
</Setter.Value>
    
</Setter>
</Style>

 

 

  在自定义图顶层的时候将Grid和Image作为TemplatePart呈现就行了,如下代码块: 

[TemplatePart(Name = "RootElement", Type = typeof(Grid))]
[TemplatePart(Name 
= "PushpinImage", Type = typeof(Image))]
public class PushpinLayer : PointBase
{
    
protected Grid RootElement;
    
protected Image PushpinImage;

 

 

  关于如何控制地图只显示到18级,这个只有通过间接的方式去实现了,最简单就是通过ZoomLevel事件判断当前地图级别如果大于18就设置到18级。

 

三、新阿伦提问:能不能在代码中让浏览者无法自行移动地图,只能通过开发者的代码进行移动?!?!?!?急。

 

  Beniao解答:

  可以实现的,Map对象提供了很多的Mouse事件,在这些事件处理函数中进行自我代码控制就行了。

 

四、情海无缘提问:看到你的BingMaps系列文章,里面介绍了bingmaps的路由功能,但是所展示的路由服务在中国不能显示正确的路线(不和bing中国网站上显示的路线一样),是否是路由服务地址划分了区域?请问中国的路由服务地址是什么?Thanks!

 

  Beniao解答:

  你提到的不能正确显示路线应该是取的数据的问题,路由解析方法不仅仅只是返回了正确的路线数据,还包括路径中相关的其他地理坐标(经度、纬度)数据,这点我在博文中提到过,在开发的时候请根据自己的需求排除地图服务返回的数据中的不需要的数据结果,仅根据正确的坐标点绘制路线就可以正常显示了。

  

  感谢大家对【Silverlight】Bing Maps系列文章 的关注,在阅读【Silverlight】Bing Maps系列文章使用Bing Maps Silverlight Control开发中的任何问题,欢迎大家前来交流、讨论、分享。

  有相关疑问的推荐大家到MSDN论坛提出,论坛地址:http://social.microsoft.com/Forums/zh-CN/silverlightzhchs/threads

 

版权说明

  本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。  

  作      者:Beniao                                微软Bing Maps开发群:75662563

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

posted on 2010-04-11 19:20  Bēniaǒ  阅读(2985)  评论(14编辑  收藏  举报