1

球体に 3 つの座標 (緯度、経度) があります。球全体を coord1 から coord2 に回転すると、coord3 はどこに配置されるでしょうか?

大円 (http://www.koders.com/python/fid0A930D7924AE856342437CA1F5A9A3EC0CAEACE2.aspx?s=coastline) を使用して Python でこれを試してみましたが、新しく計算されたポイントがすべて赤道でグループ化されるため、奇妙な結果が生じます。それは、私が想定している方位計算と関係があるに違いありませんか?

これを正しく計算する方法を知っている人はいますか?

前もって感謝します!

編集

以下を見つけました: http://www.uwgb.edu/dutchs/mathalgo/sphere0.htm

デカルト座標 (および 0,0,0) の 2 点から回転軸と回転角度を計算する必要があると思いますか? これは非常に単純で、平面の定義と法線の決定に関係していると思いますか? 誰かが必要な方程式をどこで見つけることができるか知っていますか?

編集2

Coord1 と Coord2 は大円を作ります。球面上の大円の法線軸の位置を見つける簡単な方法はありますか?

編集3

私はそれを解決できたようです ;) http://articles.adsabs.harvard.edu//full/1953Metic...1...39L/0000039.000.htmlでうまくいきました。

4

2 に答える 2

0

Visual Pythonを使用して、私は今それを解決したと思います:

# Rotation first described for geo purposes: http://www.uwgb.edu/dutchs/mathalgo/sphere0.htm
# http://stackoverflow.com/questions/6802577/python-rotation-of-3d-vector
# http://vpython.org/
from visual import *
from math import *
import sys

def ll2cart(lon,lat):
    # http://rbrundritt.wordpress.com/2008/10/14/conversion-between-spherical-and-cartesian-coordinates-systems/
    x = cos(lat) * cos(lon)
    y = cos(lat) * sin(lon)
    z = sin(lat)
    return x,y,z

def cart2ll(x,y,z):
    # http://rbrundritt.wordpress.com/2008/10/14/conversion-between-spherical-and-cartesian-coordinates-systems/
    r = sqrt((x**2) + (y**2) + (z**2))
    lat = asin(z/r)
    lon = atan2(y, x)
    return lon, lat

def distance(lon1, lat1, lon2, lat2):
    # http://code.activestate.com/recipes/576779-calculating-distance-between-two-geographic-points/
    # http://en.wikipedia.org/wiki/Haversine_formula
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    q = sin(dlat/2)**2 + (cos(lat1) * cos(lat2) * (sin(dlon/2)**2))
    return 2 * atan2(sqrt(q), sqrt(1-q))

if len(sys.argv) == 1:
    sys.exit()
else:
    csv = sys.argv[1]

    # Points A and B defining the rotation:
    LonA = radians(float(sys.argv[2]))
    LatA = radians(float(sys.argv[3]))
    LonB = radians(float(sys.argv[4]))
    LatB = radians(float(sys.argv[5]))

# A and B are both vectors
# The crossproduct AxB is the rotation pole vector P:
Ax, Ay, Az = ll2cart(LonA, LatA)
Bx, By, Bz = ll2cart(LonB, LatB)
A = vector(Ax,Ay,Az)
B = vector(Bx,By,Bz)
P = cross(A,B)
Px,Py,Pz = P
LonP, LatP = cart2ll(Px,Py,Pz)

# The Rotation Angle in radians:
# http://code.activestate.com/recipes/576779-calculating-distance-between-two-geographic-points/
# http://en.wikipedia.org/wiki/Haversine_formula
RotAngle = distance(LonA,LatA,LonB,LatB)

f = open(csv,"r")
o = open(csv[:-4] + "_translated.csv","w")
o.write(f.readline())
for line in f:
    (lon, lat) = line.strip().split(",")

    # Point C which will be translated:
    LonC = radians(float(lon))
    LatC = radians(float(lat))

    # Point C in Cartesian coordinates:
    Cx,Cy,Cz = ll2cart(LonC,LatC)
    C = vector(Cx,Cy,Cz)

    # C rotated to D:
    D = rotate(C,RotAngle,P)
    Dx,Dy,Dz = D
    LonD,LatD = cart2ll(Dx,Dy,Dz)

    o.write(str(degrees(LonD)) + "," + str(degrees(LatD)) + "\n")
于 2013-01-25T11:54:33.613 に答える
0

正確な式はわかりません。単純な行列の乗算になると思いますが、式なしで計算する方法は次のとおりです。

  1. 回転の極がそれぞれ 90,0 と -90,0 になるように座標を変換し、coord1 から coord2 への回転に沿った線が「赤道」上になるようにします (これは単にデルタ緯度、デルタ経度である必要があります)。

  2. 次に、回転は経度の変化であり、同じデルタロングを任意のcoord3に適用してから、元の座標に戻すだけです(負のデルタ緯度と負のデルタロングを介して)

1 と 2 は、マトリックスが行うこととほぼ同じです。各ステップのマトリックスを計算できる場合は、それらを乗算して最終的なマトリックスを取得できます。

于 2012-03-28T14:52:16.437 に答える