如何将标签附加到Bing Maps MapPolygon?

时间:2011-03-31 01:52:30

标签: silverlight silverlight-4.0 bing-maps

我正在使用Silverlight Bing地图控件,并已将多个MapPolygon区域定义为地图控件的子项。 我理想的是,能够将TextBlock标签添加到MapPolygon内部的中心。

我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

如果您只需要多边形的近似中心,则可以找到其边界框的中心,并以编程方式在多边形上添加TextBlock。

这样的事情可能有用:

(XAML)

    <MapControl:Map x:Name="MyMap">
        <MapControl:Map.Children>
            <MapControl:MapPolygon Fill="Red" Stroke="Yellow" StrokeThickness="5" Opacity="0.7">
                <MapControl:MapPolygon.Locations>
                    <m:LocationCollection>
                        <m:Location>20, -20</m:Location>
                        <m:Location>20, 20</m:Location>
                        <m:Location>-20, 20</m:Location>
                        <m:Location>-20, -20</m:Location>
                    </m:LocationCollection>
                </MapControl:MapPolygon.Locations>
            </MapControl:MapPolygon>
        </MapControl:Map.Children>
    </MapControl:Map>

(代码隐藏)

     public partial class MainPage : UserControl
{
    private MapLayer tbLayer;

    public MainPage()
    {
        InitializeComponent();

        tbLayer = new MapLayer();

        List<TextBlock> newTbs = new List<TextBlock>();

        // loop through the maps children and find the polygons
        foreach (var child in MyMap.Children)
        {
            if (child is MapPolygon)
            {
                var poly = child as MapPolygon;

                // get the average lat and long to calculate the "center"-ish of the polygon
                var avgLat = poly.Locations.Select(l => l.Latitude).Average();
                var avgLon = poly.Locations.Select(l => l.Longitude).Average();

                TextBlock tb = new TextBlock
                                   {
                                           Text = "Hey there. I'm a polygon."
                                   };

                // set the position of the textblock and add it to a new map layer
                MapLayer.SetPositionOrigin(tb, PositionOrigin.Center);
                MapLayer.SetPosition(tb, new Location(avgLat, avgLon));
                tbLayer.Children.Add(tb);
            }
        }

        // add the new maplayer to the parent map
        MyMap.Children.Add(tbLayer);

    }
}

如果您的多边形形状奇特而不是像我的通用示例那样漂亮的小方块,那么您可能需要稍微肮脏一些。在这种情况下,您可能需要一个可以计算多边形质心的Web服务(WCF)。我不认为在Silverlight中这是一个简单的方法。

这将是一个类似于以下的过程:

  1. 将积分发送给WCF服务方式。
  2. 使用您的积分加载SqlGeometry对象,可能是通过使用这些点形成WKT并使用SqlGeometry.Parse
  3. 在SqlGeometry对象上调用STCentroid。
  4. 返回SqlGeometry.STAsText以通过调用STCentroid返回您刚刚获得的点的WKT。
  5. 这有点乱,但在Silverlight中做空间的东西总是让我的经历变得混乱。

    希望有所帮助并且不会太长时间啰嗦:)