Как прикрепить ярлык к Bing Maps MapPolygon? - PullRequest
1 голос
/ 31 марта 2011

Я использую элемент управления Silverlight Bing Maps и определил несколько областей MapPolygon в качестве дочерних элементов для элемента управления картой.В идеале мне нужна возможность добавить метку TextBlock в центр внутренней части MapPolygon.

Как мне это сделать?

1 Ответ

1 голос
/ 12 мая 2011

Если вам нужен только приблизительный центр многоугольника, вы можете найти центр его ограничительной рамки и программно добавить 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>

(Codebehind)

     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);

    }
}

Если ваши многоугольники имеют странную форму, а не красивые квадраты, как мой общий пример, то вам, возможно, понадобится немного грязнее. В этом случае вам может понадобиться веб-служба (WCF), которая может вычислить ваш центр тяжести многоугольника. Я не думаю, что в Silverlight есть простой способ сделать это.

Это будет процесс, подобный следующему:

  1. Отправьте баллы методу сервиса WCF.
  2. Загрузите SqlGeometry объект с вашими точками, вероятно, сформировав WKT с этими точками и используя SqlGeometry.Parse
  3. Вызовите STCentroid для вашего объекта SqlGeometry.
  4. вернуть SqlGeometry.STAsText, чтобы вернуть WKT точки, которую вы только что получили, вызвав STCentroid.

Это немного беспорядок, но в моем опыте делать пространственные вещи в Silverlight всегда грязно.

Надеюсь, что это поможет и не слишком затянуто :) 1031 *

...