xaml - 如何在 WP7 Bing Map 控件上放置多个圆形叠加层?

标签 xaml windows-phone-7 bing-maps geometry

我想在必应 map 控件上放置一些(透明)圆圈作为叠加层。想想“爆炸半径”或“影响范围”之类的东西。我需要在 map 上至少有两打这样的圆圈,以及其他一些多边形,因此确保性能不会受到影响并且 map 继续易于操作似乎是关键。

到目前为止,我可以想到三个选项(其中我尝试了两个):

  • 添加n面MapPolygon每个圆圈的 map 实例。试过这个,原则上工作正常。但是,每个多边形的顶点数有点麻烦。太少了,放大后看起来很丑。太多了,性能将开始受到影响。
  • 添加 Pushpin每个圆圈的实例,并将它们样式/模板化为以图钉位置为中心的圆圈。似乎工作,除了 cicle 的大小然后固定在屏幕大小,而不是 map 大小。因此,当您缩放时,圆圈在屏幕上的大小保持不变,而它们应该随 map 一起缩放。可以绑定(bind)Ellipse的大小吗控制(在我使用的样式的模板中)到 Zoom以某种方式的父 map 控件..?
  • 创建 MapShapeBase 的自定义子类代表每个圆圈。此实现可以根据形状在 map 上是否可见(=在当前视口(viewport)内)以及缩放级别来动态更改用于绘制多边形的顶点数。也就是说,如果 map 形状可以访问此信息。我还没有尝试过这个选项。

  • 你用了什么?你会用什么?您将如何解决上述问题,尤其是使用 XAML 将样式中使用的模板中的控件属性绑定(bind)到父控件属性?或者你还有其他选择我可以尝试让它工作吗?

    最佳答案

    在 RunKeeper 中,我们使用了第一个选项并绑定(bind)了 Locations属性到 LocationCollection 360 个点创建如下:

    protected void UpdateAccuracyCircle()
    {
        var location = this.CurrentLocation;
        if (null != location)
        {
            var lat = location.Latitude * (Math.PI / 180);
            var lng = location.Longitude * (Math.PI / 180);
            var d = (this.Accuracy / 1000.0) / Constants.EarthRadius;
            var circle = new LocationCollection();
    
            for (int x = 0; x <= 360; x++)
            {
                var brng = x * (Math.PI / 180);
                var latRadians =
                    Math.Asin(
                        Math.Sin(lat) *
                        Math.Cos(d) + 
                        Math.Cos(lat) * 
                        Math.Sin(d) * 
                        Math.Cos(brng));
                var lngRadians = 
                    lng + 
                    Math.Atan2(
                        Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat),
                        Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));
    
                circle.Add(
                    new GeoCoordinate(
                        latRadians * (180 / Math.PI),
                        lngRadians * (180 / Math.PI)));
            }
    
            Dispatcher.BeginInvoke(() => this.AccuracyCircle = circle);
        }
    }
    

    在这种情况下,我们只处理一个圆圈(用于准确性指示),因此如果您需要多个圆圈,可能不是特别有效。

    鉴于创建圆的逻辑在此示例中的代码中,我认为您可以轻松调整逻辑以根据 ZoomLevel 使用更多/更少的点来满足选项 3。

    关于xaml - 如何在 WP7 Bing Map 控件上放置多个圆形叠加层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358434/

    相关文章:

    c# XML Treeview (Plumbing) 收藏

    c# - 无法使用 MVVM 架构将数据绑定(bind)到文本框?

    c# - 如何将 json 字符串反序列化为域对象?

    c# - 将地址转换为坐标

    c# - 将 UTM (wsg84) 坐标转换为纬度和经度

    windows-phone-7 - UriKind 在 Windows Phone 页面之间导航

    WPF 错误模板未显示

    windows-phone-7 - WP7:使用 'PhotoCamera'类时相机捕获声音

    c# - 更改图钉 WPF 的图像

    c# - 使用 Bing map 自定义可缩放图像