2010-12-29 7 views
3

これに類似した質問はここで何度も尋ねられていますが、私はWindows PhoneのBing Mapコントロールを使って作業していますが、ズームの変更に合わせて適切に拡大縮小する楕円を追加したいと思います。これはポリラインやポリゴンで行うことができますが、MapShapeBaseから派生した楕円タイプはありません。私は色々なやり方を試しましたが、ピクセルサイズで遊んで、ジオ座標と一直線になるように数学を見分ける必要があります。私は中心とx/yサイズをメートルで表した楕円を作成し、フレームワークに残りたいと思っています。それはとても簡単です。私はどこかでそれを逃したことがありますか?私の他のアプローチは、ポリラインで365の線分を描くことですが、それはひどく醜いように見えます。そして、中心が動くことができるので、すべての線分の位置をバインドする必要があります。それは非常に重いようです。他の考え?スケーリングされたマップサークルの作成

【具体的には、私は現在の位置の周りの円として「GPS精度」インジケータを追加する。】

+0

私の知る限り、APIは」doesnの位置精度を示すデータを返す。もしそうなら、直径2〜5メートルの円を見るためにはまだまだズームインしなければならないでしょう。ほとんどのGPSユニットは単にこれを画面のどこかの数字として表しています。 – Stonetip

答えて

5

更新

マンゴーにおいて、電話機は自動的に、このような円を示しています。

Orginalポスト

それはかなり簡単です。あなたは、図面を行うために押しピンコントロールを使用するだけです。

1)あなたのコントロールにでMapLayerを追加します。

<maps:MapLayer> 
    <maps:MapPolygon Fill="Gray" 
         IsHitTestVisible="False" 
         Locations="{Binding AccuracyLocationCollection}" 
         Opacity="0.6" 
         Stroke="Black" 
         StrokeThickness="2" /> 
</maps:MapLayer> 

2)円の大きさを計算し、GeoCoordinateWatcher_PositionChangedイベントハンドラであなたのViewModel

public LocationCollection AccuracyLocationCollection 
{ 
    get; 
    set; 
} 

3)でAccuracyLocationCollectionプロパティを追加します。 、AccuracyLocationCollectionに値を設定します。

ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location); 

4)DrawMapsCircleのコードのように進む:

プライベート静的ダブルToRadian(二度) {戻り度*(にMath.PI/180)。 }

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

public static LocationCollection DrawMapsCircle(GeoCoordinate location) 
{ 
    double earthRadiusInMeters = 6367.0 * 1000.0; 
    var lat = ToRadian(location.Latitude); 
    var lng = ToRadian(location.Longitude); 
    var d = location.HorizontalAccuracy/earthRadiusInMeters; 

    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 Location() 
     { 
      Latitude = ToDegrees(latRadians), 
      Longitude = ToDegrees(lngRadians) 
     }); 
    } 

    return locations; 
} 

結果:(これは私の自宅の隣にあり、私は灰色の円の間表示される道路の間に約3メートルがあります確認することができます)

Accuracy Circle

+0

それはかなり良いように見えます。 360ポイントのポリゴンではなく実際の楕円を描くことができれば安いかもしれませんが、私が得ることができるものを取り上げます。ありがとう! –

+0

マンゴーではレコードが自動的に表示されるので、自分でコードする理由はありません。 –

+0

@ClausJørgensen:私はマンゴーを使用していますが、そのような精度の円があるようには見えません。私が設定しなければならないパラメータはありますか? –

関連する問題