1

自分の位置から 4000 km 離れた場所の 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. この解決策を試しましたが、制限があります。
  2. 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);

逆を得ることが可能かどうか疑問に思います。つまり、自分の地理座標と自分からの距離を与えると、新しい場所の地理座標が返されます。

4

1 に答える 1

2

もちろん、最初の開始点から400kmのところに無限の数の点(円の周り)があります。これを1つの点に減らすには、距離方位の両方を定義する必要があります。

地球を球体と見なすことができれば、図のように大円を回ることができます。

φ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は地球の半径6378.1キロメートルです
  • d / Rは、ラジアン単位の角距離です。

したがって、値をプラグインして新しい場所を計算します φ2λ2

「私の位置に正しい」とは、真東を意味する場合、θ90度= Π/2になります

もちろん、東のポイントを見つけるために使用できるハックがあります。赤道での経度の1度=110.57km。したがって、上限を計算してから、妥当なしきい値まで相互作用することができます。

  1. 出発点を取ります-400kmの場合、3.61度を追加します。
  2. distanceTo()メソッドで距離を確認します
  3. 大きすぎる場合は、度の一部を切り取ります。
  4. 許容可能なしきい値内になるまで、2)+ 3)を繰り返します。
于 2013-02-18T13:22:39.497 に答える