Math 创建缩放的地图圆

Math 创建缩放的地图圆,math,bing-maps,windows-phone,Math,Bing Maps,Windows Phone,类似的问题在这里已经被问过很多次了,但似乎没有一个能完全满足我的需求。我正在使用Windows Phone上的Bing地图控件,我想添加一个椭圆,该椭圆可以根据缩放变化进行适当缩放。这可以通过多边形线和多边形完成,但没有从MapShapeBase派生的椭圆类型。我尝试过各种方法,但它们需要处理像素大小,并伪造数学,使其与地理坐标对齐。我想创建一个以米为中心的椭圆和x/y尺寸,并让框架完成其余部分。看起来很简单。我在什么地方错过了吗?我的另一种方法是在一条多边形线上绘制365条线段,但这看起来非常

类似的问题在这里已经被问过很多次了,但似乎没有一个能完全满足我的需求。我正在使用Windows Phone上的Bing地图控件,我想添加一个椭圆,该椭圆可以根据缩放变化进行适当缩放。这可以通过多边形线和多边形完成,但没有从MapShapeBase派生的椭圆类型。我尝试过各种方法,但它们需要处理像素大小,并伪造数学,使其与地理坐标对齐。我想创建一个以米为中心的椭圆和x/y尺寸,并让框架完成其余部分。看起来很简单。我在什么地方错过了吗?我的另一种方法是在一条多边形线上绘制365条线段,但这看起来非常难看,因为中心可以移动,所以我需要绑定每个线段的位置。那似乎很重。还有其他想法吗


[具体来说,我想在当前位置周围添加一个“GPS精度”指示器作为圆圈。]

更新

在Mango中,手机会自动显示这样一个圆圈

原始帖子

这相当容易。您只需使用图钉控件来绘制

1) 将贴图层添加到控件:

<maps:MapLayer>
    <maps:MapPolygon Fill="Gray"
                        IsHitTestVisible="False"
                        Locations="{Binding AccuracyLocationCollection}"
                        Opacity="0.6"
                        Stroke="Black"
                        StrokeThickness="2" />
</maps:MapLayer>
3) 在GeoCoordinateWatcher_PositionChanged事件处理程序中,计算圆的大小,并将值设置为AccuracyLocationCollection

ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);
4) DrawMapsCircle的代码如下所示:

专用静态双ToRadian(双度) { 返回度*(数学PI/180); }

专用静态双ToDegrees(双弧度)
{
返回弧度*(180/数学π);
}
公共静态位置集合DrawMapsCircle(地理坐标位置)
{
双接地半径计=6367.0*1000.0;
var lat=托拉迪安(位置、纬度);
var lng=ToRadian(位置、经度);
var d=位置。水平精度/地球半径米;
变量位置=新位置集合();

对于(var x=0;x AFAIK,API不会返回指示位置精度的数据。如果返回了,您仍然需要放大相当远的距离才能看到一个代表2-5m直径的圆。大多数GPS单位只是将其表示为屏幕上某个位置的数字。这看起来很好。如果我可以使用实际的省略号,可能会更便宜e而不是360点多边形,但我会尽我所能。谢谢!记录在案,在Mango中它是自动显示的,所以没有理由自己编写代码。@ClausJørgensen:我用的是Mango,它看起来不像是一个如此精确的圆。我必须设置一个参数吗?
ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);
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;
}