【问题标题】:Creating a scaled map circle创建按比例缩放的地图圈
【发布时间】:2010-12-29 23:35:11
【问题描述】:

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

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

【问题讨论】:

  • AFAIK,API 不返回指示位置精度的数据。如果是这样,您仍然必须将其放大很远才能看到代表直径为 2-5m 的圆圈。大多数 GPS 单位只是将其表示为屏幕上某处的数字。

标签: math bing-maps windows-phone


【解决方案1】:

更新

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

原帖

这相当容易。您只需使用 Pushpin 控件进行绘图即可。

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 的代码如下:

private static double ToRadian(double degree) { 返回度数 * (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米)

【讨论】:

  • 看起来不错。如果我能做一个实际的椭圆而不是一个 360 点的多边形,似乎它可能会更便宜,但我会尽我所能。谢谢!
  • 作为记录,在 Mango 中它是自动显示的,所以没有理由自己编写代码。
  • @ClausJørgensen:我正在使用 Mango,它看起来不像有这样一个准确度圈。有我必须设置的参数吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多