スケーリングされたマップ円の作成
-
14-10-2019 - |
質問
これと同様の質問はここで何度も尋ねられていますが、それらのどれも私が望むものを正確に与えているようには見えません。私はWindows PhoneのBing Map Controlを使用していますが、ズームの変更で適切にスケーリングする楕円を追加したいと思います。これはポリラインとポリゴンで実行できますが、MapShapebaseから派生した楕円タイプはありません。私はそれを行うさまざまな方法を試しましたが、ピクセルのサイズで遊んで、ジオ座標と並べるために数学をファッズする必要があります。センターとX/Yサイズのメートルで楕円を作成し、フレームワークに残りを実行させたいと思います。とても簡単に思えます。どこかで見逃したことがありますか?私のもう1つのアプローチは、365本のラインセグメントをポリラインに描くことですが、それは恐ろしくugいものに思えます。中心は移動できるので、すべてのセグメントの位置をバインドする必要があります。それは非常に重いようです。他に考えはありますか?
具体的には、現在の場所の周りの円として「GPS精度」インジケーターを追加したい。
解決
アップデート
マンゴーでは、電話にそのような円が自動的に表示されます。
元の投稿
かなり簡単です。プッシュピンコントロールを使用して図面を実行します。
1)あなたのコントロールに自動車係を追加します:
<maps:MapLayer>
<maps:MapPolygon Fill="Gray"
IsHitTestVisible="False"
Locations="{Binding AccuracyLocationCollection}"
Opacity="0.6"
Stroke="Black"
StrokeThickness="2" />
</maps:MapLayer>
2)viewmodelに精度コレクションプロパティを追加します
public LocationCollection AccuracyLocationCollection
{
get;
set;
}
3)GeocoordinateWatcher_PositionChangedイベントハンドラーで、円のサイズを計算し、正確誘発コレクションに値を設定します
ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);
4)DrawMapsCircleのコードは次のようになります。
プライベート静的ダブルトラディアン(2倍){return degrees *(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メートルの間にあることを確認できます)