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

时间:2011-09-09 07:30:25

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

我想在Bing Map Control上放置一些(透明)圆圈作为叠加层。想想“爆炸半径”或“影响范围”之类的东西。我需要在地图上至少有二十几个这些圆圈以及其他一些多边形,所以确保性能不受影响并且地图继续易于操作似乎是关键。

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

  • 为每个圆圈添加n边MapPolygon个实例到地图。试过这个,原则上工作得很好。但是,每个多边形的顶点数量有点腌渍。太小了,当你放大它看起来很可怕。太多了,性能将开始受到影响。

  • 为每个圈子添加Pushpin个实例,并将它们样式/模板化为以图钉位置为中心的圆圈。似乎工作,除了cicle的大小然后固定在屏幕大小,而不是地图大小。因此,当您缩放时,圆圈在屏幕上保持相同的大小,同时它们应该随地图缩放。 你能以某种方式将Ellipse控件(在我使用的样式中的模板中)的大小绑定到父地图控件的Zoom吗?

  • 创建MapShapeBase的自定义子类来表示每个圆圈。此实现可以动态更改用于绘制多边形的顶点数量,具体取决于形状在地图上是否可见(=当前视图端口内部)以及缩放级别。也就是说,如果地图形状可以访问此信息。我还没有尝试过这个选项。

你用过什么?你会用什么?您将如何解决上述问题,特别是使用XAML 将样式中使用的模板中的控件的属性绑定到父控件属性?或者你有其他选择我可以尝试让它发挥作用吗?

3 个答案:

答案 0 :(得分:1)

在RunKeeper中,我们使用了第一个选项,并将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.

答案 1 :(得分:0)

我建议使用画布作为具有透明背景的叠加层,然后使用与here所述类似的技术将椭圆对象添加到其中。

只有技巧才能使画布的宽高比与地图控件对齐,因为它的显示/更新以及椭圆相对于你瞄准的坐标的位置。

答案 2 :(得分:0)

我建议你离开Bing Map Controls并开始使用ESRI Silverlight / WP7 Toolkit。它们有更多可用的控件,您可以直接使用它们。

http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/

以下是所有样本:http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/samples/start.htm

您需要一个帐户才能下载SDK,但它是免费的(注册和下载)。