緯度/経度とkmの距離を処理するための簡単な計算?


119

kmを緯度または経度の浮動小数点に追加して検索用の境界ボックスを計算できる値に変換する簡単な計算はありますか?完全に正確である必要はありません。

例:イギリスのロンドンの緯度/経度(51.5001524、-0.1262362)が与えられ、その地点から東西25 kmの緯度と、その南北25 kmの緯度を計算する場合ポイント、上記の値に追加するために25kmを小数に変換するにはどうすればよいですか?

私は一般的な経験則を探しています。つまり、1km == +/- 0.XXX

編集:

「lat lon」での最初の検索では、この結果は返されませんでした。

特定の緯度/経度の場所の境界ボックスを計算する方法は?

受け入れられた答えは私の要件には適切であるようです。


回答:


220

おおよその変換は次のとおりです。

  • 緯度:1度= 110.574 km
  • 経度:1度= 111.320 * cos(緯度)km

これは、地球の極地の平坦化を完全に修正するものではありません。おそらく、WGS84参照楕円体(GPSに使用されるモデル)を使用したより複雑な式が必要になるでしょう。しかし、エラーはおそらくあなたの目的には無視できます。

出典:http : //en.wikipedia.org/wiki/Latitude

注意:緯度経度座標は度で表されcosますが、ほとんどの(すべての?)言語の関数は通常ラジアンを受け入れるため、度からラジアンへの変換が必要です。


2番目の式でcos(経度)を意味しますか?
Odys 14

1
どうやってこれを思いついたのですか?何か不足しています。経度の計算について詳しく教えてください。Ty
Odys 14

5
@Odys:同じ経度(北/南)の線上にある2つの点を比較する場合、それらは大きな円上にあり、変換係数は地球の極周を360度で割ったものです。しかし、赤道を除いて「大円」に沿って測定していないため、東西測定では異なります。そのため、特定の緯度での「円周」は小さくなります。そして、補正係数は緯度の余弦であることがわかります。
ジム・ルイス

17
私の説明:cos(0°) = 1=>したがって、赤道で計算を行う際に適用される補正係数はありません。経度はそこで最も広いです。cos(90°) = 0=>極では、経度が1点で交わります。計算する距離はありません。
ジェニー・オライリー

4
@Stijn:Math.cos()を呼び出す前に、度からラジアンに変換する必要があります。
ジム・ルイス



1

興味深いことに、UTM座標についての言及はありませんでした。

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system

少なくとも同じゾーンにkmを追加したい場合、それは簡単なはずです(Pythonではhttps://pypi.org/project/utm/)。

utm.from_latlonおよびutm.to_latlon。


utmへのリンクをありがとう。まったくドキュメントがないように見えるのは衝撃的です。
Westworld

1

Jim Lewisのすばらしい回答に感謝します。この解決策をSwiftの私の機能で説明します。

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

この関数で距離を変換するには、次の式を使用します。

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

「lat * pi / 180」
magamig

1

適切に作成された地理空間クエリを使用しないのはなぜですか?

これは、STContains地理空間関数のSQLサーバーリファレンスページです。

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

または、ボックスおよびラジアン変換を使用したくない場合、cnaは常に距離関数を使用して、必要なポイントを見つけます。

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

ほぼすべてのデータベースに同様の機能があるはずです。

地理空間インデックスを正しく実装した場合、検索は使用しているアプローチよりもはるかに高速になります。


1
一読する瞬間を取ってください編集のヘルプ、ヘルプセンター。Stack Overflowでのフォーマットは他のサイトとは異なります。
ダーマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.