在Google地图上为给定的观察者位置投射太阳路径

时间:2013-03-30 16:38:50

标签: javascript google-maps math coordinates astronomy

我有以下详细信息列表

Latitude and Longitude,
Date/Time
Altitude and Azimuth

我尝试做的是计算我的计算中使用的相对纬度和经度,以便我可以使用Google Maps V3(JavaScript)绘制椭圆

这是可能的,还是应该将我的lat / lng转换为页面像素并按照这种方式进行(但这不是我想要完成任务的方式)

[编辑]

我试图根据单个观察者观察到的高度和方位角来收集纬度和经度坐标,因此我的地图上的一个点我希望在整个白天/时间内可视化太阳的路径。

1 个答案:

答案 0 :(得分:2)

更新:与Dave聊天后,我相信以下方法可以准确地将太阳位置投影到地图上。

以下是投影效果的快速草图。它(应该是)3D。我们希望将太阳投射到2D表面上,其中x和y是观察者的偏移量,z是投射太阳的距离:

sun projection diagram

已知:

  • 从地球到太阳的距离,S = 149,597,870,700米
  • phi(太阳方位角)
  • theta(太阳高度)

我们真正想要的是z(距离)和phi,轴承。 phi是已知的,所以我们需要z。请记住,S是巨大的,所以我们应该将其缩小到较小的数字,以便我们的坐标可以在地图上看到。只要我们保持新的S不变,这应该不重要。现在,找到z:

sin(theta) = z / S, therefore z = S * sin(theta)

一旦我们有距离z和轴承phi,我们可以使用movable-type中的这些方程来计算纬度/经度坐标:

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 zR = earth's radius = 6371000 (meters)

这很简单!现在只需遍历所有太阳位置并在地图上绘制它们。

以下是一些快速结果,使用S = 1000:

Azimuth    altitude    z
110        5           87
150        20          342
180        70          939
210        20          342

请注意,如果您处理非常大的距离,由于地球建模的困难,这将不完全准确。