2011-03-31 1 views

ответ

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> 

(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. return SqlGeometry.STAsText, чтобы вернуть WKT той точки, которую вы получили, позвонив в STCentroid.

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

Надеюсь, что это помогает и не слишком долго наматывался :)