创建缩放的地图圆

时间:2010-12-29 23:35:12

标签: math bing-maps windows-phone

这里曾多次询问类似的问题,但似乎没有一个问题能给我我想要的东西。我正在使用Windows Phone上的Bing Map控件,我想添加一个椭圆,可以根据缩放更改进行正确缩放。这可以使用多边形线和多边形来完成,但是没有从MapShapeBase派生的椭圆类型。我已经尝试了各种方法,但它们需要使用像素大小并捏造数学以使其与地理坐标对齐。我想创建一个椭圆,其中心和x / y尺寸以米为单位,其余部分由框架完成。看起来很简单。我错过了某个地方吗?我的另一种方法是在折线中绘制365个线段,但这看起来非常难看,而且由于中心可以移动,我需要绑定每个线段的位置。这看起来非常重。还有其他想法吗?

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

1 个答案:

答案 0 :(得分:5)

<强>更新

在芒果,手机会自动显示这样一个圈子。

原始帖子

这很容易。您只需使用图钉控件来执行绘图。

1)将MapLayer添加到您的控件中:

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

2)在ViewModel中添加AccuracyLocationCollection属性

public LocationCollection AccuracyLocationCollection
{
    get;
    set;
}

3)在GeoCoordinateWatcher_PositionChanged事件处理程序中,计算圆的大小,并将值设置为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