緯度と経度の値を3次元空間の点に変換する必要があります。これを約2時間試してみましたが、正しい結果が得られません。
Equirectangular座標は openflights.org から取得されます。 cosとsinのいくつかの組み合わせを試しましたが、結果は私たちの小さな最愛の地球のようには見えませんでした。
以下に、変換を適用した結果を示します Wikipedia が示唆しています。コンテキストから何を推測できると思います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に this ページが見つかりました。機能するコードは次のとおりです。
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
を切り替えましたが、動作しました。それが結果です:
AsTreyA状態、LLA to ECEF
がソリューションです。 を参照してくださいhttp://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html
あなたはウィキペディアが示唆することをしていません。もう一度よく読んでください。
彼らが言うには:
_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)
です(経度を使用しています)。
ここで前述したコードを再フォーマットしましたが、さらに重要なことに、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)
比較出力:カリフォルニア州ロサンゼルスのECEFを検索(34.0522、-118.40806、0標高)
私のコード:
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 ;です。ただし、他のモデルもあります。
個人的には、変換の健全性チェックに海軍大学院への this link を使用するのが好きです。