2011-12-21 16 views
9

私のプロジェクトでは、500メートルの距離のある点から[緯度、経度]座標を見つける必要があります(これは任意の座標または私の周りの座標の配列です)。これどうやってするの?メートルを任意の点から緯度経度に変換する

注:Google Maps Directions APIを使用して返された最短距離と異なる複数のポイントを見つけるには、これが必要です。私の方法を使用して、私は道路の中心をAからBに定義し、 GIS専門家から

任意の提案...私はこれは私が複数のパスを見つけるのに役立つかもしれないと思う - の下に、その中心位置の上にいくつかの座標を見つけて、AからBに行くために別のウェイポイントとしてこれを使用しますか?

EDIT:UTMの変換は、このような計算のために最も好ましいものであり、誰もが必要とする場合、私はUTMのJavaクラスを作成しました。..

答えて

5

私は右のあなたの質問を理解していればあなたは緯度/経度で、既知のポイントを持っており、別のポイントの緯度/経度を計算するか、出発点から500m離れたポイントを計算する必要があります。

これが行われている場合は、ほとんどが専門GIS APIを含むいくつかのオプションがあります。しかし、私はあなたがGeographicではなくプログラマ/数学者であると推測していますので、Haversine式を使用することを選ぶことをお勧めします。このトピックhereに数式を加えたディスカッションを見つけることができます。

1つの警告は、作業しているdistamceは(500メートルはかなり小さい)ということで、地球は完全な球体である、または少しでも回転楕円体を平坦化にはほど遠いです。それは局所的に「塊状」であり、計算結果を出すことができます。より正確なものが必要な場合は、適切なローカルDatum(地球のモデル - 多くの例:EPSG listを参照)を使用してこれらの不完全さを考慮する必要があります。そのためには、数学の取得に合わせてGISライブラリを使用する必要がありますそれ以外は非常に詳細。

+0

ノウハウについて、私は長い計算中に、適切な座標や緯度を見つけるために、[緯度、長い]およびその逆の計算方法にUTMを使用して同じことをしようとしている。..良い方法のように見えます。私はこの方法もあなたと同じだと思うが、数式だけが違うが、私はUTM式が場所を正確にセンチメートル単位で変換できることを読んだ.Btwはあなたの応答にたくさん感謝する! –

+2

UTMは、地球を多数のゾーンに分割することで、それぞれが独自のデータムを持つことによって、地球の表面の局所変形を既に説明しています。これが、地球全体に単一の投影を使用するWGSよりはるかに正確な理由です。デカルト座標に変換するツールが必要な場合 - ポイントを計算し、数学を気にせずにLat/Longに戻すには、GDAL/OGR(特に空間参照APIであるOSR)をチェックしてください – MappaGnosis

0

これは、それを使用するには、Googleマップ(SphericalUtil.java)

// from SphericalUtil.java 
    // compile 'com.google.maps.android:android-maps-utils:0.4.4' 
    public static LatLng computeOffset(LatLng from, double distance, double heading) { 
    distance /= 6371009.0D; //earth_radius = 6371009 # in meters 
    heading = Math.toRadians(heading); 
    double fromLat = Math.toRadians(from.latitude); 
    double fromLng = Math.toRadians(from.longitude); 
    double cosDistance = Math.cos(distance); 
    double sinDistance = Math.sin(distance); 
    double sinFromLat = Math.sin(fromLat); 
    double cosFromLat = Math.cos(fromLat); 
    double sinLat = cosDistance * sinFromLat + sinDistance * cosFromLat * Math.cos(heading); 
    double dLng = Math.atan2(sinDistance * cosFromLat * Math.sin(heading), cosDistance - sinFromLat * sinLat); 
    return new LatLng(Math.toDegrees(Math.asin(sinLat)), Math.toDegrees(fromLng + dLng)); 
} 

で使用されるコードで、あなただけのcenterLatLng、メートル単位の距離、およびcenterLatLngから度の見出しを入力する必要があります。

あなたの好みの言語に数式を変更することができます。

関連する問題