如何将 Bing Map 的缩放级别设置为刚好足以显示所有图钉?

问题描述

当我向 Bing 地图添加大量 pushpins 时,我希望缩放级别自动更新为“最适合” - 允许显示所有图钉的“最接近”视图。

我想这将通过计算所需的缩放级别来完成.

我的想法是将 GeoCoordinates 的列表传递给一个方法,该方法将返回适当的 ZoomLevel,可能还有一个单独的方法来计算地图的中心点。

这两个值随后可用于地图的 SetView(location,ZoomLevel) 方法

这是否已经完成,或者是否有 Bing Maps 调用可以处理此问题?

解决方法

有一个 SetView 重载,它接受位置列表并将视图设置为这些位置的边界矩形。它确保所有位置都可见;您还需要为视图矩形添加一些额外的边距,以确保所有图钉都可见。

在地图上有图钉意味着您已经有了位置列表,如果没有,您可以轻松获取所有这些图钉的位置。

示例

假设您已按照 How can I add a Bing Maps Component to my C# Winforms app? 中的步骤操作,向表单添加一个按钮并像这样处理其点击事件:

private void button1_Click(object sender,EventArgs e)
{
    var map = this.userControl11.myMap;

    //Locations
    var locations = new[] {
        new Location(47.6424,-122.3219),new Location(47.8424,-122.1747),new Location(47.67856,-122.130994)};

    //Add Pushpins
    locations.Select(x => new Pushpin() { Location = x })
        .ToList().ForEach(x => { map.Children.Add(x); });

    //Margin
    var w = new Pushpin().Width;
    var h = new Pushpin().Height;
    var margin = new Thickness(w / 2,h,w / 2,0);

    //Set view
    map.SetView(locations,margin,0);
}

这是结果:

enter image description here

注意:如果您没有位置列表,但地图上只有几个图钉,那么您可以轻松地获得这样的位置:

var map = this.userControl11.myMap;
var locations = map.Children.OfType<Pushpin>().Select(x => x.Location);