gün doğumu ve gün batımı


12

Biraz romantikim, bulunduğumuz yerde gün doğumu ve gün batımlarını görmek için eşimi çıkarmayı seviyorum. Bu egzersizin uğruna, diyelim ki, hangi tarih, enlem ve boylam için olursa olsun, gün batımının veya güneşin doğuş zamanını söyleyebilecek bir kodum yok.

Göreviniz kodlayıcılar, ondalık enlem ve boylam (N ve W derece olarak alınır, bu nedenle S ve E derece negatif olarak alınır) ve YYYY-AA-GG biçiminde bir tarih alan mümkün olan en küçük kodu oluşturmaktır. 1 Ocak 2000'den itibaren) ve gündoğumu ve günbatımı için 24 saat biçiminde iki kez tükürecektir.

Örneğin, bugün Sidney, Avustralya'da

riseset -33.87 -151.2 2013-12-27

05:45 20:09

Bonuslar: Yüksekliği hesaba katabiliyorsanız -100, gün ışığından yararlanma tasarrufunu çarparsanız -100

Kod, girişte belirtilen ilgili zaman diliminde, istemcinin kendi saat dilimindeki enlem ve boylam VEYA OR değerlerine göre tükürmelidir ZORUNLU.


3
Bekle, ne, bir [enlem x boylam] => [saat dilimi] araması mı yapmalıyız? Bunun için bir veri dosyası alıyor muyuz? Yoksa erişebileceğimiz bir sunucu mu? Yoksa bu tür şeylerin içinde bulunduğu bir dil var mı? Hangisini söyleyebilir misin? Yoksa saat dilimi sınırlarını ezberlememiz mi gerekiyor? Hangi hassasiyete? Bu verileri nereden alıyoruz? Bu verilerin kod uzunluğunun çoğunu alacağını biliyor musunuz? Tam olarak saat dilimi sınırına giren koordinatlar ne olacak? Peki, coğrafi kutuplar? Ayrıca, bir gece / gündüz boyunca giriş bir polar bölge olduğunda hangi davranışa izin verilir? Aralık dışı koordinatlar ne olacak?
John Dvorak

Ben ediyorum aşk idealize küre üzerinde bir noktaya dayanan ufuk hesaplamak için meydan ama nefret bulmak için ilişkili meydan, el kompres, programlama decopmress ardından, bir saat dilimi harita Lookup'ta bakın. Tabii ki, idealize edilmiş zaman dilimleri kullanamazsak (ofset, güneş öğlen sırasında en yüksek olacak şekilde seçilir, o zaman en yakın saate yuvarlanır).
John Dvorak

1
@JanDvorak Kullanabileceğiniz her şeyi kullanın, eğer kullandığınız dil müşterinin saat diliminden yararlanabilirse, bunu yapın ...
WallyWest

1
Bir kutup / gündüz olduğunda kutup bölgeleri için istenen davranış nedir?
John Dvorak

1
İşte aynısını yapan bir araç: weatherimages.org/latlonsun.html
Eisa Adil

Yanıtlar:


4

Bunu yazmak için biraz zaman geçirdim:

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

from math import *


class RiseSet(object):

    __ZENITH = {'official': 90.833,
                'civil': '96',
                'nautical': '102',
                'astronomical': '108'}

    def __init__(self, day, month, year, latitude, longitude, daylight=False,
                 elevation=840, zenith='official'):
        ''' elevation is set to 840 (m) because that is the mean height of land above the sea level '''

        if abs(latitude) > 63.572375290155:
            raise ValueError('Invalid latitude: {0}.'.format(latitude))

        if zenith not in self.__ZENITH:
            raise ValueError('Invalid zenith value, must be one of {0}.'.format
                            (self.__ZENITH.keys()))

        self.day = day
        self.month = month
        self.year = year
        self.latitude = latitude
        self.longitude = longitude
        self.daylight = daylight
        self.elevation = elevation
        self.zenith = zenith

    def getZenith(self):
        return cos(radians(self.__ZENITH[self.zenith]))

    def dayOfTheYear(self):
        n0 = floor(275*self.month/9)
        n1 = floor((self.month + 9) / 12)
        n2 = (1 + floor((self.year - 4*floor(self.year/4) + 2) / 3))
        return n0 - (n1*n2) + self.day - 30

    def approxTime(self):
        sunrise = self.dayOfTheYear() + ((6 - (self.longitude/15.0)) / 24)
        sunset = self.dayOfTheYear() + ((18 - (self.longitude/15.0)) / 24)
        return (sunrise, sunset)

    def sunMeanAnomaly(self):
        sunrise = (0.9856 * self.approxTime()[0]) - 3.289
        sunset = (0.9856 * self.approxTime()[1]) - 3.289
        return (sunrise, sunset)

    def sunTrueLongitude(self):
        sma = self.sunMeanAnomaly()
        sunrise = sma[0] + (1.916*sin(radians(sma[0]))) + \
                  (0.020*sin(radians(2*sma[0]))) + 282.634

        if sunrise < 0:
            sunrise += 360
        if sunrise > 360:
            sunrise -= 360

        sunset = sma[1] + (1.916*sin(radians(sma[1]))) + \
                 (0.020*sin(radians(2*sma[1]))) + 282.634

        if sunset <= 0:
            sunset += 360
        if sunset > 360:
            sunset -= 360

        return (sunrise, sunset)

    def sunRightAscension(self):
        stl = self.sunTrueLongitude()
        sunrise = atan(radians(0.91764*tan(radians(stl[0]))))

        if sunrise <= 0:
            sunrise += 360
        if sunrise > 360:
            sunrise -= 360

        sunset = atan(radians(0.91764*tan(radians(stl[1]))))

        if sunset <= 0:
            sunset += 360
        if sunset > 360:
            sunset -= 360

        sunrise_stl_q = (floor(stl[0]/90)) * 90
        sunrise_ra_q = (floor(sunrise/90)) * 90
        sunrise = sunrise + (sunrise_stl_q - sunrise_ra_q)
        sunrise = sunrise/15.0

        sunset_stl_q = (floor(stl[1]/90)) * 90
        sunset_ra_q = (floor(sunset/90)) * 90
        sunset = sunrise + (sunset_stl_q - sunset_ra_q)
        sunset /= 15.0

        return (sunrise, sunset)

    def sunDeclination(self):
        sunrise_sin_dec = 0.39782 * sin(radians(self.sunTrueLongitude()[0]))
        sunrise_cos_dec = cos(radians(asin(radians(sunrise_sin_dec))))

        sunset_sin_dec = 0.39782 * sin(radians(self.sunTrueLongitude()[1]))
        sunset_cos_dec = cos(radians(asin(radians(sunrise_sin_dec))))

        return (sunrise_sin_dec, sunrise_cos_dec,
                sunset_sin_dec, sunset_cos_dec)

    def sunHourAngle(self):
        sd = self.sunDeclination()
        sunrise_cos_h = (cos(radians(self.getZenith())) - (sd[0]* \
                         sin(radians(self.latitude))) / (sd[1]* \
                         cos(radians(self.latitude))))
        if sunrise_cos_h > 1:
            raise Exception('The sun never rises on this location.')

        sunset_cos_h = (cos(radians(self.getZenith())) - (sd[2]* \
                         sin(radians(self.latitude))) / (sd[3]* \
                         cos(radians(self.latitude))))
        if sunset_cos_h < -1:
            raise Exception('The sun never sets on this location.')

        sunrise = 360 - acos(radians(sunrise_cos_h))
        sunrise /= 15.0

        sunset = acos(radians(sunrise_cos_h))
        sunset /= 15.0

        return (sunrise, sunset)

    def localMeanTime(self):
        sunrise = self.sunHourAngle()[0] + self.sunRightAscension()[0] - \
                 (0.06571*self.approxTime()[0]) - 6.622
        sunset = self.sunHourAngle()[1] + self.sunRightAscension()[1] - \
                 (0.06571*self.approxTime()[1]) - 6.622
        return (sunrise, sunset)

    def convertToUTC(self):
        sunrise = self.localMeanTime()[0] - (self.longitude/15.0)

        if sunrise <= 0:
            sunrise += 24
        if sunrise > 24:
            sunrise -= 24

        sunset = self.localMeanTime()[1] - (self.longitude/15.0)

        if sunset <= 0:
            sunset += 24
        if sunset > 24:
            sunset -= 24

        return (sunrise, sunset)

    def __str__(self):
        return None

Şimdi henüz işlevsel değil (bazı hesaplamaları berbat ettim) - Daha sonra geri döneceğim (hala cesaretim olacaksa) tamamlayın / yorumlayın .

Ayrıca, konuyu araştırırken bulduğum bazı ilginç kaynaklar:


3
I sadece yorum gördüm # It's late, I'm tired, and OP is a prick for asking me to do this. ... Beni dahil diğer kodlayıcılar ... ile olumlu gözle kodunda böyle değil koymak yorumlarınızı oturmaz Lütfen ... bu görevi yapmak zorunluluğu yoktu. Kırmızı sıcak bir şekilde gittiğinize ve sağladığınız diğer bağlantılara hayranım, ama lütfen böyle yorumları tekrar kullanmayın ...
WallyWest

@ Eliseod'Annunzio Özür dilerim.
Deneb

@ Eliseod'Annunzio Sizi rahatsız etmek istemedim. Ayrıca bana araştırma ve kodlama için kesinlikle harika bir fikir verdiğiniz için teşekkür etmek istiyorum. Şimdi bunu kendi kendine duran bir python modülüne dönüştürmek istiyorum (sys argümanlarıyla vb.). Daha önce düşündüğümden biraz daha karmaşık olduğu ortaya çıkıyor, ancak bunu çıkarmayı planlıyorum. Tekrar teşekkürler.
Deneb

@Alex, bu zorluğun bir yaşında olduğunu biliyor musunuz? Kazandığından eminim.
mbomb007

@ mbomb007: Fark etmedi.
Alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.