1

こんにちは、ルビーの Geokit::LatLng クラスを使用して緯度と経度を保存し、いくつかの点の間の中点を見つけようとしています。この gem に問題があることに気付きました。または、概念を誤解している可能性があります。

          a = Geokit::LatLng.new(13.0627081,80.274658)
          b = Geokit::LatLng.new(12.8550615,80.2264393)

これらの点の間の中点を計算するために「midpoint_to」メソッドを計算したとき、それらが異なる結果を与えることに気付きました

          a.midpoint_to(b) 
<Geokit::LatLng:0x0000000292f368 @lat=12.95888590853612, @lng=80.25053859693796> 

          b.midpoint_to(a)
<Geokit::LatLng:0x00000002933f80 @lat=12.958885908536992, @lng=80.250538596>

ここで何が起こっているのか説明してもらえますか。a と bの間の中間点は、b と a の間と同じである必要がありますかそれとも緯度と経度が異なりますか

4

2 に答える 2

4

あなたの例では、2つの点は同じで、非常に近似しています。違いを特定する価値があります。つまり、同じオブジェクトが得られない理由は次のとおりです。

a.midpoint_to(b) 
<Geokit::LatLng:0x0000000292f368 @lat=12.95888590853612, @lng=80.25053859693796> 

b.midpoint_to(a)
<Geokit::LatLng:0x00000002933f80 @lat=12.958885908536992, @lng=80.250538596>
  • 最初の数字0x0000000292f3680x00000002933f80はオブジェクト ID です (既に知っているかどうかは不明です)。これらは、新しいオブジェクト インスタンスでは常に異なり、距離や位置に関連するものは何も測定しません。この数が表示されていない、または答えが同じ場合は同じであるクラスが他にもいくつかあります。

  • @latとの違いは@lng、浮動小数点精度の制限によるものです。中間点を取得する計算では、2 つの入力数値セットがまったく同じ方法で使用されないため、結果は同じではありません。実際、浮動小数点の非常に単純な計算でa + (b - c)も、 と同じではない場合があります(a + b) - c。計算された 2 つの中間点間の経度の差を見ると、それは9.379590437674779e-10度です。地球の表面では、これはおよそ 0.0001 メートル (0.1 ミリ) の距離ですが、入力ポイントはおよそ 14.7 キロメートル離れています。

geokit を使用して距離を測定すると、安心できる 0.0 が得られます。これを使用して、2 つの計算がまったく同じ点としてカウントされるほど十分に近いことを確認できます。

a = Geokit::LatLng.new(13.0627081,80.274658)
b = Geokit::LatLng.new(12.8550615,80.2264393)
m1 = a.midpoint_to(b)
m2 = b.midpoint_to(a)
if m1.distance_to( m2 ) > 0
  puts "Mid-points are separate"
else
  puts "Mid-points are the same location"
end

出力は次のとおりです。

Mid-points are the same location

より複雑な計算を行う場合は、0.0 よりもわずかに大きい数値を使用することをお勧めします。たとえば、1e-5 (最も近いセンチメートルまで) です。

于 2013-09-22T07:20:48.113 に答える