TL; DR :返回的浮动值已被0.0001
关闭。我的函数实现是否会导致这种情况,或者仅仅是浮动值和计算机科学的奇迹,因为并非所有值都可以相应地表示?我不认为这是后者,所以我想知道是否有人可以发现问题,提出建议或让我尝试调试。
我写了两个函数来确定地球表面多边形的质心。
第一个函数计算两个顶点之间的方位。它会这样做两次,一次是UR到LL,一次是LR到UL。
第二个函数计算交叉点,给出两个先前计算的方位和每个计算的起点。 UR&它的轴承和LR&它的方位。
我的结果在经度上略有下降。例如,我向interest()
提供:
x1 = 120.6272
y1 = 36.9647
x2 = 120.6128
y2 = 36.9508
b1 = 265.02976409662136
b2 = 354.4744218802173
我的结果是[36.96359071593996, 120.61125138605212]
。纬度已更正,但经度应为120.61135138605212
。
方程式从here转录而来。有一个计算器,您可以在“两个路径的交点”部分下提供小数度和轴承,以查看预期结果。从DMS转换为DD时,此结果与ArcGIS中由同一多边形执行的质心计算的结果一致。我知道一个gisstackexchange,但是我没有关注这个问题的GIS部分。相反,我的问题在于:
问题:
使用我目前的实现,是存储功能[即cos = math.cos
],本地使用平方[即x ** 2
vs math.pow()
]或其他我不知道导致浮动的小数位有多少(0.0001对我来说很重要)?
承担功能
def bearing(x1, y1, x2, y2):
cos = math.cos
sin = math.sin
atan2 = math.atan2
rad = math.radians
deg = math.degrees
rx1 = rad(x1)
ry1 = rad(y1)
rx2 = rad(x2)
ry2 = rad(y2)
b = atan2(sin(rx2-rx1) * cos(ry2),
cos(ry1) * sin(ry2) - (sin(ry1) * cos(ry2) * cos(rx2-rx1)))
return ((deg(b) + 360) % 360) # normalize to -180...+180
相交功能
def intersect(x1, y1, b1, x2, y2, b2):
cos = math.cos
sin = math.sin
atan2 = math.atan2
asin = math.asin
acos = math.acos
sqrt = math.sqrt
rad = math.radians
deg = math.degrees
pi = math.pi
rx1 = rad(x1)
ry1 = rad(y1)
rx2 = rad(x2)
ry2 = rad(y2)
rb1 = rad(b1)
rb2 = rad(b2)
dx = rx2 - rx1
dy = ry2 - ry1
# Angular dist x1,y1 to x2,y2
a12 = 2 * asin(sqrt((sin(dy/2)**2) +
(cos(ry1) * cos(ry2) * (sin(dx/2)**2))))
# Initial bearing from x1,y1 to x2,y2
bi = acos((sin(ry2) - (sin(ry1) * cos(a12))) / (sin(a12) * cos(ry1)))
if math.isnan(bi):
bi = 0
# Final bearing
bf = acos((sin(ry1) - (sin(ry2) * cos(a12))) / (sin(a12) * cos(ry2)))
if (dx) > 0:
# Bearing from x1,y1 to x2,y2
b12 = bi
# Bearing from x2,y2 to x1,y1
b21 = (2 * pi) - bf
else:
b12 = (2 * pi) - bi
b21 = bf
# Angle x2,y2 -> x1,y1 -> x3,y3
n1 = rb1 - b12
# Angle x1,y1 -> x2,y2 -> x3,y3
n2 = b21 - rb2
n3 = acos(-(cos(n1) * cos(n2)) +
(sin(n1) * sin(n2) * cos(a12)))
# Angular dist x1,y1 to x3,y3
a13 = atan2(sin(a12) * sin(n1) * sin(n2),
cos(n2) + (cos(n1) * cos(n3)))
# Latitude
ry3 = asin((sin(ry1) * cos(a13)) +
(cos(ry1) * sin(a13) * cos(rb1)))
# Longitude Delta from x1 to x3
dx13 = atan2(sin(rb1) * sin(a13) * cos(ry1),
cos(a13) - (sin(ry1) * sin(ry3)))
# Longitude
rx3 = rx1 + dx13
return [deg(ry3), (deg(rx3) + 540) % 360 - 180]
答案 0 :(得分:0)
你在每个函数中做的最后一件事是以有损方式从弧度转换为度。 尝试使用相同的代码但不在每个返回行中进行舍入:例如
return deg(b)
而不是
return ((deg(b) + 360) % 360)