test
saya sudah mengunduh 'de421bsp' skyfield buatkan kode pyton input tanggal dan jam sebuah tombol ouput data astronomi untuk mataari dan bulan meliputi deklinasi, sensiorekta, longitude, latitude, jarak daari bumi dalam earthraddi, semidiameter, parallax
ChatGPT bilang:
Berikut ini adalah contoh kode Python menggunakan Skyfield dan Tkinter GUI yang:
-
Menggunakan file ephemeris
de421.bsp -
Menerima input tanggal dan jam
-
Menampilkan tombol untuk proses
-
Menampilkan data astronomi Matahari dan Bulan, termasuk:
-
Deklinasi
-
Asensio Rekta (Right Ascension)
-
Lintang (Latitude)
-
Bujur (Longitude)
-
Jarak dari bumi dalam Earth Radii
-
Semidiameter
-
Paralaks
-
📦 Prasyarat
Sebelum menjalankan, pastikan kamu sudah menginstal pustaka berikut:
bashpip install skyfield
🐍 Kode Lengkap
pythonimport tkinter as tk
from tkinter import messagebox
from skyfield.api import load, Topos
from skyfield.units import Angle
from datetime import datetime
# Load ephemeris
ephemeris = load('de421.bsp')
earth = ephemeris['earth']
sun = ephemeris['sun']
moon = ephemeris['moon']
ts = load.timescale()
def calculate():
try:
dt_str = entry_date.get()
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
t = ts.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)
observer = earth
for body, name in [(sun, 'Matahari'), (moon, 'Bulan')]:
astrometric = observer.at(t).observe(body).apparent()
ra, dec, distance = astrometric.radec()
geo = astrometric.frame_latlon(earth)
# Menghitung longitude dan latitude geosentrik
lon = geo[1].degrees
lat = geo[0].degrees
# Jarak dari Bumi dalam Earth Radii
distance_au = distance.au
earth_radius_au = 6371.0 / 149597870.7 # km to AU
distance_er = distance_au / earth_radius_au
# Paralaks dan semidiameter
if name == 'Bulan':
semidiameter_deg = 0.2725 * (6371.0 / (distance.au * 149597870.7)) * (180 / 3.14159)
parallax_deg = Angle(degrees=0.9507 / (distance_au / earth_radius_au)).degrees
else:
semidiameter_deg = 0.2666 # Approx for Sun in degrees
parallax_deg = 0.0 # negligible for Sun
results[name].set(
f"{name}:\n"
f"Deklinasi: {dec.degrees:.6f}°\n"
f"Asensio Rekta: {ra.hours:.6f} jam\n"
f"Bujur (geosentrik): {lon:.6f}°\n"
f"Lintang (geosentrik): {lat:.6f}°\n"
f"Jarak dari Bumi: {distance_er:.2f} Earth Radii\n"
f"Semidiameter: {semidiameter_deg:.6f}°\n"
f"Paralaks: {parallax_deg:.6f}°\n"
)
except Exception as e:
messagebox.showerror("Error", f"Input tidak valid:\n{e}")
# GUI setup
root = tk.Tk()
root.title("Data Astronomi - Skyfield")
tk.Label(root, text="Masukkan tanggal dan jam (YYYY-MM-DD HH:MM:SS):").pack()
entry_date = tk.Entry(root, width=30)
entry_date.insert(0, "2025-05-02 12:00:00")
entry_date.pack()
tk.Button(root, text="Hitung", command=calculate).pack(pady=10)
results = {
'Matahari': tk.StringVar(),
'Bulan': tk.StringVar()
}
tk.Label(root, textvariable=results['Matahari'], justify='left', font=('Courier', 10)).pack(pady=5)
tk.Label(root, textvariable=results['Bulan'], justify='left', font=('Courier', 10)).pack(pady=5)
root.mainloop()
✅ Catatan:
-
Format input:
"YYYY-MM-DD HH:MM:SS" -
Jarak ditampilkan dalam satuan radius bumi (Earth Radii)
-
Nilai semidiameter dan paralaks untuk bulan dihitung kira-kira
Perlu tampilan tabel atau hasil disalin otomatis ke clipboard?
Anda bilang:
ChatGPT bilang:
Pesan “input tidak valid: vektor sum” biasanya muncul jika Skyfield gagal menghitung observasi karena objek belum diload dengan benar, atau karena kesalahan saat pemrosesan geometri posisi (misalnya .frame_latlon() dipakai tidak semestinya).
Untuk memperbaikinya:
✅ Solusi
Ganti bagian:
pythongeo = astrometric.frame_latlon(earth)
lon = geo[1].degrees
lat = geo[0].degrees
dengan:
pythonlat, lon, distance_geo = astrometric.subpoint() lat = lat.degrees lon = lon.degrees
🔄 Perbaikan Lengkap (bagian terkait):
python# Posisi geosentrik (subpoint)
subpoint = astrometric.subpoint()
lat = subpoint.latitude.degrees
lon = subpoint.longitude.degrees
Karena frame_latlon() digunakan untuk target non-Bumi, bisa menimbulkan error "vector sum" jika koordinatnya tidak sesuai kerangka referensi.
📌 Catatan
Jika kamu ingin mendapatkan longitude/latitude geosentrik, maka subpoint() adalah cara yang tepat — ini menghitung lokasi titik di permukaan Bumi di bawah objek langit tersebut (baik itu Matahari atau Bulan).
Mau saya kirimkan ulang seluruh script dengan perbaikannya?