5

私はgeopyパッケージを使用していますが、これは素晴らしい仕事をしていますが、得られる結果のいくつかは矛盾しているか、比較的大きな変位を伴います.問題はベアリングの計算にあると思われます:

def gb(x,y,center_x,center_y):
dx=x-center_x
dy=y-center_y
if ((dy>=0)and((dx>0)or(dx<0))):
    return math.degrees(math.atan2(dy,dx))
elif (dy<=0)and((dx>0)or (dx<0)):
    return (math.degrees(math.atan2(dy,dx))+360)
else:
    return (math.degrees(math.atan2(dy,dx))+360)%360

方位を計算する必要があります。st center_x と center_y はピボットです。その後、geopy を使用して GPS 座標をリバース エンジニアリングします。

latlon = VincentyDistance(miles=dist).destination(Point(lat1, lon1), bearing)

誰かが私が間違っているかもしれないことを指摘できますか?

4

2 に答える 2

9

誰かが私が間違っているかもしれないことを指摘できますか?

  1. 「一貫性がない、または比較的大きな変位が伴う」結果や期待される結果の例を示していません。したがって、回答者は当て推量に頼らなければなりません。

  2. 入力(x、yなど)がどの単位で測定されているか、および計算でどのようにdist使用されているかはわかりません。destination私は (bearing2以下の計算で) 正の x がマイル単位で東向きであり、正の y がマイル単位で北向きであると想定しています。質問を編集して(1)と(2)を修正すると、非常に役立ちます。

  3. 人々がそれを読みたくなるのをあまり助長しないコーディングスタイル...これを見てください.

  4. 学校の三角法では、角度は X 軸 (東) から反時計回りに測定されます。ナビゲーションでは、方位は Y 軸 (北) から時計回りに測定されます。以下のコードを参照してください。使用中の方位の例については、このリンクをたどり、「始点からの距離と方位を指定した目的地」セクションまでスクロールします。例が約 96 度または 97 度の方位について話していることに注意してから、「地図を表示」をクリックしてください。 」で、機首方位が東より少し南 (東が 90 度) になっていることがわかります。

コード:

from math import degrees, atan2
    def gb(x, y, center_x, center_y):
        angle = degrees(atan2(y - center_y, x - center_x))
        bearing1 = (angle + 360) % 360
        bearing2 = (90 - angle) % 360
        print "gb: x=%2d y=%2d angle=%6.1f bearing1=%5.1f bearing2=%5.1f" % (x, y, angle, bearing1, bearing2)

    for pt in ((0, 1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1, 0),(-1,1)):
        gb(pt[0], pt[1], 0, 0)

出力:

gb: x= 0 y= 1 angle=  90.0 bearing1= 90.0 bearing2=  0.0
gb: x= 1 y= 1 angle=  45.0 bearing1= 45.0 bearing2= 45.0
gb: x= 1 y= 0 angle=   0.0 bearing1=  0.0 bearing2= 90.0
gb: x= 1 y=-1 angle= -45.0 bearing1=315.0 bearing2=135.0
gb: x= 0 y=-1 angle= -90.0 bearing1=270.0 bearing2=180.0
gb: x=-1 y=-1 angle=-135.0 bearing1=225.0 bearing2=225.0
gb: x=-1 y= 0 angle= 180.0 bearing1=180.0 bearing2=270.0
gb: x=-1 y= 1 angle= 135.0 bearing1=135.0 bearing2=315.0
于 2011-02-20T21:20:12.003 に答える
2

コードで何をしようとしているのかよくわかりませんが、クリーンアップする必要がある奇妙な点がいくつかあります。

  1. 条件付き before でdy<=0for をテストした後にforをテストします。と の場合、dy>=0コードは何をすべきか。 dy==0dx==0
  2. あなたのテスト((dy>=0)and((dx>0)or(dx<0)))は (dy>=0 and dx!=0) と同等ですが、これは意図したものですか?
  3. 基本的に、すべての条件で同じことを行っています。return math.degrees(math.atan2(dy,dx))+360)%360すべてのシナリオで機能できませんでしたか? その場合、とにかく if ステートメントを使用する必要はありません。
于 2011-02-20T17:33:43.520 に答える