golang实时获取航空ADS-B和Mode S数据的API客户端插件库gopensky的使用
Golang实时获取航空ADS-B和Mode S数据的API客户端插件库gopensky的使用
Go OpenSKY Network API介绍
这是一个实现OpenSky网络实时API的Golang库。该API允许您获取实时空域信息(ADS-B和Mode S数据),用于研究和非商业用途。
安装
安装最新版本的库:
$ go get github.com/navidys/gopensky
然后在您的应用程序中包含gopensky:
import "github.com/navidys/gopensky"
主要功能
- GetStates - 获取给定时间的状态向量
- GetArrivalsByAirport - 获取特定机场在给定时间间隔内到达的航班
- GetDeparturesByAirport - 获取特定机场在给定时间间隔内起飞的航班
- GetFlightsByInterval - 获取特定时间间隔内的航班
- GetFlightsByAircraft - 获取特定飞机在给定时间间隔内的航班
- GetTrackByAircraft - 获取特定飞机在给定时间的轨迹
示例代码
以下是一个获取Elon Musk主要私人飞机(ICAO24应答机地址为a835af)在2023年8月31日23:11:04到2023年9月29日23:11:04期间的航班数据的示例程序:
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/navidys/gopensky"
)
func main() {
// 创建OpenSky连接
conn, err := gopensky.NewConnection(context.Background(), "", "")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 获取Elon Musk私人飞机的航班数据
// 开始时间: 1693523464 (2023年8月31日23:11:04)
// 结束时间: 1696029064 (2023年9月29日23:11:04)
flightsData, err := gopensky.GetFlightsByAircraft(conn, "a835af", 1693523464, 1696029064)
if err != nil {
fmt.Println(err)
os.Exit(2)
}
// 打印航班信息
for _, flightData := range flightsData {
var (
departedAirport string
arrivalAriport string
)
if flightData.EstDepartureAirport != nil {
departedAirport = *flightData.EstDepartureAirport
}
if flightData.EstArrivalAirport != nil {
arrivalAriport = *flightData.EstArrivalAirport
}
fmt.Printf("ICAO24: %s, Departed: %4s, Arrival: %4s, LastSeen: %s\n",
flightData.Icao24,
departedAirport,
arrivalAriport,
time.Unix(flightData.LastSeen, 0),
)
}
}
输出示例
程序运行后可能输出如下信息:
ICAO24: a835af, Departed: KAUS, Arrival: KUVA, LastSeen: 2023-09-29 07:46:02 +1000 AEST
ICAO24: a835af, Departed: , Arrival: 02XS, LastSeen: 2023-09-19 10:59:04 +1000 AEST
ICAO24: a835af, Departed: , Arrival: KSLC, LastSeen: 2023-09-16 12:56:20 +1000 AEST
ICAO24: a835af, Departed: KAUS, Arrival: KIAD, LastSeen: 2023-09-13 14:35:18 +1000 AEST
ICAO24: a835af, Departed: KSJC, Arrival: 2TS2, LastSeen: 2023-09-09 18:40:39 +1000 AEST
ICAO24: a835af, Departed: KAUS, Arrival: KSJC, LastSeen: 2023-09-08 08:20:02 +1000 AEST
注意事项
请注意,匿名用户和OpenSky用户有一些限制集,详细信息请参考OpenSky Network的相关文档。
更多关于golang实时获取航空ADS-B和Mode S数据的API客户端插件库gopensky的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实时获取航空ADS-B和Mode S数据的API客户端插件库gopensky的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gopensky库实时获取航空ADS-B和Mode S数据
OpenSky Network是一个提供实时航空数据的平台,包括ADS-B和Mode S信息。gopensky是一个Go语言的客户端库,用于与OpenSky Network API交互。
安装gopensky
首先安装gopensky库:
go get github.com/opensky-network/go-opensky
基本使用示例
1. 获取所有飞行状态
package main
import (
"fmt"
"log"
"time"
"github.com/opensky-network/go-opensky"
)
func main() {
// 创建OpenSky客户端
client := opensky.NewClient(nil)
// 获取所有飞行状态
states, _, err := client.States.GetStates(nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("获取到 %d 架飞机的状态\n", len(*states.States))
for _, state := range *states.States {
fmt.Printf("呼号: %s, 高度: %.0f米, 速度: %.0fkm/h\n",
state.Callsign,
state.GeoAltitude,
state.Velocity*3.6) // 转换为km/h
}
}
2. 获取特定区域的飞行状态
func getFlightsInArea() {
client := opensky.NewClient(nil)
// 定义感兴趣的区域 (minLat, maxLat, minLon, maxLon)
area := &opensky.StatesOptions{
Lamin: opensky.Float64(45.0), // 最小纬度
Lomin: opensky.Float64(8.0), // 最小经度
Lamax: opensky.Float64(48.0), // 最大纬度
Lomax: opensky.Float64(12.0), // 最大经度
}
states, _, err := client.States.GetStates(area)
if err != nil {
log.Fatal(err)
}
fmt.Printf("在指定区域内有 %d 架飞机\n", len(*states.States))
}
3. 获取特定飞机的轨迹
func getAircraftTrack() {
client := opensky.NewClient(nil)
// 使用飞机的ICAO24地址
icao24 := "abc123" // 替换为实际ICAO24地址
// 设置时间范围 (可选)
start := time.Now().Add(-24 * time.Hour)
end := time.Now()
track, _, err := client.Tracks.GetTrack(icao24, &opensky.TracksOptions{
Time: opensky.Int64(start.Unix()),
EndTime: opensky.Int64(end.Unix()),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("飞机 %s 的轨迹点数量: %d\n", icao24, len(*track.Path))
for _, point := range *track.Path {
fmt.Printf("时间: %s, 位置: %.4f,%.4f, 高度: %.0f米\n",
time.Unix(int64(point[3]), 0).Format(time.RFC3339),
point[1], // 经度
point[2], // 纬度
point[4], // 高度
)
}
}
高级功能
1. 使用认证获取更多数据
func getFlightsWithAuth() {
// 使用OpenSky账户认证 (可在https://opensky-network.org注册)
client := opensky.NewClient(&opensky.ClientOptions{
Username: "your_username",
Password: "your_password",
})
// 认证用户可以获取更多数据
states, _, err := client.States.GetStates(nil)
if err != nil {
log.Fatal(err)
}
// 处理数据...
}
2. 实时监控特定飞机
func monitorAircraft(icao24 string) {
client := opensky.NewClient(nil)
for {
states, _, err := client.States.GetStates(nil)
if err != nil {
log.Println("获取状态错误:", err)
time.Sleep(10 * time.Second)
continue
}
for _, state := range *states.States {
if state.Icao24 == icao24 {
fmt.Printf("飞机 %s 当前位置: %.4f,%.4f, 高度: %.0f米\n",
icao24,
state.Longitude,
state.Latitude,
state.GeoAltitude,
)
}
}
time.Sleep(30 * time.Second) // 每30秒检查一次
}
}
注意事项
- OpenSky API有使用限制,匿名用户每分钟约10次请求,认证用户更多
- 某些数据字段可能为空,需要做空值检查
- 对于生产环境,建议添加错误处理和重试逻辑
- 坐标系统使用WGS84
- 高度单位是米,速度单位是米/秒
通过gopensky库,你可以方便地集成航空数据到你的Go应用程序中,用于飞行跟踪、数据分析等场景。