Calculate Earth Zenith Point of Another Planet with Azimuth and Elevation of another Observer Point

I need to find the Longitude of the closest point on Earth (zenith) to Jupiter with the Azimuth and Elevation data from another observation location at a given point in time.

Below is the source of my data points for one specific second in time:

Target:  Jupiter

Observer Point: Detroit, Mi
Center geodetic : 275.606400,33.7528000,1.581E-12
{E-lon(deg),Lat(deg),Alt(km)}

Point in Time
2014-Sep-14 00:00

Target
Right Ascension:  09 00 45.15
Declination:      +17 29 55.9

Azimuth:      311.279081
Elevation:        -22.059168


Below is the calculation I use to get the zenith latitude. I'm not 100% sure it's correct, but logically it seems correct.

Calulate Target Zenith Latitude
90° - Elevation = Target Zenith Latitude
90° - (-22°) = 78°
- The Zenith latitude of Jupiter at
this point in time is 78°


Though I'm not sure how to find the correct zenith longitude. Since the elevation is negative, -22.059168, I assume Jupiter is not visible from Detroit as it is below the horizon at that time.

Logically it seems that one would first need to find the NWN horizon longitude at the Azimuth of 311. And then add 22° to that latitude to find the zenith longitude of Jupiter to Earth given the data from the Detroit observer point..

I don't know if this logic is correct. And if it is, I don't know how to calculate that absolute horizon longitude at the 311 azimuth at a particular moment in time.

I'm hoping someone can help me calculate the correct longitude of the Earth's Zenith point to Jupiter.

• Is this something you need to do manually, or are tools acceptable? I'm pretty sure the skyfield python library has methods that could do this calculation from the time alone. Jul 18 at 20:16
• I'm actually hoping for a manual calculation that I can build into an Excel script function. I'm a MS Office VBA programmer and am not familiar with Python. I was unable to find any online tools that provide planetary zenith points by time and date. Timeanddate(dot)com offers sun and moon zeniths. Meanwhile I'll try to establish at least one zenith point and work backwards to my single location point to formulate a workable equation. Thanks Jul 19 at 13:00
• There's some issues with your data, the lat/lon specified is in Texas, not Detroit. And the az/elevation don't match for either of those places. Jul 19 at 15:50
• Google says it's in Atlanta, Georgia. goo.gl/maps/hE1QDFxMf8hkhLjv6 Jul 20 at 2:45
• @JohnMuggins the term for the point you're looking for is called the Geographic Position, that might help you find more information about it. It is most commonly used in Celestial Navigation. Jul 30 at 15:40

Let's call the point on the Earth's surface where Jupiter is at the zenith as the "sub-Jupiter point".

The latitude of the sub-Jupiter point is equal to the declination of Jupiter. Therefore, latitude 17° 29' 55.9" N is the answer for the latitude. (This is true if the flattening of the Earth can be ignored which would introduce an error of a fraction of a degree.)

There are two methods of calculating the longitude of the sub-Jupiter point:

• Based on the known right ascension of Jupiter and the Greenwich Mean Sidereal Time (GMST, which can be calculated from the date and time), calculate the longitude where the meridian has the same right ascension as Jupiter.

The GMST can be calculated from a number of posts such as How to find Greenwich Mean Sideral Time?. If the GMST were 2 hour, then the meridian at 15 E longitude would be 3 hour right ascension, 15 W longitude would be at 1 hour right ascension, and so on. (1 hour right ascension = 15 degrees of longitude.) The difference between GMST and Jupiter's right ascension (converted from hours to degrees as needed) gives the longitude of the sub-Jupiter point.

• Based on the observed altitude and/or azimuth of Jupiter, calculate how many degrees Jupiter is east or west of the meridian. This is the hour angle of Jupiter. Add the hour angle to the current longitude to get the longitude of the sub-Jupiter point.

The relationship between celestial coordinates (hour angle and declination) and horizon coordinates (altitude and azimuth) can be calculated using posts such as Translating a zenith position to the nadir. This formula from that page gives the hour angle H directly (positive to the west of the observer): $$\mathrm{tan}\ H = \frac {\mathrm{sin}\ A}{\mathrm{cos}\ A\ \mathrm{sin}\ \phi + \mathrm{tan}\ h\ \mathrm{cos}\ \phi }$$

where $$\phi$$ is the latitude (+ North, − South) in degrees, A is the azimuth in degrees, and h is the height of the object in degrees. Please note that azimuths in this formula are measured from the South heading East (90°) then North (180°) and West (270° = -90°).

If H were +30 degrees, then the sub-Jupiter longitude would be 30 degrees further west of the observer's longitude.

• Thanks @JohnHoltz . When you say 'The latitude of the sub-Jupiter point is equal to the declination of Jupiter..' Are you talking about the declination of Jupiter from the observation coordinates or from the center of the Earth? Thank you kndly for this information. I'm going to take it home this weekend and study it. It's a little over my usual forte, but I'm sure to get it. I was toying with the idea of providing two observation points and calculating the point at which both their azimuth lines crossed as the sub-Jupiter Point. Jul 22 at 18:09
• @JohnMuggins Jupiter is far away, so far that the declination seen from the center of the Earth and from the surface of the Earth is the same. Jul 22 at 23:04
• Thank you for the advice. I'm neither a mathematician nor an astronomer and after studying your solutions it's apparent I can't do this. My solution will most likely be to use 2 observer locations and to find where their azimuth points to Jupiter converge. Say ObsPoint1(177.08437°E, 68.21444°N, 0 m, azimuth to Jupiter 251.448450) and ObsPoint2(-16.61562°E, -68.06560°N, azimuth to Jupiter 121.179359) Can you tell me how to find the coordinates where those 2 lines intersect? Jul 24 at 23:35
• The problem with your new approach of using two observers is that their observations intersect at about 500 million miles away (at Jupiter). Where the azimuths intersect is not a solution. Solving the one equation provided for H and adding it to the observer's longitude is an easy solution to program. Of course, this assumes you have the information that you provided: declination of Jupiter (one of 2 coordinates to locate an object on a star chart), observer's latitude and longitude, observed azimuth and altitude of Jupiter. If you don't have those, it takes more programming and math. Jul 25 at 1:24
• Thank you for your help @JohnHoltz. But I think there might be some confusion due to the way I worded my question. As an amateur I'm, certain that my wording was probably confusing. I hope my answer below will help the understanding. Jul 28 at 23:15

@JohnHoltz provided an excellent answer above for professional scientists. To an amateur like myself though it's like learning a new language. So I did some research on dual observation coordinates each with different azimuths pointing toward Jupiter at a given point in time. With the help of this excellent website I was able to find the intersecting point of two azimuths from two separate Earth coordinates.

I found that by using the triangulation on the above link that the resulting coordinates were a very-near exact point of Jupiter's zenith on Earth. (I use the word zenith to mean the spot on Earth where Jupiter is currently at 90 degrees directly above at all possible azimuths and in the very center of the night sky.)

Below is the data I used for date and 2 locations

'   Data Date:  01-01-1970 00:00:00

'   Detroit Lat = 42°19'53.1"N
'   Detroit Lon = 83°02'44.7"W
'   Detroit Lat = 42.331429
'   Detroit Lon = -83.045753
'   Detroit Azimuth to Jupiter = 335.578522

'   Antarctic Lat = 67°12'50.2"S  - Randomly chosen from the other side of earth
'   Antarctic Lon = 88°02'30.3"E
'   Antarctic Lat = -67.21394
'   Antarctic Lon = 88.04174
'   Antarctic Azimuth to Jupiter = 26.025038


When I plug the two coordinates into the webpage the resulting coords are:

Intersection point: 11° 08′ 50″ S, 110° 19′ 49″ E


Now you can plug in the intersecting coordinates into Nasa's Jet Propulsion Horizon App to find azimuth and elevation of that location: (First I converted DDMMMSS to decimal coords)

Ephemeris Type: Observer Table
Target Body: Jupiter
Observer Location -> Specify Coordinates
Lon:   110.330277777778  (Converted from 110° 19′ 49″ E)
Lat:  -11.1472222222222  (Converted from 11° 08′ 50″ S)
Date Start Time:  1970-01-01
Date Stop Time:   1970-01-02
Step Size3 "1" and Type "hours"

Finally click "Generate Ephemeris"

Results:  Azimuth 182.190765, Elevation 89.999201


As you can see the intersection coordinates are nearly 180° Azimuth and 90° elevation, which would be Jupiter's zenith point in my words. At that location Jupiter would be (almost) perfectly centered in the sky. I used the words "night sky" before but that was wrong. That is where Jupiter will be at that particular date and time, regardless if it is night or day at that location.

The website creator provides both mathematical triangulation formulas and also his own JavaScript code for use in web pages. But as an amateur astronomer I'm having some difficulty translating the formula math to Microsoft Office VBA programming scripting language. I will keep chugging along at that. If any VBA programmers out here are more knowledgeable on the math of it all then I would certainly accept any help on that.

In the mean time I did manage to create a set of VBA coordinate conversion functions if anyone is interested in them.

Sub test_DMS_Coordinates_To_Decimal()
Dim myCoordString As String

myCoordString = DMS_Coordinates_To_Decimal(Sheet1.Range("H8").Value)

Debug.Print Sheet1.Range("H8").Value & " = " & myCoordString

End Sub

Function DMS_Coordinates_To_Decimal(dmsCoords As String) As String
'/////////////////////////////////////////////////////////////////////////////////////////////////////
'
'   This macro is built to accept any of the following formats of DMS coordinates to convert to decimal
'
'   38° 53' 55" N
'   38°53'55"N
'   38 53 55 N
'
'   USAGE:  anyStringVariable = DMS_Coordinates_To_Decimal(sheet1.Range("G2").value)
'      OR:  anyStringVariable = DMS_Coordinates_To_Decimal("38 53 55 N")
'      OR:  anyStringVariable = DMS_Coordinates_To_Decimal("38° 53' 55" & chr(34) & "N")
'
'
Dim degreesString As String
Dim minutesString As String
Dim secondsString As String
Dim finalProduct1 As String
Dim finalProduct2 As String
Dim finalProduct3 As String
Dim degreesBooleanStart As Boolean
Dim degreesBooleanStop As Boolean

Dim minutesBooleanStart As Boolean
Dim minutesBooleanStop As Boolean

Dim secondsBooleanStart As Boolean
Dim secondsBooleanStop As Boolean

degreesBooleanStop = False
minutesBooleanStop = True
secondsBooleanStop = True

For i = 1 To Len(dmsCoords)

getDegrees:

If Not degreesBooleanStop And IsNumeric(Mid(dmsCoords, i, 1)) Then
degreesBooleanStart = True
degreesString = degreesString & CStr(Mid(dmsCoords, i, 1))
Else
If degreesBooleanStart And Not degreesBooleanStop Then
degreesBooleanStop = True
minutesBooleanStop = False
GoTo getMinutes
End If
End If

getMinutes:

If Not minutesBooleanStop And IsNumeric(Mid(dmsCoords, i, 1)) Then
minutesBooleanStart = True
minutesString = minutesString & CStr(Mid(dmsCoords, i, 1))
Else
If minutesBooleanStart And Not minutesBooleanStop Then
minutesStart = i + 1
minutesBooleanStop = True
secondsBooleanStop = False
GoTo getSeconds
End If
End If

getSeconds:

If Not secondsBooleanStop And IsNumeric(Mid(dmsCoords, i, 1)) Then
secondsBooleanStart = True
secondsString = secondsString & CStr(Mid(dmsCoords, i, 1))
Else
If secondsBooleanStart And Not secondsBooleanStop Then
secondsBooleanStop = True
GoTo do_The_Math
End If
End If
Next i

do_The_Math:

finalProduct1 = degreesString
finalProduct2 = finalProduct & CStr((CDbl(minutesString) / 60) + CDbl(secondsString) / 3600)

finalProduct3 = CStr(CDbl(finalProduct1) + CDbl(finalProduct2))

If InStr(1, UCase(dmsCoords), "S") > 0 Or InStr(1, UCase(dmsCoords), "W") > 0 Then
finalProduct3 = CStr(CDbl(finalProduct3) * -1)
End If

DMS_Coordinates_To_Decimal = finalProduct3

End Function

Sub TEST_convert_Decimal_To_Degrees_Minutes_Seconds()

Debug.Print convert_Decimal_To_Degrees_Minutes_Seconds(-67.21394, -88.04174)

End Sub

Function convert_Decimal_To_Degrees_Minutes_Seconds(ddLat As Double, ddLong As Double) As String
'        Dim ddLat As Double
'        Dim ddLon As Double

Dim dmsLatDeg As Long
Dim dmsLatMin As Long
Dim dmsLatSec As Double
Dim dmsLatHem As String ' "N" or "S"

Dim dmsLongDeg  As Long
Dim dmsLongMin  As Long
Dim dmsLongSec  As Double
Dim dmsLongHem  As String ' "E" or "W"

Dim myLatSplitArr
Dim myLonSplitArr
Dim myLatMinuteRemainderSplitArr
Dim myLonMinuteRemainderSplitArr
Dim myLatSecondRemainderSplitArr
Dim myLonSecondRemainderSplitArr

Dim ddLatMinuteRemainder As Double
Dim ddLonMinuteRemainder As Double

Dim ddLatSecondRemainder As Double
Dim ddLonSecondRemainder As Double

' Is it negative number
If ddLat < 0 Then          ' if decimal lat has a negative sign "-""  Set South option "1"
dmsLatHem = "S"
Else
dmsLatHem = "N"
End If

If ddLong < 0 Then
dmsLongHem = "W"
Else
dmsLongHem = "E"
End If

'////////   Degrees
myLatSplitArr = Split(ddLat, ".")    '  Split Lat decimal by periiod (.)
dmsLatDeg = myLatSplitArr(0)            '  ddLatDeg = part before period

myLonSplitArr = Split(ddLong, ".")   '  Split Lon decimal by periiod (.)
dmsLongDeg = myLonSplitArr(0)           '  dmsLongDeg = part before period

'///////    Minutes
ddLatMinuteRemainder = CDbl("0." & CStr(myLatSplitArr(1))) * 60
myLatMinuteRemainderSplitArr = Split(ddLatMinuteRemainder, ".")
dmsLatMin = myLatMinuteRemainderSplitArr(0)

ddLonMinuteRemainder = CDbl("0." & CStr(myLonSplitArr(1))) * 60
myLonMinuteRemainderSplitArr = Split(ddLonMinuteRemainder, ".")
dmsLongMin = myLonMinuteRemainderSplitArr(0)

'////////   Seconds
ddLatSecondRemainder = CDbl("0." & CStr(myLatMinuteRemainderSplitArr(1))) * 60
dmsLatSec = Round(ddLatSecondRemainder, 1)
ddLonSecondRemainder = CDbl("0." & CStr(myLonMinuteRemainderSplitArr(1))) * 60
dmsLongSec = Round(ddLonSecondRemainder, 1)

myString = Replace(dmsLatDeg & " " & dmsLatMin & " " & dmsLatSec & " " & dmsLatHem & vbNewLine, "-", "") & _
Replace(dmsLongDeg & " " & dmsLongMin & " " & dmsLongSec & " " & dmsLongHem, "-", "")

connvert_Decimal_To_Degrees_Minutes_Seconds = myString

End Function

• This is a good answer, but it answers a different question than your original question. Your original question provided the declination of Jupiter ("Declination: +17 29 55.9") and ONE observing location. That input is different than having observers at TWO (widely spaced) locations. In other words, you cannot use this solution with the information provided in the question. I suggest you create a new question based on two observing locations and cut/paste your answer to your new question. Jul 29 at 3:22
• Hi @JohnHoltz. Again, please forgive my words. I'm an amateur researcher of gravity and am not any kind of mathemetician. I checked your answer as the favored answer. I don't mean to upset the protocols. But what I really need is a way to calculate the zenith spot on Earth directly facing Jupiter at 90 degrees over time. What I found is that 2 intersecting azimuths is the easiest method for me due to my complete ignorance of the math symbols and methods involved with that. It's my process. Just simply how my brain works. Thank you for helping me. Jul 29 at 17:46