2012-04-30 5 views
1

現在のユーザーの場所を示すロジックを実装しようとしているときに問題が発生しました。WP7マップコントロールの固定ピンサイズ

<Maps:Pushpin Location="{Binding MyLocation}" Canvas.ZIndex="1000" PositionOrigin="Center" > 
      <Maps:Pushpin.Template> 
       <ControlTemplate> 
        <Grid> 
         <Ellipse Width="{Binding MyAccuracyViewSize}" Height="{Binding MyAccuracyViewSize}" 
           Fill="#60008000" Stroke="Green" StrokeThickness="3"/> 
         <Ellipse Width="18" Height="18" Fill="#A0FF4500" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
        </Grid> 
       </ControlTemplate> 
      </Maps:Pushpin.Template> 
     </Maps:Pushpin> 

より大きな緑色の円は、精度領域を示します。ピクセル単位のサイズはズームによって異なります。ズームレベルが大きい場合は、むしろ大きくなります(> 480ピクセル)。その時点で画面解像度で切り取られます。 AFAIK WP7の制限は、コントロールサイズで2000x2000ピクセルです。

マップコントロールの制限のようです。

この制限を削除して2000x2000ピクセルまでのサイズの楕円を表示するにはどうすればよいですか?

Screenshot with this behavior

ありがとう!

+0

現在のズームレベルの値に基づいてMyAccuracyViewSizeを調整する必要がありますか? –

+0

もちろん。ユーザーが潜在的に使用できる領域を示します。私は円の半径をメートルで知っています。地図上に投影したい場合は、ズームレベルを尊重する必要があります。ズーム== 10の50ピクセルは例えば5km、ズーム== 18の場合は100メーターです。 – Grigory

+0

ピクセル値を高くする代わりに円を拡大してみましたか? – fragmentedreality

答えて

2

MapPolygonはどうですか?

void OnPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) 
     { 
      SecondsCounter = 0; //reset counter 
      double accuracy = e.Position.Location.HorizontalAccuracy; 
     if (accuracy < e.Position.Location.VerticalAccuracy) 
     { 
      accuracy = e.Position.Location.VerticalAccuracy; 
     } 

     if (PolyCircle == null) 
     { 
      PolyCircle = new MapPolygon(); 
      PolyCircle.Opacity = 0.7; 
      //Set the polygon properties 

      PolyCircle.Fill = new SolidColorBrush(Colors.Orange); 
      PolyCircle.Stroke = new SolidColorBrush(Colors.Purple); 
      PolyCircle.StrokeThickness = 4; 

      map1.Children.Add(PolyCircle); 
     } 

     PolyCircle.Locations = CreateCircle(e.Position.Location, accuracy); 


     map1.Center = e.Position.Location;  

    } 

    public static double ToRadian(double degrees) 
    { 
     return degrees * (Math.PI/180); 
    } 

    public static double ToDegrees(double radians) 
    { 
     return radians * (180/Math.PI); 
    } 

    public static LocationCollection CreateCircle(GeoCoordinate center, double radius) 
    { 
     var earthRadius = 6367000; // radius in meters 
     var lat = ToRadian(center.Latitude); //radians 
     var lng = ToRadian(center.Longitude); //radians 
     var d = radius/earthRadius; // d = angular distance covered on earth's surface 
     var locations = new LocationCollection(); 

     for (var x = 0; x <= 360; x++) 
     { 
      var brng = ToRadian(x); 
      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)); 

      locations.Add(new GeoCoordinate(ToDegrees(latRadians), ToDegrees(lngRadians))); 
     } 

     return locations; 
    } 

マイマップの位置の例では、hereより。がんばろう!

関連する問題