gpt4 book ai didi

python - 根据横断面的给定距离和方位移动 xy 坐标

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:59 26 4
gpt4 key购买 nike

我有一艘船沿着横断面行驶,寻找动物。有人站在船顶,面朝前方,当看到动物时,记录离船的距离和船前部的方位。我有这些信息以及看到动物时船的 xy 坐标。 我需要根据这些信息得到动物本身的xy坐标。

我没有船的原装罗盘方位,这很棘手;但我所拥有的是船的下一个 GPS (xy) 坐标,我可以从中计算出起始角度。由此,应该可以添加或减去看到动物的方位以给出归一化角度,该角度可用于使用三角学找到动物的 xy 坐标。不幸的是,我的数学技能不太适合这份工作。

我有几百个点,所以我需要将其放入 Python 脚本中以遍历所有点。

总而言之,数据集有:

原始 X、原始 Y、结束(下一个)X、结束(下一个)Y、方位角、距离

编辑:抱歉,我很匆忙,没有很好地解释这一点。

我看到这个问题有 3 个阶段。

  1. 找到横断面的原始方位
  2. 找到点相对于样带的方位
  3. 根据这个归一化角度和起点 xy 与船的距离找到该点的新坐标

下面是我原来的 Python 代码,虽然用处不大 - 给出的数字是示例。

    distFromBoat = 100
bearing = 45


lengthOpposite = origX-nextX
lengthAdjacent = origY - nextY
virtX = origX #virtual X
virtY = origY-lengthOpposite #virtual Y
angle = math.degrees(math.asin(math.radians((lengthOpposite/transectLen))))
newangle = angle + bearing
newLenAdj = math.cos(newangle)*distFromBoat
newLenOpp = math.sqrt(math.pow(distFromBoat,2) + math.pow(newLenAdj,2) - 2*(distFromBoat*newLenAdj)*(math.cos(newangle)))
newX = virtX-newLenOpp
newY = origY-newLenAdj
print str(newX) +"---"+str(newY)

提前感谢您的帮助!

最佳答案

Matt 的函数有一个小问题,所以我使用 atan2 来为您提供船行进的角度。

编辑:这比我预期的要复杂。最后,您需要减去 90 并取倒数以从地理引用角转到三角角。

(还有一个内置了这个的 angles 库(可能还有其他地理库)。

现在这需要 origXorigY,找到三角角并将其转换为 heading,将方位添加到确定的角度对于横断面。然后它会触发距离,但使用转换回触发度数的角度 -(X-90)。它有点扭曲,因为我们习惯于将 0 度视为北/上,但在 trig 中它是“向右”,并且 trig 逆时针与顺时针导航。

import math

origX = 0.0
origY = 0.0

nextX = 0.0
nextY = -1.0

distance = 100.0
bearing = 45


def angle(origX,origY,nextX,nextY):
opp = float(nextY - origY)
adj = float(nextX - origX)
return(math.degrees(math.atan2(adj,opp)))
# atan2 seems to even work correctly (return zero) when origin equals next

transectAngle = angle(origX,origY,nextX,nextY) # assuming the function has been defined
print "bearing plus trans", transectAngle + bearing
trigAngle = -(transectAngle + bearing -90)
print "trig equiv angle", trigAngle
newX = origX + distance * math.cos(math.radians(trigAngle))
newY = origY + distance * math.sin(math.radians(trigAngle))

print "position",newX,newY

输出:

-70.7106781187 -70.7106781187

这是一个打印一堆测试用例的函数(使用全局变量,所以应该折叠到上面的代码中)

def testcase():
bearinglist = [-45,45,135,-135]
dist = 10
for bearing in bearinglist:
print "----transect assuming relative bearing of {}------".format(bearing)
print "{:>6} {:>6} {:>6} {:>6} {:>6} {:>6} {:>6} {:>6}".format("x","y","tran","head","trigT","trigH","newX","newY")
for x in [0,.5,-.5]:
for y in [0,.5,1,-.5]:
# print "A:", x,y,angle(origX,origY,x,y)
tA = newangle(origX,origY,x,y)
trigA = -(tA-90)
heading = tA + bearing
trigHead = -(heading-90)
Xnew = distance * math.cos(math.radians(trigHead))
Ynew = distance * math.sin(math.radians(trigHead))
print "{:>6.1f} {:>6.1f} {:>6.1f} {:>6.1f} {:>6.1f} {:>6.1f} {:>6.1f} {:>6.1f}".format(x,y,tA,heading,trigA,trigHead,Xnew,Ynew)

enter image description here adding paths

关于python - 根据横断面的给定距离和方位移动 xy 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22668502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com