-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcoordinate-checker.go
79 lines (62 loc) · 2.91 KB
/
coordinate-checker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main
import (
"ai-forecast/structs"
"encoding/json"
"fmt"
"math"
"net/http"
)
type Coordinate struct {
Latitude float64
Longitude float64
}
type KilometerDeviation struct {
Latitude float64
Longitude float64
}
const oneKmInDeg float64 = 0.00898
const earthRadiusAtEquator = 111.32
func CoordinateChecker(coords Coordinate) (KilometerDeviation, error) {
fmt.Println("Входные координаты:", coords)
// Формируем URL для запроса к API
url := fmt.Sprintf("https://marine-api.open-meteo.com/v1/marine?latitude=%f&longitude=%f&hourly=wave_height", coords.Latitude, coords.Longitude)
fmt.Println("URL запроса:", url)
// Отправляем HTTP GET запрос
resp, err := http.Get(url)
if err != nil {
return KilometerDeviation{}, fmt.Errorf("ошибка при отправке запроса: %v", err)
}
defer resp.Body.Close()
// Проверяем статус код ответа
if resp.StatusCode != http.StatusOK {
return KilometerDeviation{}, fmt.Errorf("неожиданный статус код: %d", resp.StatusCode)
}
// Парсим JSON ответ
var testCoordinate structs.MarineForecast
if err := json.NewDecoder(resp.Body).Decode(&testCoordinate); err != nil {
return KilometerDeviation{}, fmt.Errorf("ошибка парсинга JSON: %v", err)
}
fmt.Printf("Ответные координаты: Широта: %f, Долгота: %f\n", testCoordinate.Latitude, testCoordinate.Longitude)
// Вычисляем отклонение по широте
deviationLatitude := coords.Latitude - testCoordinate.Latitude
deviationLatitudeKilometer := deviationLatitude / oneKmInDeg
fmt.Printf("Отклонение по широте: %f градусов, что соответствует %f км\n", deviationLatitude, deviationLatitudeKilometer)
// Вычисляем длину одного градуса долготы в километрах на данной широте
lengthOfDegreeLongitude := ConverterLongitudeToKilometer(testCoordinate.Latitude)
// Вычисляем отклонение по долготе
deviationLongitude := coords.Longitude - testCoordinate.Longitude
deviationLongitudeKilometer := deviationLongitude * lengthOfDegreeLongitude
fmt.Printf("Отклонение по долготе: %f градусов, что соответствует %f км\n", deviationLongitude, deviationLongitudeKilometer)
result := KilometerDeviation{
Latitude: deviationLatitudeKilometer,
Longitude: deviationLongitudeKilometer,
}
return result, nil
}
func ConverterLongitudeToKilometer(latitude float64) float64 {
latitudeRad := latitude * math.Pi / 180
cosLatitude := math.Cos(latitudeRad)
lengthOfDegreeLongitude := earthRadiusAtEquator * cosLatitude
fmt.Printf("Длина одного градуса долготы на широте %.2f°: %.2f км\n", latitude, lengthOfDegreeLongitude)
return lengthOfDegreeLongitude
}