您好我正在使用ruby Geokit :: LatLng类存储纬度和经度并尝试找到几点之间的中点。我注意到这个宝石有问题,或者我可能误解了这些概念。
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 相同,或者它在纬度和经度上是否相同
答案 0 :(得分:4)
在你的例子中,两点是相同的,非常接近。值得确定的区别 - 即为什么你没有得到相同的对象:
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>
第一个数字0x0000000292f368
和0x00000002933f80
是对象标识(目前尚不清楚您是否已经知道)。它们在任何新的对象实例中总是不同的,并且不会测量与距离或位置相关的任何内容。还有一些其他类没有显示这个数字,或者当答案相等时它们是相同的。
@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(到最近的厘米)。
答案 1 :(得分:1)
a到b之间的中点,反之亦然。
中点可能不位于纬度/经度之间的中间位置;
指出
纬度经度 22.57265 88.36389
b点
纬度经度 27.66483 -81.51575
a.midpoint_to(b)
=> #<Geokit::LatLng:0xb9219f44 @lat=79.06104152033897, @lng=16.672528167825877
此页面显示如何计算geographic midpoint
This post可能有助于理解公式