Flutter地图导航插件mappls_direction_plugin的使用

Flutter地图导航插件mappls_direction_plugin的使用

简介

mappls_direction_plugin 是一个用于在 Flutter 应用中展示路线的地图导航组件。它支持多种功能,包括地点搜索、车辆类型选择等。

功能

  • 支持 Mappls 地点搜索,用于搜索起点、终点和途经点。
  • 可以使用数字地址(分号分隔)、Mappls 地图标记或 WGS 84 经纬度坐标。
  • 可以设置车辆类型,如驾车、步行和骑行。
  • 轻松设置交通信息和预计到达时间资源。

开始使用

添加依赖

首先,在 pubspec.yaml 文件中添加 mappls_direction_plugin 依赖:

dependencies:
  mappls_direction_plugin: ^1.0.0

然后在 Dart 代码中导入该包:

import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';

添加 Mappls 密钥

必须通过 MapplsAccountManager 类提供您的密钥。

MapplsAccountManager.setMapSDKKey("YOUR_MAP_SDK_KEY");
MapplsAccountManager.setRestAPIKey("YOUR_REST_API_KEY");
MapplsAccountManager.setAtlasClientId("YOUR_ATLAS_CLIENT_ID");
MapplsAccountManager.setAtlasClientSecret("YOUR_ATLAS_CLIENT_SECRET");

使用 Direction Widget

打开 Direction Widget

使用 openDirectionWidget 方法打开 Direction Widget:

DirectionCallback directionCallback;

try {
  directionCallback = await openDirectionWidget(directionOptions: options);
} on PlatformException {
  directionCallback = DirectionCallback(null, null);
}

设置 Direction Options

可以使用 DirectionOptions 来设置组件的属性:

DirectionOptions options = DirectionOptions(
  showStartNavigation: true, // 是否显示开始导航按钮
  showAlternative: true, // 是否显示替代路线
  steps: true, // 是否返回每个路线段的步骤
  resource: DirectionsCriteria.RESOURCE_ROUTE, // 资源类型
  profile: DirectionsCriteria.PROFILE_DRIVING, // 车辆类型
  overview: DirectionsCriteria.OVERVIEW_FULL, // 概览类型
  excludes: [DirectionsCriteria.EXCLUDE_TOLL], // 避免的道路类型
  searchPlaceOption: PlaceOptions(), // 搜索选项
  destination: DirectionPoint(location: LatLng(28.5355, 77.3910)), // 目的地
);

完整示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 mappls_direction_plugin 插件:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mappls_direction_plugin_example/DirectionSettings.dart';
import 'package:mappls_direction_plugin_example/settingWidget.dart';
import 'package:mappls_gl/mappls_gl.dart';
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';

void main() {
  runApp(MaterialApp(
    home: MyApp(),
    routes: <String, WidgetBuilder>{
      'SettingWidget': (BuildContext context) => SettingWidget(),
    },
  ));
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  static const String MAP_SDK_KEY = "YOUR_MAP_SDK_KEY";
  static const String REST_API_KEY = "YOUR_REST_API_KEY";
  static const String ATLAS_CLIENT_ID = "YOUR_ATLAS_CLIENT_ID";
  static const String ATLAS_CLIENT_SECRET = "YOUR_ATLAS_CLIENT_SECRET";

  DirectionCallback _directionCallback = DirectionCallback(null, null);

  [@override](/user/override)
  void initState() {
    super.initState();
    MapplsAccountManager.setMapSDKKey(MAP_SDK_KEY);
    MapplsAccountManager.setRestAPIKey(REST_API_KEY);
    MapplsAccountManager.setAtlasClientId(ATLAS_CLIENT_ID);
    MapplsAccountManager.setAtlasClientSecret(ATLAS_CLIENT_SECRET);
  }

  Future<void> openMapplsDirectionWidget() async {
    DirectionCallback directionCallback;
    DirectionSettings settings = DirectionSettings();
    PlaceOptions placeOptions = PlaceOptions(
      tokenizeAddress: settings.tokenizeAddress,
      saveHistory: settings.saveHistory,
      historyCount: settings.historyCount != null ? int.parse(settings.historyCount!) : null,
      backgroundColor: settings.backgroundColor,
      toolbarColor: settings.toolbarColor,
      toolbarTintColor: settings.toolbarTintColor,
      zoom: settings.zoom != null ? double.parse(settings.zoom!) : null,
      location: settings.longitude != null && settings.latitude != null
          ? LatLng(double.parse(settings.latitude!), double.parse(settings.longitude!))
          : null,
      filter: settings.filter != null ? settings.filter : null,
    );

    DirectionOptions options = DirectionOptions(
      showStartNavigation: settings.showStartNavigation,
      showAlternative: settings.showAlternative,
      steps: settings.showSteps,
      resource: settings.resource,
      profile: settings.profile,
      overview: settings.overView,
      excludes: settings.excludes.length == 0 ? null : settings.excludes,
      searchPlaceOption: placeOptions,
      destination: settings.mapplsPin != null
          ? DirectionPoint(settings.placeName!, settings.placeAddress!, mapplsPin: settings.mapplsPin)
          : settings.dLng != null && settings.dLat != null
              ? DirectionPoint(settings.placeName!, settings.placeAddress!, location: LatLng(double.parse(settings.dLat!), double.parse(settings.dLng!)))
              : null,
    );

    try {
      directionCallback = await openDirectionWidget(directionOptions: options);
    } on PlatformException {
      directionCallback = DirectionCallback(null, null);
    }
    print(json.encode(directionCallback.directionResponse?.toMap()));

    if (!mounted) return;

    setState(() {
      _directionCallback = directionCallback;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Direction Example'),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.settings, color: Colors.white),
              onPressed: () {
                Navigator.pushNamed(context, 'SettingWidget');
              },
            )
          ],
        ),
        body: Center(
          child: Column(children: [
            SizedBox(height: 20),
            Text(_directionCallback.selectedIndex == null
                ? 'Selected Index: '
                : 'Selected Index: ${_directionCallback.selectedIndex}'),
            SizedBox(height: 20),
            Text(_directionCallback.directionResponse?.waypoints == null
                ? 'Distance: '
                : 'Distance: ${_directionCallback.directionResponse?.routes?[0].distance}'),
            SizedBox(height: 20),
            Text(_directionCallback.directionResponse?.waypoints == null
                ? 'Duration: '
                : 'Duration: ${_directionCallback.directionResponse?.routes?[0].duration}'),
            SizedBox(height: 20),
            TextButton(
              child: Text('Open Direction Widget'),
              onPressed: () => openMapplsDirectionWidget(),
            ),
          ]),
        ),
      ),
    );
  }
}
1 回复

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


mappls_direction_plugin 是一个用于 Flutter 的插件,它允许开发者在应用程序中集成 MapmyIndia 的导航和方向服务。这个插件可以帮助你在地图上显示路线、计算距离和预计到达时间(ETA),以及提供导航指引。

以下是如何在 Flutter 项目中使用 mappls_direction_plugin 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mappls_direction_plugin: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在使用插件之前,你需要进行初始化。通常,你可以在 main.dart 文件中进行初始化:

import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 MapmyIndia 方向插件
  await MapplsDirectionPlugin.initialize('YOUR_MAPMYINDIA_API_KEY');
  
  runApp(MyApp());
}

请确保将 YOUR_MAPMYINDIA_API_KEY 替换为你在 MapmyIndia 开发者平台上获取的有效 API 密钥。

3. 使用插件进行导航

你可以使用 MapplsDirectionPlugin 来获取路线、距离和 ETA。以下是一个简单的示例,展示如何获取两点之间的路线:

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

class NavigationScreen extends StatefulWidget {
  @override
  _NavigationScreenState createState() => _NavigationScreenState();
}

class _NavigationScreenState extends State<NavigationScreen> {
  String _routeInfo = '';

  Future<void> _getRoute() async {
    try {
      // 定义起点和终点坐标
      LatLng origin = LatLng(28.6129, 77.2295); // 例如:德里
      LatLng destination = LatLng(28.4843, 77.0677); // 例如:古尔冈

      // 获取路线信息
      DirectionResponse response = await MapplsDirectionPlugin.getRoute(origin, destination);

      // 显示路线信息
      setState(() {
        _routeInfo = 'Distance: ${response.distance} km\nETA: ${response.duration}';
      });
    } catch (e) {
      setState(() {
        _routeInfo = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MapmyIndia Navigation'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _getRoute,
              child: Text('Get Route'),
            ),
            SizedBox(height: 20),
            Text(_routeInfo),
          ],
        ),
      ),
    );
  }
}

4. 显示地图和路线

如果你想要在地图上显示路线,你可以使用 mappls_map_plugin 来显示地图,并将 mappls_direction_plugin 获取的路线数据传递给地图插件进行渲染。

import 'package:flutter/material.dart';
import 'package:mappls_map_plugin/mappls_map_plugin.dart';
import 'package:mappls_direction_plugin/mappls_direction_plugin.dart';

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  MapplsMapController? _mapController;

  Future<void> _showRouteOnMap() async {
    LatLng origin = LatLng(28.6129, 77.2295); // 例如:德里
    LatLng destination = LatLng(28.4843, 77.0677); // 例如:古尔冈

    DirectionResponse response = await MapplsDirectionPlugin.getRoute(origin, destination);

    _mapController?.addPolyline(PolylineOptions(
      geometry: response.geometry,
      polylineColor: Colors.blue,
      polylineWidth: 5,
    ));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map with Route'),
      ),
      body: MapplsMap(
        onMapCreated: (controller) {
          _mapController = controller;
        },
        initialCameraPosition: CameraPosition(
          target: LatLng(28.6129, 77.2295),  // 初始地图中心
          zoom: 12,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _showRouteOnMap,
        child: Icon(Icons.directions),
      ),
    );
  }
}

5. 处理导航

mappls_direction_plugin 还可以用于启动导航。你可以使用 startNavigation 方法来启动导航:

await MapplsDirectionPlugin.startNavigation(origin, destination);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!