22

緯度と経度の値を 3 次元空間のポイントに変換する必要があります。これを約2時間試しましたが、正しい結果が得られません。

正距円筒図法はopenflights.orgから取得されます。cossinのいくつかの組み合わせを試してみましたが、結果は私たちの愛する小さな地球のようには見えませんでした。


以下では、ウィキペディアが提案する変換を適用した結果を確認できます。文脈から推測できると思いますc4d.Vector

def llarToWorld(latit, longit, altid, rad):
    x = math.sin(longit) * math.cos(latit)
    z = math.sin(longit) * math.sin(latit)
    y = math.cos(longit)
    v = c4d.Vector(x, y, z)
    v = v * altid + v * rad
    return v

ここに画像の説明を入力

赤:X、緑:Y、青:Z

北アメリカと南アメリカ、特にメキシコ湾周辺の土地を特定することができます。しかし、それはややつぶれていて、間違った場所にあるように見えます..


少し回転して見えるので、緯度と経度を入れ替えてみました。しかし、その結果はやや厄介です。

def llarToWorld(latit, longit, altid, rad):
    temp = latit
    latit = longit
    longit = temp
    x = math.sin(longit) * math.cos(latit)
    z = math.sin(longit) * math.sin(latit)
    y = math.cos(longit)
    v = c4d.Vector(x, y, z)
    v = v * altid + v * rad
    return v

ここに画像の説明を入力


これは、値を変換せずに結果がどのように見えるかです。

def llarToWorld(latit, longit, altid, rad):
    return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)

ここに画像の説明を入力


質問: 経度と緯度を正しく変換するにはどうすればよいですか?


解決

TreyA のおかげで、mathworks.com でこのページを見つけました。その作業を行うコードは次のとおりです。

def llarToWorld(lat, lon, alt, rad):
    # see: http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html
    f  = 0                              # flattening
    ls = atan((1 - f)**2 * tan(lat))    # lambda

    x = rad * cos(ls) * cos(lon) + alt * cos(lat) * cos(lon)
    y = rad * cos(ls) * sin(lon) + alt * cos(lat) * sin(lon)
    z = rad * sin(ls) + alt * sin(lat)

    return c4d.Vector(x, y, z)

実は切り替えyてみたらz地球が自転していたので動きました!それが結果です:

ここに画像の説明を入力

4

3 に答える 3

15

ここで以前に言及されたコードを再フォーマットしましたが、さらに重要なことに、Niklas Rが提供するリンクに記載されている方程式の一部が省略されています

def LLHtoECEF(lat, lon, alt):
    # see http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html

    rad = np.float64(6378137.0)        # Radius of the Earth (in meters)
    f = np.float64(1.0/298.257223563)  # Flattening factor WGS84 Model
    cosLat = np.cos(lat)
    sinLat = np.sin(lat)
    FF     = (1.0-f)**2
    C      = 1/np.sqrt(cosLat**2 + FF * sinLat**2)
    S      = C * FF

    x = (rad * C + alt)*cosLat * np.cos(lon)
    y = (rad * C + alt)*cosLat * np.sin(lon)
    z = (rad * S + alt)*sinLat

    return (x, y, z)

比較出力: カリフォルニア州ロサンゼルス (34.0522、-118.40806、0 標高) の ECEF を見つける
私のコード:
X = -2516715.36114 メートルまたは-2516.715 km
Y = -4653003.08089 メートルまたは-4653.003 km
Z = 3551245.35929 メートルまたは3551.245 km

コード:
X = -2514072.72181 メートルまたは-2514.072 km
Y = -4648117.26458 メートルまたは-4648.117 km
Z = 3571424.90261 メートルまたは3571.424 km

地球の回転環境では、関数は表示用の正しい地理的領域を生成しますが、適切な ECEF 相当座標は提供しません。ご覧のように、一部のパラメーターは20 KMも異なりますが、これはかなり大きな誤差です。

平坦化係数はf、変換に想定するモデルによって異なります。典型的なモデルはWGS 84です。ただし、他のモデルがあります。

個人的には、海軍大学院学校へのこのリンクを使用して、コンバージョンの健全性チェックを行うのが好きです。

于 2013-12-03T19:34:26.423 に答える
14

あなたはウィキペディアが示唆していることをしていません。もう一度よく読んでください。

彼らが言うには:

x = r cos(phi) sin(theta)
y = r sin(phi) sin(theta)
z = r cos(theta)

その後:

theta == latitude
phi == longitude

そして、あなたの場合、r =半径+高度

したがって、次を使用する必要があります:

r = radius + altitude
x = r cos(long) sin(lat)
y = r sin(long) sin(lat)
z = r cos(lat)

最後のエントリはcos(lat)(経度を使用しています) であることに注意してください。

于 2012-05-06T23:48:34.200 に答える
4

TreyAが述べているように、これLLA to ECEFが解決策です。http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.htmlを参照してください。

于 2012-05-28T17:13:48.553 に答える