嗨,我使用ruby geokit::latlng类来存储纬度和经度,并试图找到几个点之间的中点。我注意到这个宝石有问题,否则我可能误解了这些概念。

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

当我计算“中点到”方法来计算这些点之间的中点时,我注意到它们给出了不同的结果
          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相同,或经纬度不同

最佳答案

在您的示例中,这两个点是相同的,非常接近。有必要找出不同之处,即为什么你得不到相同的物体:

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是对象标识(不清楚您是否已经知道)在任何新的对象实例中,它们总是不同的,并且不测量与距离或位置相关的任何东西。还有一些其他类没有显示这个数字,或者当答案相等时相同。
@lat@lng之间的差异是由于浮点精度的限制结果是不一样的,因为计算得到的中点不使用两组输入数字完全相等的方式事实上,即使使用非常简单的浮点数学,a + (b - c)也可能与(a + b) - c不同。当你观察两个计算的中点之间的经度差时,它是9.379590437674779e-10度在地球表面,这大约是0.0001米(0.1毫米)的距离,而你的输入点相距大约14.7公里。
如果您使用geokit测量距离,您将得到一个令人放心的0.0,您可能可以使用它来确认两个计算结果是否足够接近,足以计算出完全相同的点:
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(精确到厘米)。

09-25 17:58