3

私は Azimuth の概念を完全に理解しようとしていますが、いくつかの矛盾に遭遇しています (または、私のエラーかもしれません)。

一致しない例をいくつか示します。これが実際にどのように機能するかを誰かが説明してくれることを願っています。

EPSG:900913、PostGIS、および独自の JavaScript 関数を使用して座標を表示します。

私の機能

/* Difference between the two longitudes */
var dLon = lon2 - lon1;
/* Y value */
var y = Math.sin(dLon) * Math.cos(lat2);
/* X value */
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
/* Calculates the azimuth between the two points and converts it to degrees */
var angle = Math.atan2(y, x) / Math.PI * 180;

/* Same Y, not on the equator */
Point A: (-81328.998084106, 7474929.8690234)
Point B: (4125765.0381464, 7474929.8690234)
Result in PostGIS: 90 degrees
Result in my JS function: 74.232 degrees

/* Same Y, on the equator */
Point A: (-81328.998084106, 0)
Point B: (4125765.0381464, 0)
Result in PostGIS: 90 degrees
Result in my JS function: 90 degrees

赤道では、水平線の方位角が 90 (または 270) であることを理解しています。赤道の少し北 (または南) に水平線を引くと、方位角は 90 度ではなくなると考えてください。しかし... PostGIS は、Y が同じ場合は常に 90 度であると教えてくれます。

さらに、この計算機は、Y != 0 (赤道上ではない) の場合、水平線の方位角が 90 度ではないことも示しています。

どのように正しいですか?

ありがとう

4

1 に答える 1

2

あなたの例では、平面、投影、メートル単位の EPSG:900913 を使用しました。これは、使用される式が atan2 になることを意味します。これは、式が次のように、緯​​度が同じ場合は常に 90 になります。

azimuth = atan2(y1-y2, x1-x2)

そして、2 番目の部分は常に 0 で、方位角は 90 になります。したがって、平面座標を使用すると、同じ緯度を持つ座標のペアの方位角は常に同じになります。これが、EPS を使用するときに Postgis が常に同じ答えを返す理由です。 :900913.

geography データ型に切り替えて測地座標を使用する場合、これは当てはまりません。

例えば:

select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(90, 10)::geography));

Postgis で 80.1318065 を提供し、リンクした電卓ページで 80.139 を提供します。

x/経度が近づくにつれて、指定された緯度の値が 90 に近づきます。例えば、

select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(1, 10)::geography));

現在、Postgis では 89.9131737、オンライン計算機では 89.333 が得られます (多少の相違があります)。

これはすべて、公式が曲率を考慮するようになったためで、緯度が等しい 2 つのベクトルの投影間の角度は、赤道を除いて 90 度ではなくなります。

回転楕円体バージョンのウィキペディアの方位角記事の方程式を見てください。これは、JavaScript でコーディングするのに十分簡単で、geography タイプを使用して Postgis に匹敵する答えを与えるはずです。

于 2014-08-27T15:56:12.860 に答える