更新:与 Dave 聊天后,我相信以下方法可以将太阳位置准确投影到地图上。
这是投影的外观的快速草图。它(应该是)3D。我们希望将太阳向下投影到 2D 表面上,其中 x 和 y 是观察者的偏移量,z 是到投影太阳的距离:
已知:
- 地球到太阳的距离,S = 149,597,870,700 m
- phi(太阳方位角)
- θ(太阳高度)
我们真正想要的是 z(距离)和 phi(方位角)。phi 是已知的,所以我们需要 z。请记住,S 是巨大的,所以我们应该将它缩小到一个较小的数字,以便我们的坐标可以在地图上看到。只要我们保持新的 S 不变,这无关紧要。现在,要找到 z:
sin(theta) = z / S, therefore z = S * sin(theta)
一旦我们有了距离 z 和方位 phi,我们就可以使用可移动式的这些方程来计算 lat/lng 坐标:
var lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) +
Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) );
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1),
Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2));
在哪里d = distance traveled = our z
和R = earth's radius = 6371000 (meters)
那很简单!现在只需遍历所有太阳位置并将它们绘制在地图上。
以下是一些使用 S=1000 的快速结果:
Azimuth altitude z
110 5 87
150 20 342
180 70 939
210 20 342
请注意,如果您正在处理非常大的距离,由于对地球建模的困难,这将不完全准确。