private const ASTRONOMY_API_ID = 'votre_application_id';
private const ASTRONOMY_API_SECRET = 'votre_application_secret';
Plan gratuit : 1000 requêtes/mois • Données précises • Support complet
URL: astronomyapi.com
Précision: ±0.01° (Très haute)
Plan gratuit: 1000 requêtes/mois
Avantages: Données complètes, API REST moderne, documentation excellente
1. Inscription sur astronomyapi.com
2. Créer une application
3. Copier Application ID et Secret
4. Remplacer dans le code PHP
Type: Algorithme astronomique
Précision: ±0.1° (Bonne)
Coût: Gratuit, aucune limite
Usage: Calcul local, pas d'API requise
URL: ipgeolocation.io
Précision: ±1° (Moyenne)
Plan gratuit: 1000 requêtes/mois
Usage: Données astronomiques générales
// Dans le fichier PHP, remplacez ces lignes (ligne ~25-26) :
private const ASTRONOMY_API_ID = 'YOUR_ASTRONOMY_API_ID';
private const ASTRONOMY_API_SECRET = 'YOUR_ASTRONOMY_API_SECRET';
// Par vos vraies clés :
private const ASTRONOMY_API_ID = 'votre_application_id_ici';
private const ASTRONOMY_API_SECRET = 'votre_application_secret_ici';
Une fois configuré, le système utilisera automatiquement AstronomyAPI pour des calculs de haute précision. En cas d'erreur ou de quota dépassé, il basculera automatiquement sur VSOP87.
Pour utiliser les APIs externes, modifiez ces parties du code:
// Installation: composer require kylekatarnls/php-swiss-ephemeris
use SwissEphemeris\SwissEphemeris;
private function getMoonPositionSwissEph($date, $lat, $lon) {
$swe = new SwissEphemeris();
$jd = $this->dateToJulianDay($date);
$result = $swe->calc_ut($jd, SwissEphemeris::SE_MOON, SwissEphemeris::SEFLG_SWIEPH);
return [
'longitude' => $result[0], // Longitude géocentrique
'latitude' => $result[1], // Latitude géocentrique
'distance' => $result[2], // Distance en UA
'source' => 'Swiss Ephemeris'
];
}
private function getMoonPositionAstronomyAPI($date, $lat, $lon) {
$apiKey = 'VOTRE_CLE_API'; // Obtenir sur astronomyapi.com
$url = 'https://api.astronomyapi.com/api/v2/positions/moon';
$headers = [
'Authorization: Basic ' . base64_encode($apiKey . ':'),
'Content-Type: application/json'
];
$data = [
'format' => 'json',
'style' => 'default',
'observer' => [
'latitude' => $lat,
'longitude' => $lon,
'date' => $date->format('Y-m-d')
],
'view' => [
'type' => 'constellation'
]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
return [
'longitude' => $result['data']['position']['horizontal']['azimuth'],
'source' => 'AstronomyAPI'
];
}
// Ajoutez ces constantes en haut de la classe
private const ASTRONOMY_API_KEY = 'votre_cle_astronomyapi';
private const IPGEOLOCATION_API_KEY = 'votre_cle_ipgeolocation';
// Méthode principale avec fallbacks
public function getMoonPositionFromAPI($date, $latitude = 0, $longitude = 0) {
// 1. Essayer Swiss Ephemeris (le plus précis)
if (class_exists('SwissEphemeris\SwissEphemeris')) {
return $this->getMoonPositionSwissEph($date, $latitude, $longitude);
}
// 2. Essayer AstronomyAPI
if (!empty(self::ASTRONOMY_API_KEY)) {
$result = $this->getMoonPositionAstronomyAPI($date, $latitude, $longitude);
if ($result) return $result;
}
// 3. Essayer IPGeolocation
if (!empty(self::IPGEOLOCATION_API_KEY)) {
$result = $this->getMoonPositionIPGeo($date, $latitude, $longitude);
if ($result) return $result;
}
// 4. Fallback vers calcul VSOP87
return $this->getMoonPositionVSOP87($date);
}
| Méthode | Précision | Coût | Recommandation |
|---|---|---|---|
| Swiss Ephemeris | ±0.001° | Gratuit | ⭐⭐⭐⭐⭐ |
| AstronomyAPI | ±0.01° | 1000/mois gratuit | ⭐⭐⭐⭐ |
| VSOP87 (actuel) | ±0.1° | Gratuit | ⭐⭐⭐ |
| Approximation simple | ±5° | Gratuit | ⭐⭐ |