我有一艘船沿着样带移动,寻找动物。有人站在船的顶部,面朝前方,并在看到动物时记录着到船的距离以及从船前的方位。我有此信息以及在看到动物时船的xy坐标。我需要根据此信息获取动物本身的xy坐标。

我没有船上的原始罗盘方位,这很棘手。但是我所要做的是船的下一个GPS(xy)坐标,从中可以计算出起始角度。据此,应该有可能增加或减去观察动物时所产生的方位角,以提供归一化的角度,该角度可用于使用三角函数找到动物的xy坐标。不幸的是,我的数学技能还不能完全胜任这项工作。

我有几百个要点,因此我需要将其放入Python脚本中以了解所有要点。

总而言之,数据集具有:

原始X,原始Y,终点(下一个)X,终点(下一个)Y,方位角,距离

编辑:对不起,我很着急,没有很好地解释这一点。

我看到这个问题有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)


感谢您的任何帮助!

最佳答案

据我了解,这是您的问题:


您有2个点,分别是startnext
假设您已经面对着从Newstart的位置,则要查找第三个点start的坐标,该坐标应该与next保持一定距离并保持一定方位。


我的解决方案是这样的:


创建从startnext的归一化向量
通过给定方位旋转标准化向量
将标准化的旋转矢量乘以您的距离,然后将其添加到start
start视为向量,相加的结果是您的新观点


因为逆时针旋转(从当前点向左旋转)被认为是正值,所以您需要反转bearing,以使端口与负值关联,而右舷与正值关联。



import math
origX = 95485
origY = 729380

nextX = 95241
nextY = 729215

distance = 2000.0
bearing = 45

origVec = origX, origY
nextVec = nextX, nextY


#Euclidean distance between vectors (L2 norm)
dist = math.sqrt((nextVec[0] - origVec[0])**2 + (nextVec[1] - origVec[1])**2)

#Get a normalized difference vector
diffVec = (nextVec[0] - origVec[0])/dist, (nextVec[1] - origVec[1])/dist


#rotate our vector by bearing to get a vector from orig towards new point
#also, multiply by distance to get new value
#invert bearing, because +45 in math is counter-clockwise (left), not starboard
angle = math.radians(-bearing)

newVec = origVec[0]+(diffVec[0]*math.cos(angle) - diffVec[1]*math.sin(angle))*distance, \
         origVec[1]+(diffVec[0]*math.sin(angle) + diffVec[1]*math.cos(angle))*distance

print newVec


输出:


  (93521.29597031244,729759.2973553676)

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

10-13 09:38