Guten Tag
Hier haben Sie einen besseren Skripte:
cls
# ------------------------------------------------------------------------------
# Functions...
Function ConvertDegreeToRadian([double]$degree)
{
$degree * [Math]::PI / 180
}
$latituteInRadians = ConvertDegreeToRadian $latitude
Function CreateDateTime([DateTime]$dt, $timeInMinutes)
{
#[long]$hours = $timeInMinutes / 60
#[long]$minutes = $timeInMinutes - ($hours * 60)
#return new DateTime($dt.Year, $dt.Month, $dt.Day, $hours, $minutes, 00)
#Get-Date -Year $dt.Year -Month $dt.Month -Date $dt.Day -Hour $hours -Minute $minutes
#Write-host "TimeInMinutes: $timeInMinutes"
$dt.AddMinutes($timeInMinutes)
}
Function CalculateDifferenceSunAndLocalTime([int]$dayNumberOfDateTime)
{
[double]$ellipticalOrbitPart1 = 7.95204 * [Math]::Sin((0.01768 * $dayNumberOfDateTime) + 3.03217)
[double]$ellipticalOrbitPart2 = 9.98906 * [Math]::Sin((0.03383 * $dayNumberOfDateTime) + 3.46870)
[double]$differenceSunAndLocalTime = $ellipticalOrbitPart1 + $ellipticalOrbitPart2 + ($longitude - $longituteTimeZone) * 4
if ($useSummerTime) { $differenceSunAndLocalTime -= 60 }
$differenceSunAndLocalTime
}
Function CalculateDeclination([int]$numberOfDaysSinceFirstOfJanuary)
{
[Math]::Asin(-0.39795 * [Math]::Cos(2.0 * [Math]::PI * ($numberOfDaysSinceFirstOfJanuary + 10.0) / 365.0))
}
Function CalculateCosSunPosition([double]$declanationOfTheSun)
{
[Math]::Cos($latituteInRadians) * [Math]::Cos($declanationOfTheSun)
}
Function CalculateSinSunPosition([double]$declanationOfTheSun)
{
[Math]::Sin($latituteInRadians) * [Math]::Sin($declanationOfTheSun)
}
Function LimitTanSunPosition([double]$tanSunPosition)
{
if (([int]$tanSunPosition) -lt -1) { $tanSunPosition = -1.0 }
if (([int]$tanSunPosition) -gt 1) { $tanSunPosition = 1.0 }
$tanSunPosition
}
Function CalculateTanSunPosition([double]$declanationOfTheSun)
{
[double]$sinSunPosition = CalculateSinSunPosition $declanationOfTheSun
[double]$cosSunPosition = CalculateCosSunPosition $declanationOfTheSun
[double]$tanSunPosition = $sinSunPosition / $cosSunPosition
$tanSunPosition = LimitTanSunPosition $tanSunPosition
$tanSunPosition
}
Function LimitSunSet($sunSet)
{
if ($sunSet -gt 1439)
{
$sunSet -= 1439
}
$sunSet
}
Function LimitSunRise($sunRise)
{
if ($sunRise -lt 0)
{
$sunRise += 1440
}
$sunRise
}
Function CalculateSunRiseInternal([double]$tanSunPosition, [double]$differenceSunAndLocalTime)
{
$sunRise = (720.0 - 720.0 / [Math]::PI * [Math]::Acos(-$tanSunPosition) - $differenceSunAndLocalTime)
$sunRise = LimitSunRise $sunRise
$sunRise
}
Function CalculateSunSetInternal([double]$tanSunPosition, [double]$differenceSunAndLocalTime)
{
$sunSet = (720.0 + 720.0 / [Math]::PI * [Math]::Acos(-$tanSunPosition) - $differenceSunAndLocalTime)
$sunSet = LimitSunSet $sunSet
$sunSet
}
Function CalculateSunRise([DateTime]$dt)
{
[int]$dayNumberOfDateTime = $dt.DayOfYear
[double]$differenceSunAndLocalTime = CalculateDifferenceSunAndLocalTime $dayNumberOfDateTime
[double]$declanationOfTheSun = CalculateDeclination $dayNumberOfDateTime
[double]$tanSunPosition = CalculateTanSunPosition $declanationOfTheSun
#[int]$sunRiseInMinutes = CalculateSunRiseInternal $tanSunPosition $differenceSunAndLocalTime
$sunRiseInMinutes = CalculateSunRiseInternal $tanSunPosition $differenceSunAndLocalTime
CreateDateTime $dt $sunRiseInMinutes
}
Function CalculateSunSet([DateTime]$dt)
{
[int]$dayNumberOfDateTime = $dt.DayOfYear
[double]$differenceSunAndLocalTime = CalculateDifferenceSunAndLocalTime $dayNumberOfDateTime
[double]$declanationOfTheSun = CalculateDeclination $dayNumberOfDateTime
[double]$tanSunPosition = CalculateTanSunPosition $declanationOfTheSun
#[int]$sunSetInMinutes = CalculateSunSetInternal $tanSunPosition $differenceSunAndLocalTime
$sunSetInMinutes = CalculateSunSetInternal $tanSunPosition $differenceSunAndLocalTime
CreateDateTime $dt $sunSetInMinutes
}
Function CalculateMaximumSolarRadiationInternal([double]$sinSunHeight, [double]$sunCorrection)
{
[double]$maximumSolarRadiation = 0.0
if (($sinSunHeight -gt 0.0) -and [Math]::Abs(0.25 / $sinSunHeight) -lt 50.0)
{
$maximumSolarRadiation = $sunCorrection * $sinSunHeight * [Math]::Exp(-0.25 / $sinSunHeight)
} else {
$maximumSolarRadiation = 0
}
$maximumSolarRadiation
}
Function GetNumberOfMinutesThisDay([DateTime]$dt, [double]$differenceSunAndLocalTime)
{
[int]( $dt.Hour*60 + $dt.Minute + [int]$differenceSunAndLocalTime)
}
Function [double]$CalculateMaximumSolarRadiation([DateTime]$dt)
{
[int]$dayNumberOfDateTime = $dt.DayOfYear
[double]$differenceSunAndLocalTime = CalculateDifferenceSunAndLocalTime $dayNumberOfDateTime
[int]$numberOfMinutesThisDay = GetNumberOfMinutesThisDay $dt, $differenceSunAndLocalTime
[double]$declanationOfTheSun = CalculateDeclination $dayNumberOfDateTime
[double]$sinSunPosition = CalculateSinSunPosition $declanationOfTheSun
[double]$cosSunPosition = CalculateCosSunPosition $declanationOfTheSun
[double]$sinSunHeight = $sinSunPosition + $cosSunPosition * [Math]::Cos(2.0 * [Math]::PI * ($numberOfMinutesThisDay + 720.0) / 1440.0) + 0.08
[double]$sunConstantePart = [Math]::Cos(2.0 * [Math]::PI * $dayNumberOfDateTime)
[double]$sunCorrection = 1370.0 * (1.0 + (0.033 * $sunConstantePart))
CalculateMaximumSolarRadiationInternal $sinSunHeight $sunCorrection
}
# ------------------------------------------------------------------------------
# END::Functions...
#Inputs...
#Test1
# Kirche am Bebelplatz, 10117 Berlin, Allemagne (52.5157702 N, 13.3948097 E)
# Berlin as active; us deci with point
$Stadt = "Berlin"
[double]$longitude = 13.3948097 # E ° Deg
[double]$latitude = 52.5157702 # N ° Deg
[double]$longituteTimeZone = 2 # Sommerzeit 2
[bool]$useSummerTime = $false
# Azimut; Berlin - Paris = 245.0816581°; Entfernung: 879,112 Km; Excel: Arnold_Entfernung.xlsx
# Theoretisch wie lange ist der Azimut, der Zusammenschluss der 2 Enden ?
# Erdradius ist variable und wird verschieden Angegeben; nichts Einheitliches ...
<#
#Test2
# Paris/France
# Kirche: 6 Parvis Notre-Dame - Pl. Jean-Paul II, 75004 Paris, France (48.85296820000001 N, 2.3499021 E)
$Stadt = "Paris"
[double]$longitude = 2.3508 # E ° Deg
[double]$latitude = 48.8567 # N ° Deg
[double]$longituteTimeZone = 2 # Sommerzeit 2
[bool]$useSummerTime = $false
#>
$latituteInRadians = ConvertDegreeToRadian $latitude
$startDate = (Get-Date).date
# 0..365
1 | % {
"$Stadt latitude : " + $latitude.ToString()
# $dateToCalculate = $StartDate.AddDays($_) // Tag + 1: Für den Nächster Tag; als Vorschau
$SunR = CalculateSunRise $DateToCalculate
$SunS = CalculateSunSet $DateToCalculate
New-Object PSObject -property @{
# Date = $dateToCalculate.ToString('d') // idem für den Nächster Tag; als Vorschau
Date = get-date -F "d. MMMM yyyy"
SunRise = $SunR.ToString('T')
SunSet = $SunS.ToString('T')
DayLength = $SunS - $SunR
DayLengthTotalHours = ($SunS - $SunR).TotalHours
} | Select Date, SunRise, SunSet, DayLength, DayLengthTotalHours
}
Da waren schon verschieden Leute beteiligt!
In der Zwischenzeit hatte ich noch eine Andere Überlegung
Nichts Neues: Startpunkt Berlin als A,
Aber wann ist der Sonnenaufgang 100 Km Später mit seinen neuen Coordonne am gleichen Azimut?
Der Azimut zeigt genau auf die Kirche der Notre Dame in Paris (B), kommend von der Kirche amBebelplatz/Berlin.
Was brauchen Sie für die Zukunft:
2 geographische Standpunkte (Bing), das Excelfile zur Berechnung der Coordinate (+ 100 km erweiterte Entfernung Automatisch), den PowerShell scripte für die verschiedenen Zeitangaben. Alles ist Ausbaufähig. Ich glaube somit, dass das Thema abgeschlossen
ist.
Arnold
Nota Bene: Das Excel File
Entfernung