緯度または経度をメートルに変換する方法は?


127

標準のNMEA形式で緯度または経度の読み取り値がある場合、その読み取り値をメートルに変換する簡単な方法/式があります。これをJava(J9)で実装できますか?

編集:私がやりたいことは簡単にはできないようです、私が本当にやりたいことは次のとおりです:

ウェイポイントに緯度と経度があり、ユーザーに緯度と経度があるとしたら、それらを比較して、ウェイポイントからかなり近い距離にいることをユーザーに知らせるタイミングを決定する簡単な方法はありますか?妥当な主題であることに気づきましたが、これは簡単に実行できるのでしょうか、それとも数学の過多でしょうか?



1
緯度/経度をメートルに変換するとはどういう意味ですか?どこからメートル?地球の表面に沿った座標間の距離を計算する方法をお探しですか?
バルチマーク2009年

2
「ウェイポイント」を定義します。「合理的」と定義する。これは本当に知りたいことですか?「緯度と経度を与えられた2つのポイント間の距離をどのように計算しますか?」
Baltimark 2009年

2
緯度と経度でSQLクエリを実行したいというこの質問に出くわし、Javaコードが一番下にあるこの素晴らしい記事を見つけました。興味があるかもしれません。
Kristof Van Landschoot 2012年

回答:


173

これがJavaScript関数です:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

説明:https : //en.wikipedia.org/wiki/Haversine_formula

hasrsine式は、経度と緯度を指定して、球体上の2つのポイント間の大円距離を決定します。


2
wgs​​とutmの間で変換するライブラリをお探しの方:github.com/urbanetic/utm-converter
Aram

3
上記のコードに関する説明コメントを誰かが追加できれば本当にありがたいです。前もって感謝します!
Ravindranath Akila

このコメントが採用されているように見えるこれを見つけました。リンクはまた、距離計算に関するこの記事に基づいてそれを言っています。したがって、未回答の質問はすべて元のリンクで見つける必要があります。:)
Joachim

この計算に標高を追加するにはどうすればよいですか?
dangalg

62

単純な式を探している場合、地球が40075 kmの円周を持つ球体であると仮定すると、これがおそらく最も簡単な方法です。

メートル単位の緯度1°=常に111.32 km

1メートルの経度の長さ= 40075 km * cos(緯度)/ 360


2
経度方程式はどのように機能しますか?緯度が90度の場合、111 km近くに表示されます。ただし、代わりに0が表示されます。同様に、それに近い値が0近傍でもある
リース

9
緯度は赤道で0度、極で90度です(反対ではありません)。赤道の場合、式は40075 km * cos(0°)/ 360 = 111 kmになります。極の場合、式は40075 * cos(90°)/ 360 = 0 kmになります。
ベン

このアプローチは、質問が2点間の正確な距離を求めるのではなく、むしろ「十分に近い」かどうかという点で単純であると思います。これらの式を使用すると、ユーザーがウェイポイントを中心とする正方形内にいるかどうかを簡単に確認できます。円よりも正方形をチェックする方がはるかに簡単です。
ベン

29

2つの座標間の短い距離を概算するために、http//en.wikipedia.org/wiki/Lat-lonの式を使用しました 。

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

以下のコードでは、ウィキペディアの公式との関係を示すために、生の数値を残しています。

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

ウィキペディアのエントリには、距離計算が縦100kmで0.6m以内、横100kmで1cm以内であると記載されていますが、その精度に近いところは私の使用には問題ないため、これを検証していません。


3
2017年のWikipediaページには、別の(洗練されたように見える)公式があることに注意してください。
Gorka Llona 2017

3
はい、ウィキペディアの式は少し異なりますが、他のウィキペディアの式は、誰かが実際に計算を行ったこのすばらしいSO回答からの同様の結果に基づいているようです。
not2qubit 2018年

10

緯度と経度は距離ではなく点を指定するため、質問は無意味です。2つの(緯度、経度)ポイント間の最短距離について質問がある場合は、大圏距離に関するこのWikipediaの記事を参照してください。


9
彼は参照変換について話しているので、あなたの答えはポイントになりません(しゃれは意図されていません)
Paulo Neves

1
また、参考として、GPS位置のデータム変換の変換ガイドを示します。www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves

2
彼は1メートルあたりの度数を知り、2点間の距離を見つけたいと考えています。行間を読みます。
theAnonymous 2017

1
そしてあなたの答えはもっと無意味です
jerinho.com

7

これを簡単にするツールはたくさんあります。モンジャーディンの答えを見る何が関係しているかについての詳細は、を。

ただし、これは必ずしも難しいことではありません。Javaを使用しているようですので、GDALなどを調べることをお勧めしますます。ルーチン用のJavaラッパーを提供し、Lat / Lon(地理座標)からUTM(投影座標系)またはその他の適切なマップ投影に変換するために必要なすべてのツールを備えています。

UTMはメーターなので、使いやすいので便利です。ただし、適切に実行するには、適切なUTMゾーンを取得する必要があります。緯度/経度のペアの適切なゾーンを見つけるために、グーグル経由で利用できるいくつかの単純なコードがあります。


7

地球は不愉快に不規則な表面なので、これを正確に行う簡単な公式はありません。地球のおおよそのモデルと一緒に暮らし、座標を地球に投影する必要があります。このために通常使用するモデルはWGS 84です。これは、GPSデバイスがまったく同じ問題を解決するために通常使用するものです。

NOAAには、このWebサイトでこれを支援するためにダウンロードできるソフトウェアがいくつかあります。


6

念のためbh-関数のRバージョンを以下に示します

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}

2

1海里(1852メートル)は、赤道での経度の1 分の弧として定義されます。ただし、変換が実際に意味をなすように作業しているマップ投影UTMも参照)を定義する必要があります。


1
いいえ、海里は国際規格(v en.wikipedia.org/wiki/Nautical_mile)で1852m と定義されています。地球などの回転楕円体の表面の円弧の測定との関係は、歴史的かつおおよそのものです。
高性能マーク


1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

リンクが壊れているのがわかります。
tshepang 2013年

1

緯度と経度をXおよびY表現に変換するには、使用するマップ投影のタイプを決定する必要があります。私については、楕円形のメルカトル図法は非常によく見えます。ここに実装があります(Javaでも)。


0

十分に近い場合は、それらを平面上の座標として扱うことで回避できます。これは、完全な精度が要求されず、任意の制限と比較するために必要な距離を大まかに推測するだけであれば、ストリートレベルやシティレベルで機能します。


3
いいえ、それはうまくいきません!緯度の値が異なると、mでのx距離は異なります。赤道ではそれを逃れるかもしれませんが、極に近づくほど楕円体が極端になります。
RickyA、2012年

3
あなたのコメントは妥当ですが、緯度/経度の差をメートルに変換することに関するユーザーの質問には答えません。
JivanAmara 2013

0

地球での退行の平均距離に基づいています。

1°= 111km;

これをラジアンに変換してメートルで除算すると、RADのマジックナンバーがメートル単位になります。0.000008998719243599958;

次に:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;

3
最後に、簡単な答え:)
Ben Hutchison

緯度が-179で、もう一方が179の場合、x距離は358ではなく2度になるはずです。
OMGPOP

7
この回答は使用しないでください(何らかの理由で賛成されます)。経度と距離の間に単一のスケーリングはありません。地球は平らではありません。
CPBL

1
111.1だと思います
Abel Callejo

6
経度の1度は赤道で111 kmですが、他の緯度ではそれよりも小さいことに注意してください。緯度の関数で経度1°のkm単位の長さを求める簡単な近似式があります。経度1°= 40000 km * cos(緯度)/ 360(もちろん、緯度= 90°で111 kmになります)。また、経度の1°は、ほとんどの場合、緯度の1°とは異なる距離であることに注意してください。
ベン

-1

単純なソリューションが必要な場合は、他のコメントで概説されているように、Haversine式を使用します。精度に敏感なアプリケーションを使用している場合、Haversineの式は、地球が球体であると想定しているため、0.5%以上の精度を保証しないことに注意してください。地球が扁平な回転楕円体であると考えるには、ビンセンティの公式を使用することを検討してください。さらに、Haversineの式で使用する半径がわからない:{赤道:6,378.137 km、極地:6,356.752 km、体積:6,371.0088 km}。


it is assuming the earth is a circle^^最近、奇妙な人々がこれをやっています...しかし、あなたが言っていることは、おそらくit is assuming the earth is a sphere;)
derHugo

-2

球体ジオメトリを実行するには、座標をラジアンに変換する必要があります。変換したら、2点間の距離を計算できます。その後、距離を任意のメジャーに変換できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.