在 WP8 中从距离转换为地理坐标

Posted

技术标签:

【中文标题】在 WP8 中从距离转换为地理坐标【英文标题】:Converting from distance to GeoCoordinate in WP8 【发布时间】:2013-02-18 12:30:11 【问题描述】:

我想找到距离我的位置 4000 公里的地方的地理坐标,命名为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 就是我所需要的。

注意事项:

    我试过this solution,但有一个限制。

    我们可以在visual studio中做以下事情:

    GeoCoordinate location1 = ..., location2 = ...;
    double distance = location1.GetDistanceTo(location2);
    

不知道逆向是否已经实现。

更新:我找到了 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】:

当然有无限数量的点(围绕一个圆圈)距离初始起点 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

当然,您可以使用 hack 来找到正东方向的点。赤道经度 1 度 = 110.57 公里。因此,您可以计算一个上限,然后向下迭代到一个合理的阈值。

    以起点为起点 - 400 公里,增加 3.61 度。 使用 distanceTo() 方法检查距离 如果太大,请切掉一部分度数。 重复 2)+ 3) 直到在可接受的阈值范围内。

【讨论】:

感谢您的回答。我会测试这些方程式并给你反馈。

以上是关于在 WP8 中从距离转换为地理坐标的主要内容,如果未能解决你的问题,请参考以下文章

地理空间坐标和距离(以公里为单位)

地理空间坐标和以千米为单位的距离

IOS 通过经纬度计算两点的距离及坐标系转换

Arcgis—解决导入XY坐标数据转换投影坐标系失败的方法

iOS-地理坐标转换,原生地图获取的原始坐标转换为地图真实坐标

如何使用 cartopy 将显示坐标转换为地理坐标(纬度、经度)?