2012-11-19 2 views
1

을 제공합니다. 첫 번째 것은 에펜 (ephem)을 사용하여 적경을 계산하고 Meeus의 Astronomical Algorithms에서 그리니치 평균 항성석을 얻는 수식을 사용합니다.이 시간은 경도와 함께 지역 평균 항성으로 변환 될 수 있습니다. pyephem 항성시 내가 처음 <code>ephem</code>을 사용하고 문제가 내가 시간 각도에서 태양 시간을 결정하기 위해 몇 가지 스크립트를 작성했습니다 oberver.sidereal_time의 출력()</p> <p>을 이해하는 데 문제가 예기치 않은 결과를

import sys 
from datetime import datetime, time, timedelta 
import ephem 

def hour_angle(dt, longit, latit, elev): 
    obs = ephem.Observer() 
    obs.date = dt.strftime('%Y/%m/%d %H:%M:%S') 
    obs.lon = longit 
    obs.lat = latit 
    obs.elevation = elev 
    sun = ephem.Sun() 
    sun.compute(obs) 
    # get right ascention 
    ra = ephem.degrees(sun.g_ra) 

    # get sidereal time at greenwich (AA ch12) 
    jd = ephem.julian_date(dt) 
    t = (jd - 2451545.0)/36525 
    theta = 280.46061837 + 360.98564736629 * (jd - 2451545) \ 
      + .000387933 * t**2 - t**3/38710000 

    # hour angle (AA ch13) 
    ha = (theta + longit - ra * 180/ephem.pi) % 360 
    return ha 

def main(): 
    if len(sys.argv) != 6: 
     print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]' 
     sys.exit() 
    else: 
     dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S') 
     longit = float(sys.argv[3]) 
     latit = float(sys.argv[4]) 
     elev = float(sys.argv[5]) 

    # get hour angle 
    ha = hour_angle(dt, longit, latit, elev) 

    # convert hour angle to timedelta from noon 
    days = ha/360 
    if days > 0.5: 
     days -= 0.5 
    td = timedelta(days=days) 

    # make solar time 
    solar_time = datetime.combine(dt.date(), time(12)) + td 
    print solar_time 

if __name__ == '__main__': 
    main() 

내가 일부 데이터를 연결하면 내가 기대하는 출력을 제공 : 내가 쓴

> python hour_angle_ephem.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0 
2012-11-16 12:40:54.697115 

두 번째 스크립트는 같은 방법으로 적경을 계산하지만, 로컬 명백한을 얻을 수 ephem의 sidereal_time()를 사용 항시적인 시간.

import sys 
from datetime import datetime, time, timedelta 
import math 
import ephem 

def solartime(observer, sun=ephem.Sun()): 
    sun.compute(observer) 
    # sidereal time == ra (right ascension) is the highest point (noon) 
    t = observer.sidereal_time() - sun.ra 
    return ephem.hours(t + ephem.hours('12:00')).norm # .norm for 0..24 

def main(): 
    if len(sys.argv) != 6: 
     print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]' 
     sys.exit() 
    else: 
     dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S') 
     longit = float(sys.argv[3]) 
     latit = float(sys.argv[4]) 
     elev = float(sys.argv[5]) 

    obs = ephem.Observer() 
    obs.date = dt.strftime('%Y/%m/%d %H:%M:%S') 
    obs.lon = longit 
    obs.lat = latit 
    obs.elevation = elev 
    solar_time = solartime(obs) 
    print solar_time 

if __name__ == '__main__': 
    main() 

예상치 못한 결과가 나옵니다.

python hour_angle_ephem2.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0 
9:47:50.83 

AFAIK 두 스크립트 사이의 유일한 차이는 로컬 평균 항성시의 첫번째 염기 시간 각도 고려 지구의 장동 소요 로컬 명백 항성시 두 번째 염기 시간 각도 반면 , 나는 그것이 매우 작은 요인이어야한다고 생각한다. 대신 약 3 시간의 차이가 있습니다. 아무도 내게 무슨 일이 일어 났는지 설명 할 수 있습니까?

+0

참고 : ([은'solartime() '함수는 내 대답에서입니다] http://stackoverflow.com/a/13425515/ 그 다음은 당신이 기대에 가까운 값을 반환 찾아야한다 4279). 그것을 사용하는 것이 좋습니다. 그러나 [라이센스는] (http://creativecommons.org/licenses/by-sa/3.0/) – jfs

+0

btw와 같은 적절한 참조를 제공해야합니다. 대답] (http://stackoverflow.com/a/13425515/4279) float를 사용하는 경우 명시 적으로 경도에 라디안을 사용해야한다고 말합니다. – jfs

+0

실망 스럽지만 라이센스를 읽지 못했습니다. 나는 네 대답을 upvoted. – mattexx

답변

1

PyEphem에 각도를 예상하는 원시 부동 소수점 숫자를 제공하면 먼저 부동 소수점 각도를 라디안으로 처리하므로 일관성을 유지하기 위해 각도를 라디안으로 먼저 변환 한 것으로 신뢰합니다. 하지만 두 번째 스크립트에서는 경도와 위도가도 단위로 표시되고 PyEphem에 라디안 단위로 제공됩니다. 당신처럼 Observer 모양의 .lon.lat 속성이 무엇인지 확인하기 위해 print 문 또는 두 가지를 추가하면 당신은 결과를 볼 수 있습니다

print observer.lon #--> -7005:32:16.0 
print observer.lat #--> 2166:01:57.2 

내가 무엇을 대신 단순히 원시 경도를 제공한다하고 싶은 것을 생각하고 위도 문자열을 PyEphem에 추가하여 두 번째 스크립트에서 float() 번의 호출을 argv[3]argv[4] 주변에서 제거하여 사람이 읽을 수있는 각도로 해석 할 수 있습니다.

$ python tmp11.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0 
12:40:55.59 
+0

offtop : [답변] (http://stackoverflow.com/a/13425515/4279)에 댓글을 달 수 있습니까? 'sun.ra'를'observer.sidereal_time()'과 함께 사용하는 것이 올바른지,'sun.a_ra'가되어야할까요? – jfs

+0

J.F.의 경우, 태양이 정확히 오버 헤드 인 것처럼 보일지, 분위기의 왜곡 뒤에 있는지 여부에 관심이 있는지 여부에 달려 있습니다. 실제로는 * 오버 헤드에 관심이 있습니다. 평범한'.ra'는 빛이 겪는 모든 왜곡이 설명되면 명백한 위치를 제공해야합니다. 애호가'.a_ra '는 실제 관찰에 영향을주는 효과를 적용하기 전에 위치를 제공합니다. –

+1

고맙습니다.제 의도는 간단한 해시계를 너무 모방합니다. 즉, 12:00는 가장 짧은 (또는 아니요) 그림자와 일치해야하므로'.ra'가 맞습니다. – jfs