LAWU

主页:http://astroman.lamost.org

恒星时软件

动机是这样的,很早就想写个恒星时软件,方便不联网时使用。
直到2011年跟老板在兴隆举办暑期学校时,发现有一款现成的python写的恒星时软件,网址:http://www.dur.ac.uk/john.lucey/users/lst.html

后来有人询问一些上山观测事项时才发现由于重装系统源代码丢失,并且该软件网上已经删除下载链接,于是又萌生了自己写的想法。

趁着最近毕业论文和学术paper都在审核中,不算太忙,抽俩下午空随便写了个,第一版的UI做地很粗糙,并且暂时只提供兴隆当地恒星时,以后会增加各地天文台,还会支持手动输入

任意经度。至于UI嘛,我是个土人,没有老罗的那种审美,只好按照自己喜好胡乱涉及了。有好的建议可以直接联系我哦。

效果如图:右图是第一版(还很土吧?轻拍哈);以下三幅图分别显示了国内三个光学观测站(兴隆、盱眙和丽江)的时间信息;代码等天气信息补充上去后就释放,放心,终身免费!当然,如果您下载了觉得有用,可以考虑小额赞助(见下面赞助链接)

,多少不限,哈哈

 

支付宝赞助

贴出最终效果图(左上图),代码如下。关于程序有几点说明:将天气信息和恒星时写进了一个函数内(装叉点说就是觉得代码写的越少且实现的功能越多越牛逼,说白了就是懒了),这就意味着如果没有联网或者天气网站挂掉再或是网络龟速,时间信息也将不会输出。如出现这种情况可自行将天气信息的代码注释掉,因为加入天气本来就是个鸡肋的东东,所以偶也木有很认真的去解决,欢迎有兴趣的人去自行实现。给你点提示,将天气信息的部分单独写入一个函数,另外将天气刷新的时间改的长一点,如每三个小时更新一次天气。

Mac版本:请点击链接自行下载,http://pan.baidu.com/s/1vNqbq

代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Blog: http://astroman.lamost.org/dbs 
# By LaoWu (chjwu@bao.ac.cn)

import os
import wx
import time
import urllib2, json

#   --- Calculate Julian day ---  #
def TJD():
    t = time.gmtime()
    Y = t[0]
    M = t[1]
    D = t[2]
    h = t[3]
    m = t[4]
    s = t[5]
    if M <=2.:
        Y = Y-1
        M = M + 12
    JD = int(365.25*Y)+int(Y/400.)-int(Y/100.)+int(30.59*(M-2))+D+1721088.5+
            (h/24.)+(m/1440.)+(s/86400.)
    return JD-2440000.5

#   --- Main ---    #
class MyClock(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, 
                size=(535,300))
        obsList = ['XingLong', 'XuYi', 'LiJiang']
        self.time_diff = {
                'XingLong' : 117.575, 
                'XuYi' : 118.543, 
                'LiJiang' : 100.224
                }

        self.city_diff = {
                'XingLong': '101090404',
                'XuYi': '101190903',
                'LiJiang': '101291401',
                }

        self.timer = wx.Timer(self, 1)
        self.timer1 = wx.Timer(self, 2)

        self.diff = 117.575       
        self.city = '101090404'

        wx.StaticLine(self, -1, (120, 70), (300, 1))
        wx.StaticLine(self, -1, (120, 180), (300, 1))

        self.stim = wx.StaticText(self, -1, 'Sidereal Time of Observatory: ', (132, 40))
        self.stim.SetForegroundColour('Blue')
        self.weather = wx.StaticText(self, -1, 'Weather of Observatory: ', (155, 150))
        self.weather.SetForegroundColour('Blue')
        self.weather1 = wx.StaticText(self, 3, pos=(120, 210))
        self.weather2 = wx.StaticText(self, 3, pos=(300, 210))

        self.time_zones = wx.ComboBox(self, 11, pos=(80, 87), choices=obsList)
        self.time_zones.SetSelection(0)

        self.time = wx.StaticText(self, -2, pos=(350, 90))
        self.time.SetForegroundColour('Green')

        self.time1 = self.CreateStatusBar(4)

        font1 = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0)
        font2 = wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0)

        self.time.SetFont(font2)
        self.weather1.SetFont(font2)
        self.weather2.SetFont(font2)
        self.time1.SetFont(font1)
        self.stim.SetFont(font1)
        self.weather.SetFont(font1)
#   --- Binding Event ---   #
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.Bind(wx.EVT_TIMER, self.LocTimer, self.timer1)
        self.Bind(wx.EVT_COMBOBOX, self.OnSelect, id=11)
        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.timer.Start(1000)
        self.timer1.Start(1000)

        self.Center()
        self.Show(True)

    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen('#4c4c4c',1,wx.SHORT_DASH))
        dc.SetBrush(wx.Brush('#4c4c4c'))
        dc.DrawRectangle(345,85,110,33)

    def OnClose(self, event):
        self.Close()

    def OnSelect(self, event):
        item = event.GetSelection()
        time_zone = self.time_zones.GetString(item)
        self.diff = self.time_diff[time_zone]
        self.city = self.city_diff[time_zone]

    def OnTimer(self, event):
        theta_G = 24.*(0.671262+1.0027379094*TJD())
        theta = theta_G+self.diff/15.
        if theta >= 24:
            theta1 = theta-24*int(theta/24.)
        elif theta < 0.:
            theta1 = theta+24*(int(theta/24.)+1)
        h = int(theta1)
        m = int((theta1-h)*60)
        s = int(((theta1-h)*60-m)*60.) 
        self.time.SetLabel( str('%02d' % h)+':'+str('%02d' % m)+':'+str('%02d' % s))
#   --- info of weather ---   #
        url = "http://www.weather.com.cn/data/cityinfo/" +self.city+ ".html"
        response = urllib2.urlopen(url, timeout=10)
        city_dict = response.read()

        jsondata = json.JSONDecoder().decode(city_dict)

        temp_low = jsondata['weatherinfo']['temp1']
        temp_high = jsondata['weatherinfo']['temp2']
        weather = jsondata['weatherinfo']['weather']

        self.weather1.SetLabel(weather)
        self.weather2.SetLabel(temp_low + " ~ " + temp_high)

    def LocTimer(self, event):
        ct = time.gmtime()
        if int(ct[3])>=16:
            print_time1 = (ct[0], ct[1], ct[2], ct[3]-16, ct[4], ct[5], ct[6], ct[7], -1)
        else:
            print_time1 = (ct[0], ct[1], ct[2], ct[3]+8, ct[4], ct[5], ct[6], ct[7], -1)
        print_time = (ct[0], ct[1], ct[2], ct[3], ct[4], ct[5], ct[6], ct[7], -1)
        self.time1.SetStatusText('       UTC: ',0)
        self.time1.SetStatusText('      BeiJing: ',2)
        self.time1.SetStatusText(time.strftime("    %H:%M:%S", print_time),1)
        self.time1.SetStatusText(time.strftime("    %H:%M:%S", print_time1),3)

if __name__ == '__main__':
    app = wx.App()
    MyClock(None, -1, 'Sidereal Time -- LaoWu')
    app.MainLoop()

 

更新日志:

2013-04-24:考虑了恒星时比真实时间一天快四分钟的影响,但是由于调用函数问题,导致真实时间的显示一闪一闪;

2013-07-24:加入了观测站选择功能;

2013-07-25:重新设计了UI,加了点鸡肋功能——世界时和北京时间(从图中可以看出下一步的更新内容,增加天气信息);

2013-07-30:改正了时间零点报错bug,补充天气信息,目前在内测中,以实现天气自动更新;

2013-12-07:改正了差八小时的bug,自己用的版本没有这个问题,贴出来的code忘了扣除这一项,已改正。另外新增加了mac下的版本,由于linux和mac分辨率不一致,导致程序美观上有影响,已做调整,稍后会放出mac下的版本;

下次修正bug根据个人时间和心情而定;

 

 

备注:参考二里存在的问题就是不能在同一屏幕上显示两种不同的时间参考

声明:未经允许,请勿转载!

 

参考:

1、https://zh.wikipedia.org/wiki/%E6%81%92%E6%98%9F%E6%97%B6

2、http://www.7qb.cn/python/172.html

 

 

 

 

 

  1. 我都忘了恒星时到底指的是什么, 春分点的时角? 那么这个春分点是哪个意义上的春分点?

    • 恒星时可以理解为某一地方的子午圈(中天)与天球上春分点间的夹角,由于地球章动影响,恒星时也分平(真)恒星时,但是对于搞实测的人来说影响不大,一般就用平恒星时代替了,除非是那些天体测量以及搞授时的人才需要严格定义。春分点就是天球上定义的春分点。

  2. 也就是说章动根本就不影响观测? 我记得以前也算过类似的东西, 忘了是不是要加进去章动之类的玩意儿.

    • 对搞实测的人来说恒星时主要用在望远镜指向上(计算时角),从这个意义上讲章动对它的影响不会太大,所以我也是偷懒,用平恒星时代替了。

  3. Hi,你好啊.我是美国RPI的学生,我正在帮一个CS的同学推广类似计算恒星时的软件.可以的话我们能交流一下吗?
    我的邮箱是:zhaih@rpi.edu
    谢谢哈

porno izle