2016-05-20 19 views
1

私は1つの場所(緯度と経度)を持っていて、次の場所(緯度と経度)を見つけたいと思います。南)から私の場所(緯度と経度)。あなたは私とアルゴリズムや機能を教えてくれますか?場所を見つける私の場所から180度(南)に1キロメートル

+0

どの座標系であなたの現在の位置を知っていますか? –

+0

[Haversine formula](https://en.wikipedia.org/wiki/Haversine_formula)を使用して、2点間の距離を計算することができます。より良い方法が必要な場合は、バイナリ検索を使用してそのポイントを見つけることができます。 –

+0

@Andy Turner:Haversine式から新しい関数を作るのは難しいです。どうか私を助けてくれますか? –

答えて

0

JavaでRosetta code実装でスタート:

public static double haversine(double lat1, double lat2) { 
    double dLat = Math.toRadians(lat2 - lat1); 
    return R * dLat; 
} 

(あるべき:

public static double haversine(double lat1, double lon1, double lat2, double lon2) { 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 

    double a = Math.pow(Math.sin(dLat/2),2) + Math.pow(Math.sin(dLon/2),2) * Math.cos(lat1) * Math.cos(lat2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return R * c; 
} 

あなたはdLon == 0があるためlon1 == lon2は、このコードの非常に多くは、右のドロップアウトすることがわかっている場合おなじみのlength = Radius * angle in radians式)

したがって、R = 6372.8とyo単にあなたの現在の緯度から1.0/6372.8を引く(と慎重180 - 1.0/6372.8未満緯度のポイントを処理するために覚えている)、つまり

dLat = 1.0/6372.8; 

:ウル所望の結果が、dLatの値を思い付くのは簡単です、1です。簡単な解決策のために

0

SimpleLatLngライブラリを見て、そのtravel()方法があります:

/** 
    * <p> 
    * Calculate the end point of traveling along a great-circle path from a 
    * given starting point with a given intitial bearing for a known distance. 
    * </p> 
    * 
    * @param start 
    *   the starting point. 
    * @param initialBearing 
    *   the initial bearing. 
    * @param distance 
    *   the distance to travel. 
    * @param unit 
    *   the unit in which distance is measured. 
    * @return the end point. 
    */ 
    public static LatLng travel(LatLng start, double initialBearing, double distance, 
      LengthUnit unit) { 
     double bR = Math.toRadians(initialBearing); 
     double lat1R = Math.toRadians(start.getLatitude()); 
     double lon1R = Math.toRadians(start.getLongitude()); 
     double dR = distance/LatLngConfig.getEarthRadius(unit); 

     double a = Math.sin(dR) * Math.cos(lat1R); 
     double lat2 = Math.asin(Math.sin(lat1R) * Math.cos(dR) + a * Math.cos(bR)); 
     double lon2 = lon1R 
       + Math.atan2(Math.sin(bR) * a, Math.cos(dR) - Math.sin(lat1R) * Math.sin(lat2)); 
     return new LatLng(Math.toDegrees(lat2), Math.toDegrees(lon2)); 
    } 

あなたはちょうどそれを出発点、方向、距離と単位を与え、あなたが計算された位置を取得します。このメソッドはライブラリによって宣言されたいくつかのクラスを使用するため、完全なライブラリを取得する必要があります。他にも便利な計算方法があります。

Apache 2.0 Licenseでご利用いただけます。

0

北の都合で移動しているため、経度を使用しないように計算が簡単になります。 See

1キロは0.0088339度に等しい。

したがって、北半球では、位置の緯度から0.0088339を引いて、経度をそのまま残します。南半球の場合は0.0088339を追加してください。

関連する問題