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秒检查一次
	}
}

注意事项

  1. OpenSky API有使用限制,匿名用户每分钟约10次请求,认证用户更多
  2. 某些数据字段可能为空,需要做空值检查
  3. 对于生产环境,建议添加错误处理和重试逻辑
  4. 坐标系统使用WGS84
  5. 高度单位是米,速度单位是米/秒

通过gopensky库,你可以方便地集成航空数据到你的Go应用程序中,用于飞行跟踪、数据分析等场景。

回到顶部