Doel
De onderstaande berekening kan als Eigen Functie (met FileMaker Advanced) toegepast worden en eventueel als berekening(sveld) met resp. parameters en velden volgens deze functiebeschrijving:
Opmaak
SunTimes ( latitude ; longitude ; datum ; timezone ; sunrise ; sunset )
Parameters
latitude en longitude - Twee decimale getallen met de WGS84 kaartcoördinaten van de gewenste locatie, resp. breedtegraad en lengtegraad.
datum - De datum waarvan u de zontijden voor een locatie wilt weten.
timezone - Een getal waarmee de tijdzone in aantal uren verschil met GMT/UTC wordt aangegeven, zowel positief als negatief. In geval van zomertijd met één te verhogen.
sunrise en sunset - Twee logische waarden (True/False) waarmee u aangeeft of u de tijd van zonsopgang (sunrise) of zonsondergang (sunset) als resultaat wilt. Als beide parameters True zijn dan worden beide tijden gegeven in een waardenlijst.
Resulterend gegevenstype
tijd of tekst met twee tijden
Vereist
Eigen functie of berekeningsvelden met Atan2 (ook hieronder gegeven).
Voorbeeld
SunTimes ( 52,37307 ; 4,892647 ; Get ( HuidigeDatum ) ; 1 ; True ; False )
Geeft de tijd van zonsopgang voor de Dam in Amsterdam voor vandaag in tijdzone GMT+1 zonder zomertijd. Resultaat op 15 februari 2017: 07:55:44.
Bron
Dit is een voor gebruik in FileMaker aangepaste versie van een Excel-document met berekeningen die te vinden was op de website van US NOAA.
Code: Selecteer alles
SunTimes ( latitude ; longitude ; datum ; timezone ; sunrise ; sunset ) =
Let ( [
DatumGetal = GetAsNumber ( Datum ) - 693594 ;
TijdGetal = GetAsNumber ( Time ( 12 ; 0 ; 0 ) ) / 86400 ;
JulianDay = DatumGetal + 2415018,5 + TijdGetal - TimeZone / 24 ;
JulianCentury = ( JulianDay - 2451545 ) / 36525 ;
GeomMeanLongSun = Mod ( 280,46646 + JulianCentury * ( 36000,76983 + JulianCentury * ,0003032 ) ; 360 ) ;
GeomMeanAnomSun = 357,52911 + JulianCentury * ( 35999,05029 - ,0001537 * JulianCentury ) ;
EccentEarthOrbit = ,016708634 - JulianCentury * ( ,000042037 + ,0001537 * JulianCentury ) ;
SunEqOfCtr = Sin ( Radians ( GeomMeanAnomSun ) ) * ( 1,914602 - JulianCentury * ( ,004817 + ,000014 * JulianCentury ) ) + Sin ( Radians ( 2 * GeomMeanAnomSun ) ) * ( ,019993 - ,000101 * JulianCentury ) + Sin ( Radians ( 3 * GeomMeanAnomSun ) ) * ,000289 ;
SunTrueLongDeg = GeomMeanLongSun + SunEqOfCtr ;
SunTrueAnomDeg = GeomMeanAnomSun + SunEqOfCtr ;
SunRadVector = ( 1,000001018 * ( 1 - EccentEarthOrbit * EccentEarthOrbit ) ) / ( 1 + EccentEarthOrbit * Cos ( Radians ( SunTrueAnomDeg ) ) ) ;
SunAppLongDeg = SunTrueLongDeg - ,00569 - ,00478 * Sin ( Radians ( 125,04 - 1934,136 * JulianCentury ) ) ;
MeanObliqEclipticDeg = 23 + ( 26 + ( ( 21,448 - JulianCentury * ( 46,815 + JulianCentury * ( ,00059 - JulianCentury * ,001813 ) ) ) ) / 60 ) / 60 ;
ObliqCorrDeg = MeanObliqEclipticDeg + ,00256 * Cos ( Radians ( 125,04 - 1934,136 * JulianCentury ) ) ;
SunRtAscenDeg = Degrees ( Atan2 ( Cos ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ; Cos ( Radians ( SunAppLongDeg ) ) ) ) ;
SunRtAscenDeg = Degrees ( Atan2 ( Cos ( Radians ( SunAppLongDeg ) ) ; Cos ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ) ) ;
SunDeclinDeg = Degrees ( Asin ( Sin ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ) ) ;
VarY = Tan ( Radians ( ObliqCorrDeg / 2 ) ) * Tan ( Radians ( ObliqCorrDeg / 2 ) ) ;
EqOfTimeMinutes = 4 * Degrees ( VarY * Sin ( 2 * Radians ( GeomMeanLongSun ) )-2 * EccentEarthOrbit * Sin ( Radians ( GeomMeanAnomSun ) )+4 * EccentEarthOrbit * VarY * Sin ( Radians ( GeomMeanAnomSun ) ) * Cos ( 2 * Radians ( GeomMeanLongSun ) )-,5 * VarY * VarY * Sin ( 4 * Radians ( GeomMeanLongSun ) )-1,25 * EccentEarthOrbit * EccentEarthOrbit * Sin ( 2 * Radians ( GeomMeanAnomSun ) ) ) ;
HASunriseDeg = Degrees ( Acos ( Cos ( Radians ( 90,833 ) ) / ( Cos ( Radians ( Latitude ) ) * Cos ( Radians ( SunDeclinDeg ) ) ) - Tan ( Radians ( Latitude ) ) * Tan ( Radians ( SunDeclinDeg ) ) ) ) ;
SolarNoon = ( 720 - 4 * Longitude - EqOfTimeMinutes + TimeZone * 60 ) / 1440 ;
SolarRise = Floor ( ( SolarNoon * 1440 - HASunriseDeg * 4 ) / 1440 * 86400 ) ;
SolarSet = Floor ( ( SolarNoon * 1440 + HASunriseDeg * 4 ) / 1440 * 86400 ) ] ;
Case (
sunset and sunrise ; GetAsText ( GetAsTime ( SolarRise ) ) & "¶" & GetAsText ( GetAsTime ( SolarSet ) ) ;
sunrise ; GetAsTime ( SolarRise ) ;
sunset ; GetAsTime ( SolarSet ) ;
""
)
)
Atan2 ( y ; x ) =
Let ( [
a = If ( x > 0 ; Atan ( y / x ) ;
If ( x < 0 ; PI - Atan ( -y / x ) ;
PI / 2 * Sign ( y ) ) );
result = Mod ( a ; 2 * PI ) ];
result
)