MapaAstral / Pasted-import-swisseph-as-swe-from-datetime-import-datetime-import-pytz-from-geopy-geocoders-import-Nominat-1740106507168.txt
SherlockRamos's picture
Upload 14 files
cdcd73e verified
import swisseph as swe
from datetime import datetime
import pytz
from geopy.geocoders import Nominatim
from timezonefinder import TimezoneFinder
import os
import requests
import zipfile
from pathlib import Path
# Configurar o caminho para os arquivos de efemérides (ajuste conforme necessário)
swe.set_ephe_path('/path/to/ephe') # Substitua pelo caminho correto no seu sistema
def download_ephe_files():
"""Baixa e configura os arquivos de efemérides necessários."""
# Criar diretório para as efemérides se não existir
ephe_dir = Path("ephe")
ephe_dir.mkdir(exist_ok=True)
# URL base do repositório
base_url = "https://raw.githubusercontent.com/aloistr/swisseph/master/ephe/"
# Lista de arquivos essenciais
essential_files = [
"seas_18.se1", # Arquivo principal do Sol
"semo_18.se1", # Arquivo principal da Lua
"sepl_18.se1" # Arquivo principal dos planetas
]
# Baixar arquivos
for filename in essential_files:
file_path = ephe_dir / filename
if not file_path.exists():
print(f"Baixando {filename}...")
try:
response = requests.get(f"{base_url}{filename}")
response.raise_for_status()
with open(file_path, "wb") as f:
f.write(response.content)
except Exception as e:
print(f"Erro ao baixar {filename}: {e}")
return False
# Configurar o caminho das efemérides
swe.set_ephe_path(str(ephe_dir))
return True
# Funções auxiliares
def get_timezone(cidade):
"""Obtém latitude, longitude e fuso horário a partir do nome da cidade."""
geolocator = Nominatim(user_agent="astro_calculator")
location = geolocator.geocode(cidade)
if not location:
raise ValueError("Cidade não encontrada.")
lat, lon = location.latitude, location.longitude
tf = TimezoneFinder()
timezone_str = tf.timezone_at(lat=lat, lng=lon)
if not timezone_str:
raise ValueError("Fuso horário não encontrado para esta localização.")
return timezone_str, lat, lon
def get_julian_day(data_str, hora_str, timezone_str):
"""Converte data e hora local para Julian Day (UTC)."""
try:
# Parsear data e hora
dia, mes, ano = map(int, data_str.split('/'))
hora, minuto = map(int, hora_str.split(':'))
# Criar objeto datetime com fuso horário local
tz = pytz.timezone(timezone_str)
dt_local = tz.localize(datetime(ano, mes, dia, hora, minuto))
# Converter para UTC
dt_utc = dt_local.astimezone(pytz.UTC)
# Calcular Julian Day
return swe.utc_to_jd(dt_utc.year, dt_utc.month, dt_utc.day,
dt_utc.hour, dt_utc.minute, dt_utc.second,
swe.GREG_CAL)[1]
except Exception as e:
print(f"Erro ao converter data/hora: {e}")
return None
def calcular_signo(graus):
"""Converte uma posição em graus para o signo correspondente."""
signos = ["Áries", "Touro", "Gêmeos", "Câncer", "Leão", "Virgem",
"Libra", "Escorpião", "Sagitário", "Capricórnio", "Aquário", "Peixes"]
grau_normalizado = graus % 360
indice = int(grau_normalizado // 30)
return signos[indice]
def calcular_aspectos(posicoes):
"""Calcula aspectos principais entre os planetas."""
aspectos = []
orbes = {"Conjunção": 8, "Oposição": 8, "Trígono": 6, "Quadrratura": 6, "Sextil": 4}
tipos_aspectos = {
0: "Conjunção", 60: "Sextil", 90: "Quadrratura", 120: "Trígono", 180: "Oposição"
}
planetas_lista = list(posicoes.keys())
for i in range(len(planetas_lista)):
for j in range(i + 1, len(planetas_lista)):
p1, p2 = planetas_lista[i], planetas_lista[j]
grau1, grau2 = posicoes[p1]["graus"], posicoes[p2]["graus"]
diff = min((grau1 - grau2) % 360, (grau2 - grau1) % 360)
for angulo, tipo in tipos_aspectos.items():
if abs(diff - angulo) <= orbes[tipo]:
aspectos.append(f"{p1} em {tipo} com {p2} ({diff:.2f}°)")
return aspectos
# Programa principal
def main():
print("Bem-vindo ao cálculo do Mapa Astral!")
# Adicionar verificação e download dos arquivos de efemérides
print("Verificando arquivos de efemérides...")
if not download_ephe_files():
print("Erro ao configurar os arquivos de efemérides. O programa não pode continuar.")
return
data_nascimento = input("Digite sua data de nascimento (dd/mm/aaaa): ")
hora_nascimento = input("Digite sua hora de nascimento (hh:mm): ")
cidade_nascimento = input("Digite a cidade e país de nascimento (ex.: São Paulo, Brasil): ")
try:
# Obter fuso horário e coordenadas
timezone, latitude, longitude = get_timezone(cidade_nascimento)
print(f"\nLocal: {cidade_nascimento} (Lat: {latitude:.4f}, Lon: {longitude:.4f})")
print(f"Fuso horário: {timezone}")
# Converter para Julian Day
julian_day = get_julian_day(data_nascimento, hora_nascimento, timezone)
if julian_day is None:
raise ValueError("Erro ao calcular o Julian Day.")
# Calcular posições planetárias e nodos
planetas = {
"Sol": swe.SUN, "Lua": swe.MOON, "Mercúrio": swe.MERCURY,
"Vênus": swe.VENUS, "Marte": swe.MARS, "Júpiter": swe.JUPITER,
"Saturno": swe.SATURN, "Urano": swe.URANUS, "Netuno": swe.NEPTUNE,
"Plutão": swe.PLUTO, "Nodo Norte": swe.MEAN_NODE
}
posicoes = {}
for nome, planeta in planetas.items():
resultado = swe.calc_ut(julian_day, planeta)
pos = resultado[0][0] # Pegando apenas a longitude eclíptica
posicoes[nome] = {"graus": pos, "signo": calcular_signo(pos)}
# Nodo Sul é oposto ao Nodo Norte
nodo_sul_graus = (posicoes["Nodo Norte"]["graus"] + 180) % 360
posicoes["Nodo Sul"] = {"graus": nodo_sul_graus, "signo": calcular_signo(nodo_sul_graus)}
# Calcular Ascendente e casas
casas, aspectos_casas = swe.houses(julian_day, latitude, longitude, b'P') # Placidus
ascendente = casas[0]
signo_ascendente = calcular_signo(ascendente)
meio_do_ceu = casas[9]
signo_mc = calcular_signo(meio_do_ceu)
# Calcular aspectos
aspectos = calcular_aspectos(posicoes)
# Exibir resultados
print("\n=== Mapa Astral ===")
print(f"Signo Solar: {posicoes['Sol']['signo']} ({posicoes['Sol']['graus']:.2f}°)")
print(f"Signo Lunar: {posicoes['Lua']['signo']} ({posicoes['Lua']['graus']:.2f}°)")
print(f"Ascendente: {signo_ascendente} ({ascendente:.2f}°)")
print(f"Meio do Céu: {signo_mc} ({meio_do_ceu:.2f}°)")
print("\n=== Outros Planetas ===")
for planeta, info in posicoes.items():
if planeta not in ["Sol", "Lua", "Nodo Norte", "Nodo Sul"]:
print(f"{planeta}: {info['signo']} ({info['graus']:.2f}°)")
print("\n=== Nodos Lunares ===")
print(f"Nodo Norte: {posicoes['Nodo Norte']['signo']} ({posicoes['Nodo Norte']['graus']:.2f}°)")
print(f"Nodo Sul: {posicoes['Nodo Sul']['signo']} ({posicoes['Nodo Sul']['graus']:.2f}°)")
print("\n=== Casas Astrológicas ===")
for i, casa in enumerate(casas[:12], 1):
signo_casa = calcular_signo(casa)
print(f"Casa {i}: {signo_casa} ({casa:.2f}°)")
print("\n=== Aspectos Principais ===")
if aspectos:
for aspecto in aspectos:
print(aspecto)
else:
print("Nenhum aspecto significativo encontrado.")
except Exception as e:
print(f"Erro: {e}")
if __name__ == "__main__":
main()