Flutter实时公交数据获取插件gtfs_realtime_bindings的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter 实时公交数据获取插件 gtfs_realtime_bindings 的使用

简介

gtfs_realtime_bindings 是一个用于解析 GTFS-Realtime 协议缓冲区(Protocol Buffer)数据的 Dart 语言绑定库。通过这个库,你可以轻松地将二进制格式的 GTFS-Realtime 数据解析为 Dart 对象,从而在 Flutter 应用中使用这些数据。

使用方法

以下是一个完整的示例代码,展示了如何从特定的 URL 下载 GTFS-Realtime 数据,并将其解析为 FeedMessage 对象。FeedMessage 是 GTFS-Realtime 模式的根类型,包含了所有的实体信息。

import 'package:http/http.dart' as http;
import 'package:gtfs_realtime_bindings/gtfs_realtime_bindings.dart';

void main() async {
  // 定义 GTFS Realtime 数据源的 URL
  final url = Uri.parse('URL of your GTFS Realtime feed');

  try {
    // 发送 HTTP GET 请求获取数据
    final response = await http.get(url);

    // 检查请求是否成功
    if (response.statusCode == 200) {
      // 将响应的二进制数据解析为 FeedMessage 对象
      final feedMessage = FeedMessage.fromBuffer(response.bodyBytes);

      // 打印实体的数量
      print('Number of entities: ${feedMessage.entity.length}.');

      // 遍历每个实体并打印相关信息
      for (var entity in feedMessage.entity) {
        if (entity.tripUpdate != null) {
          print('Trip Update: ${entity.tripUpdate}');
        } else if (entity.vehicle != null) {
          print('Vehicle Position: ${entity.vehicle}');
        } else if (entity.alert != null) {
          print('Alert: ${entity.alert}');
        }
      }
    } else {
      // 如果请求失败,打印错误状态码
      print('Request failed with status: ${response.statusCode}.');
    }
  } catch (e) {
    // 捕获并打印任何异常
    print('An error occurred: $e');
  }
}

详细说明

  1. 导入必要的包

    • http:用于发送 HTTP 请求。
    • gtfs_realtime_bindings:用于解析 GTFS-Realtime 数据。
  2. 定义 URL

    • Uri.parse('URL of your GTFS Realtime feed'):替换为你实际的 GTFS-Realtime 数据源 URL。
  3. 发送 HTTP 请求

    • await http.get(url):异步发送 GET 请求,获取数据。
  4. 检查响应状态码

    • if (response.statusCode == 200):如果状态码为 200,表示请求成功。
  5. 解析数据

    • FeedMessage.fromBuffer(response.bodyBytes):将响应的二进制数据解析为 FeedMessage 对象。
  6. 处理实体

    • feedMessage.entity:包含所有实体(如行程更新、车辆位置、警报等)。
    • 通过遍历 feedMessage.entity,可以根据不同的实体类型(tripUpdatevehiclealert)进行相应的处理。
  7. 异常处理

    • 使用 try-catch 块捕获并处理可能发生的异常,确保程序不会因网络或其他问题而崩溃。

生成 Dart 代码

gtfs_realtime_bindings 是通过 Protocol Buffers 规范生成的 Dart 代码。你需要下载 GTFS-Realtime 的 .proto 文件,并使用 protoc 工具生成 Dart 代码。

  1. 下载 .proto 文件:

  2. 生成 Dart 代码:

    • 使用以下命令生成 Dart 代码:
      protoc --dart_out=lib/src gtfs-realtime.proto
      

更多关于Flutter实时公交数据获取插件gtfs_realtime_bindings的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时公交数据获取插件gtfs_realtime_bindings的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用gtfs_realtime_bindings插件来获取实时公交数据的示例代码。这个插件允许你解析GTFS-realtime数据,这些数据通常由公共交通机构提供,用于描述实时公交、地铁等的位置和状态。

首先,确保你已经在pubspec.yaml文件中添加了gtfs_realtime_bindings依赖:

dependencies:
  flutter:
    sdk: flutter
  gtfs_realtime_bindings: ^x.y.z # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们编写一个Flutter应用来演示如何使用这个插件。假设你已经有一个GTFS-realtime数据的URL,我们将展示如何解析这些数据。

import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:gtfs_realtime_bindings/gtfs_realtime_bindings.dart' as gtfs;
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _responseData = '';

  @override
  void initState() {
    super.initState();
    _fetchRealTimeData();
  }

  Future<void> _fetchRealTimeData() async {
    try {
      // 替换为你的GTFS-realtime数据URL
      final response = await http.get(Uri.parse('YOUR_GTFS_REALTIME_DATA_URL'));

      if (response.statusCode == 200) {
        Uint8List bytes = response.bodyBytes;
        gtfs.FeedMessage feedMessage = gtfs.FeedMessage.fromBuffer(bytes);

        // 处理feedMessage,例如获取车辆位置信息
        for (var entity in feedMessage.entity) {
          if (entity.hasTripUpdate) {
            gtfs.TripUpdate tripUpdate = entity.tripUpdate;
            // 处理tripUpdate,例如获取车辆位置、到达时间等
            print('Trip ID: ${tripUpdate.trip.id}');
            for (var stopTimeEvent in tripUpdate.stopTimeUpdate) {
              print('Stop ID: ${stopTimeEvent.stopId}, Arrival: ${stopTimeEvent.arrival?.time}, Departure: ${stopTimeEvent.departure?.time}');
            }
          }
        }
      } else {
        setState(() {
          _responseData = 'Failed to load data: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        _responseData = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GTFS Realtime Data Example'),
        ),
        body: Center(
          child: Text(_responseData),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用http包从指定的URL获取GTFS-realtime数据。
  2. 使用gtfs_realtime_bindings解析获取到的数据。
  3. 遍历FeedMessage中的entity,检查它们是否有TripUpdate,并打印出相关的信息(例如Trip ID和Stop ID)。

请注意,这个示例中_responseData变量仅用于显示状态信息,实际应用中你可能需要在UI中更详细地展示这些数据。

此外,你需要替换'YOUR_GTFS_REALTIME_DATA_URL'为你的实际GTFS-realtime数据源URL。如果你打算在生产环境中使用此代码,请确保添加适当的错误处理和用户反馈机制。

回到顶部