Flutter地图服务插件mapbox_api的使用

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

Flutter地图服务插件mapbox_api的使用

mapbox_api 是一个用于调用 Mapbox API 的 Dart SDK,它仅依赖于 http 包,并且遵循官方文档。本文将介绍如何在 Flutter 项目中使用 mapbox_api 插件来请求导航和地理编码服务。

快速开始

添加依赖

首先,在你的 pubspec.yaml 文件中添加 mapbox_api 依赖:

dependencies:
  mapbox_api: ^latest_version

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

初始化 MapboxApi

在使用 mapbox_api 之前,你需要从 Mapbox 获取一个 API token。

import 'package:mapbox_api/mapbox_api.dart';

void main() async {
  final mapbox = MapboxApi(
    accessToken: '<Your Mapbox API token>',
  );
}

请求导航服务

示例代码:获取驾驶路线

下面是一个简单的示例,演示如何请求从一个地点到另一个地点的驾驶路线。

import 'package:mapbox_api/mapbox_api.dart';

void main() async {
  final mapbox = MapboxApi(
    accessToken: '<Your Mapbox API token>',
  );

  try {
    final response = await mapbox.directions.request(
      profile: NavigationProfile.DRIVING_TRAFFIC,
      overview: NavigationOverview.FULL,
      geometries: NavigationGeometries.GEOJSON,
      steps: true,
      coordinates: [
        [37.786060, -122.246225], // 起点坐标 (纬度, 经度)
        [37.785939, -122.194292], // 终点坐标 (纬度, 经度)
      ],
    );

    if (response.error == null) {
      if (response.routes != null && response.routes!.isNotEmpty) {
        final route = response.routes![0];
        final eta = Duration(seconds: route.duration!.toInt());
        print('预计到达时间: $eta');
      } else {
        print('未找到路线');
      }
    } else {
      print('请求失败: ${response.error}');
    }
  } catch (e) {
    print('发生错误: $e');
  }
}

处理错误

如果请求失败,response.error 将包含具体的错误信息。你可以根据不同的错误类型进行处理:

if (response.error is NavigationNoRouteError) {
  // 处理找不到路线的情况
} else if (response.error is NavigationNoSegmentError) {
  // 处理找不到路段的情况
}

请求地理编码服务

正向地理编码

正向地理编码是将地址转换为经纬度坐标。以下是如何请求正向地理编码的示例:

import 'package:mapbox_api/mapbox_api.dart';

void main() async {
  final mapbox = MapboxApi(
    accessToken: '<Your Mapbox API token>',
  );

  try {
    final response = await mapbox.forwardGeocoding.request(
      searchText: '埃菲尔铁塔',
      fuzzyMatch: true,
      language: 'fr',
      proximity: [48.858638, 2.286020], // 可选参数,提供附近的参考位置以提高准确性
    );

    if (response.error == null) {
      if (response.features != null && response.features!.isNotEmpty) {
        final feature = response.features![0];
        print('经纬度: ${feature.geometry!.coordinates}');
      } else {
        print('未找到匹配结果');
      }
    } else {
      print('请求失败: ${response.error}');
    }
  } catch (e) {
    print('发生错误: $e');
  }
}

反向地理编码

反向地理编码是将经纬度坐标转换为地址。以下是反向地理编码的示例:

import 'package:mapbox_api/mapbox_api.dart';

void main() async {
  final mapbox = MapboxApi(
    accessToken: '<Your Mapbox API token>',
  );

  try {
    final response = await mapbox.reverseGeocoding.request(
      longitude: 2.286020,
      latitude: 48.858638,
    );

    if (response.error == null) {
      if (response.features != null && response.features!.isNotEmpty) {
        final feature = response.features![0];
        print('地址: ${feature.placeName}');
      } else {
        print('未找到匹配结果');
      }
    } else {
      print('请求失败: ${response.error}');
    }
  } catch (e) {
    print('发生错误: $e');
  }
}

支持的 API

目前 mapbox_api 主要支持以下几类 API:

  • Navigation(导航):包括 Directions、Isochrone、Map Matching、Matrix 和 Optimization。
  • Search(搜索):包括 Forward Geocoding、Reverse Geocoding 和 Intersection。

其他 API 如 Maps、Accounts 等尚未实现。

相关包

  • flutter-mapbox-gl:用于在 Flutter 中显示 Mapbox 地图。
  • polyline:用于将 polyline 字符串转换为坐标。

通过结合这些包,你可以在 Flutter 应用中实现更丰富的地图功能。

完整示例

完整的示例代码可以在 GitHub 仓库 中找到。其中包括了更多详细的用法和场景。

希望这篇指南能帮助你在 Flutter 项目中成功集成和使用 mapbox_api 插件!如果有任何问题或需要进一步的帮助,请随时查阅官方文档或社区资源。


更多关于Flutter地图服务插件mapbox_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图服务插件mapbox_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用mapbox_api插件的示例代码。这个示例将展示如何集成Mapbox,并在地图上显示一个简单的标记(Marker)。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加mapbox_gl依赖。请注意,mapbox_api通常指的是Mapbox的各种API服务,而mapbox_gl是Flutter中用于显示Mapbox地图的插件。

dependencies:
  flutter:
    sdk: flutter
  mapbox_gl: ^0.14.0  # 请检查最新版本号

2. 获取Mapbox访问令牌

在继续之前,你需要从Mapbox官网(https://www.mapbox.com/)注册并获取一个访问令牌(Access Token)。

3. 配置Android和iOS项目

Android

android/app/src/main/AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

然后,在android/app/build.gradle文件中添加以下配置:

android {
    ...
    defaultConfig {
        ...
        manifestPlaceholders = [
            'MAPBOX_ACCESS_TOKEN':'"YOUR_MAPBOX_ACCESS_TOKEN_HERE"' // 替换为你的Mapbox访问令牌
        ]
    }
}

iOS

ios/Runner/Info.plist中添加以下键和值:

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to show you on the map</string>
<key>io.flutter.embedded_views_preview</key>
<true/>

然后,在ios/Runner/AppDelegate.swift中添加以下代码以配置Mapbox访问令牌:

import UIKit
import Flutter
import mapbox_gl

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    // 配置Mapbox访问令牌
    let accessToken = "YOUR_MAPBOX_ACCESS_TOKEN_HERE" // 替换为你的Mapbox访问令牌
    MGLMapboxAccessToken = accessToken
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

4. 编写Flutter代码

在你的Flutter项目中,创建一个新的Dart文件(例如main.dart),并添加以下代码以显示Mapbox地图并添加一个标记:

import 'package:flutter/material.dart';
import 'package:mapbox_gl/mapbox_gl.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapboxScreen(),
    );
  }
}

class MapboxScreen extends StatefulWidget {
  @override
  _MapboxScreenState createState() => _MapboxScreenState();
}

class _MapboxScreenState extends State<MapboxScreen> {
  MapboxMapController? mapController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Mapbox Demo'),
      ),
      body: MapboxMap(
        accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN_HERE', // 替换为你的Mapbox访问令牌
        styleString: MapboxStyles.STREETS,
        initialCameraPosition: CameraPosition(
          target: LatLng(37.7749, -122.4194), // 初始位置,例如旧金山
          zoom: 13.0,
        ),
        onMapCreated: (MapboxMapController controller) {
          mapController = controller;
          _addMarker();
        },
      ),
    );
  }

  void _addMarker() {
    if (mapController != null) {
      mapController!.addMarker(
        MarkerOptions()
          ..position(LatLng(37.7749, -122.4194)) // 标记位置
          ..icon(BitmapDescriptor.defaultMarker),
      );
    }
  }
}

5. 运行应用

现在,你可以运行你的Flutter应用,并应该能够在地图上看到旧金山的视图以及一个标记。

确保你已经替换了所有的YOUR_MAPBOX_ACCESS_TOKEN_HERE为你的实际Mapbox访问令牌。如果你遇到任何问题,请检查Mapbox的官方文档以获取更多信息和帮助。

回到顶部