在WP8中从距离转换为GeoCoordinate

时间:2013-02-18 12:30:12

标签: c# windows-phone-7 geolocation maps here-api

我想找到距离我位置4000公里的地方的GeoCoordinate,将其命名为newLocation

我需要这样才能将结果转换为ViewportPoint,如下所示:

System.Windows.Point p1 =
mapControl.ConvertGeoCoordinateToViewportPoint(newLocation);

并假设我的位置定义为:

System.Windows.Point p2 =
radiusMap.ConvertGeoCoordinateToViewportPoint(myLocation);

然后我可以简单地添加一个以我的位置为中心的圆圈,边框从我需要计算的newLocation开始,如下所示:

    double radius = getDistance(p1, p2);

    Ellipse circle = new Ellipse();
    circle.Width = radius * 2;
    circle.Height = radius * 2;
    circle.Opacity = 0.4;
    circle.Fill = new SolidColorBrush(Colors.Green);
    MapOverlay mapOverLay = new MapOverlay();
    mapOverLay.PositionOrigin = new System.Windows.Point(0.5, 0.5);
    mapOverLay.Content = circle;
    mapOverLay.GeoCoordinate = myLocation;
    MyLayer.Add(mapOverLay);

    radiusMap.Layers.Add(MyLayer);

所以,计算newLocation就是我所需要的。

注意:

  1. 我尝试this solution,但有一个限制。
  2. 我们可以在visual studio中执行以下操作:

    GeoCoordinate location1 = ..., location2 = ...;
    double distance = location1.GetDistanceTo(location2);
    
  3. 我想知道逆是否已经实现。

    更新:我找到了GetDistanceTo(...)的实现,这里是:

    double d = this.Latitude * 0.017453292519943295;
    double num3 = this.Longitude * 0.017453292519943295;
    double num4 = other.Latitude * 0.017453292519943295;
    double num5 = other.Longitude * 0.017453292519943295;
    double num6 = num5 - num3;
    double num7 = num4 - d;
    double num8 = Math.Pow(Math.Sin(num7 / 2.0), 2.0) + ((Math.Cos(d) * Math.Cos(num4)) * Math.Pow(Math.Sin(num6 / 2.0), 2.0));
    double num9 = 2.0 * Math.Atan2(Math.Sqrt(num8), Math.Sqrt(1.0 - num8));
    return (6376500.0 * num9);
    

    我想知道是否可能获得逆转。即给它我的地理坐标,以及与我的距离,以便它返回新地点的地理坐标。

1 个答案:

答案 0 :(得分:2)

当然有无数个点(围绕一个圆圈)距离起始点400公里,你需要定义距离承载为了将此减少到一个点。

如果你可以假设地球是一个球体,你可以如图所示环绕一个大圆圈

φ2 = asin( sin(φ1)*cos(d/R) + cos(φ1)*sin(d/R)*cos(θ) )
λ2 = λ1 + atan2( sin(θ)*sin(d/R)*cos(φ1), cos(d/R)−sin(φ1)*sin(φ2) )

其中

  • φ是纬度
  • λ是经度
  • θ是方位(以弧度表示,从北方顺时针方向)
  • d是行进距离
  • R是地球半径6 378.1公里
  • d / R是角度距离,以弧度为单位

因此,请插入您的值以计算新位置φ2λ2

如果“正确到我的位置”是指正东,θ将是90度= Π / 2

当然有一个黑客,你可以用来找到东方的一个点。赤道一度经度= 110.57公里。因此,您可以计算上限,然后进行下调至合理的阈值。

  1. 从你的起点开始 - 行驶400公里,增加3.61度。
  2. 使用 distanceTo()方法检查距离
  3. 如果太大,请切掉一部分程度。
  4. 重复2)+ 3)直到达到可接受的阈值。