forked from gsn/predictor
87 lines
2.3 KiB
Go
87 lines
2.3 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"net/http"
|
||
"time"
|
||
|
||
"git.intra.yksa.space/gsn/predictor/internal/pkg/grib"
|
||
)
|
||
|
||
func main() {
|
||
ctx := context.Background()
|
||
|
||
// Инициализируем GRIB сервис
|
||
cfg := &grib.Config{
|
||
Dir: "C:/tmp/grib",
|
||
TTL: 48 * time.Hour,
|
||
CacheTTL: 1 * time.Hour,
|
||
Parallel: 8,
|
||
}
|
||
|
||
svc, err := grib.New(cfg)
|
||
if err != nil {
|
||
fmt.Printf("Error creating service: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// Обновляем данные (создаёт куб)
|
||
fmt.Println("Updating GRIB data (building cube)...")
|
||
start := time.Now()
|
||
if err := svc.Update(ctx); err != nil {
|
||
fmt.Printf("Update error: %v\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("Cube built in %v\n", time.Since(start))
|
||
|
||
// Тестируем извлечение ветра
|
||
fmt.Println("\nTesting wind extraction...")
|
||
lat, lon, alt := 52.2, 0.1, 10000.0
|
||
ts := time.Date(2026, 2, 11, 12, 0, 0, 0, time.UTC)
|
||
|
||
wind, err := svc.Extract(ctx, lat, lon, alt, ts)
|
||
if err != nil {
|
||
fmt.Printf("Extract error: %v\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("Wind at (%.2f, %.2f, %.0fm) at %v:\n", lat, lon, alt, ts)
|
||
fmt.Printf(" U (east): %.2f m/s\n", wind[0])
|
||
fmt.Printf(" V (north): %.2f m/s\n", wind[1])
|
||
|
||
// Сравниваем с Tawhiri
|
||
fmt.Println("\nComparing with Tawhiri API...")
|
||
tawhiriURL := fmt.Sprintf(
|
||
"https://api.v2.sondehub.org/tawhiri?launch_latitude=%.2f&launch_longitude=%.2f&launch_altitude=0&launch_datetime=%s&ascent_rate=5&burst_altitude=30000&descent_rate=5",
|
||
lat, lon, ts.Format(time.RFC3339),
|
||
)
|
||
|
||
resp, err := http.Get(tawhiriURL)
|
||
if err != nil {
|
||
fmt.Printf("Tawhiri request error: %v\n", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, _ := io.ReadAll(resp.Body)
|
||
var tawhiriResp map[string]interface{}
|
||
json.Unmarshal(body, &tawhiriResp)
|
||
|
||
// Выводим финальную точку приземления
|
||
if prediction, ok := tawhiriResp["prediction"].([]interface{}); ok {
|
||
for _, stage := range prediction {
|
||
stageMap := stage.(map[string]interface{})
|
||
if stageMap["stage"] == "descent" {
|
||
trajectory := stageMap["trajectory"].([]interface{})
|
||
if len(trajectory) > 0 {
|
||
last := trajectory[len(trajectory)-1].(map[string]interface{})
|
||
fmt.Printf("\nTawhiri landing point:\n")
|
||
fmt.Printf(" Lat: %.4f\n", last["latitude"])
|
||
fmt.Printf(" Lon: %.4f\n", last["longitude"])
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|