Flutter地图展示插件mapsm_lv的使用
Flutter地图展示插件mapsm_lv的使用
引言
此Flutter插件允许在Flutter小部件中嵌入交互式且可自定义的矢量地图。对于Android和iOS集成,我们使用了mapbox-gl-native。对于Web,我们依赖于mapbox-gl-js。此项目仅支持这些库所暴露API的一个子集。
![screenshot.png]
设置
该包可以在pub.dev上找到。
通过运行以下命令获取它:
flutter pub add mapsm_lv
移动端
秘密Mapbox访问令牌
一个具有Downloads: Read
范围的秘密访问令牌是必要的,以便底层Mapbox SDK能够下载。
有关设置的信息,请参阅Mapbox文档:
如果没有正确配置的令牌存在,则构建过程会失败,并出现以下错误(分别针对Android和iOS):
* What went wrong:
A problem occurred evaluating project ':mapsm_lv'.
> SDK Registry token is null. See README.md for more information.
[!] Error installing Mapbox-iOS-SDK
curl: (22) The requested URL returned error: 401 Unauthorized
Web
在<head>
标签中包含JavaScript和CSS文件到您的index.html
文件中:
<script src='https://api.mapsm.net/files/sdk/v34/smmapv35.js'></script>
<link href='https://api.mapsm.net/files/sdk/v34/smmapv34.css' rel='stylesheet' />
注意:请在Mapbox GL JS文档中查找最新版本。
所有平台
公共Mapbox访问令牌
一个公共访问令牌必须提供给MapboxMap小部件以检索样式和资源。虽然可以直接将其硬编码到源文件中,但建议从外部来源(例如配置文件或环境变量)获取访问令牌。示例应用程序使用以下技术:
通过命令行参数传递访问令牌,当构建时:
flutter build <platform> --dart-define ACCESS_TOKEN=YOUR_TOKEN_HERE
或者运行应用程序时:
flutter run --dart-define ACCESS_TOKEN=YOUR_TOKEN_HERE
然后在Dart中检索它:
MapboxMap(
...
accessToken: const String.fromEnvironment("ACCESS_TOKEN"),
...
)
支持的API
功能 | Android | iOS | Web |
---|---|---|---|
样式 | ✅ | ✅ | ✅ |
摄像机 | ✅ | ✅ | ✅ |
手势 | ✅ | ✅ | ✅ |
用户位置 | ✅ | ✅ | ✅ |
样式DSL | ❌ | ❌ | ❌ |
栅格图层 | ✅ | ✅ | ✅ |
符号图层 | ✅ | ✅ | ✅ |
圆形图层 | ✅ | ✅ | ✅ |
线图层 | ✅ | ✅ | ✅ |
填充图层 | ✅ | ✅ | ✅ |
高光图层 | ✅ | ✅ | ✅ |
热图图层 | ❌ | ❌ | ❌ |
向量源 | ✅ | ✅ | ✅ |
栅格源 | ✅ | ✅ | ✅ |
GeoJSON源 | ✅ | ✅ | ✅ |
图像源 | ✅ | ✅ | ✅ |
表达式 | ✅ | ✅ | ✅ |
符号注释 | ✅ | ✅ | ✅ |
圆形注释 | ✅ | ✅ | ✅ |
线注释 | ✅ | ✅ | ✅ |
填充注释 | ✅ | ✅ | ✅ |
地图样式
可以通过在MapOptions
中设置styleString
来提供地图样式。支持以下格式:
- 传递地图样式的URL。这可以是一个内置的地图样式,也可以参考
MapboxStyles
,或者通过URL开始为http(s)://
或mapbox://
远程提供的自定义地图样式。 - 将样式作为本地资产传递。在
assets
目录中创建一个JSON文件,并在pubspec.yml
中添加引用。将样式字符串设置为此资产的相对路径,以便加载到地图中。 - 将样式作为本地文件传递。在应用程序目录(例如
ApplicationDocumentsDirectory
)中创建一个JSON文件。将样式字符串设置为此JSON文件的绝对路径。 - 传递地图样式的原始JSON。这仅在Android上受支持。
离线侧加载
通过侧加载所需的地图瓦片并将其包含在assets
文件夹中,支持离线地图。
- 按照这里提供的指南创建您的瓦片包。
- 将第一步生成的
tiles.db
文件放在您的assets
目录中,并在pubspec.yml
文件中添加对其的引用。
assets:
- assets/cache.db
- 在应用程序启动时调用
installOfflineMapTiles
以将您的瓦片复制到Mapbox可以访问的位置。注意:此方法应在Map小部件加载之前调用,以防止在复制文件时发生冲突。
try {
await installOfflineMapTiles(join("assets", "cache.db"));
} catch (err) {
print(err);
}
下载离线区域
离线区域是地图中定义的一个区域,在有限或无网络连接的情况下可用。使用适当的SDK方法从Mapbox下载选定区域、样式和精度的瓦片,并存储在应用程序的缓存中。
- 注意选择较大的区域,因为大小可能显著。可以使用在线估算器https://docs.mapbox.com/playground/offline-estimator/。
- 使用预定义的
OfflineRegion
调用downloadOfflineRegionStream
,并在回调函数中可选地跟踪进度。
final Function(DownloadRegionStatus event) onEvent = (DownloadRegionStatus status) {
if (status.runtimeType == Success) {
// ...
} else if (status.runtimeType == InProgress) {
int progress = (status as InProgress).progress.round();
// ...
} else if (status.runtimeType == Error) {
// ...
}
};
final OfflineRegion offlineRegion = OfflineRegion(
bounds: LatLngBounds(
northeast: LatLng(52.5050648, 13.3915634),
southwest: LatLng(52.4943073, 13.4055383),
),
id: 1,
minZoom: 6,
maxZoom: 18,
mapStyleUrl: 'mapbox://styles/mapbox/streets-v11',
);
downloadOfflineRegionStream(offlineRegion, onEvent);
定位功能
Android
在AndroidManifest.xml
中添加<uses-permission>
以启用定位功能:
<manifest ...
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
从Android API级别23开始,还需要在运行时请求权限。此插件不会为您处理此问题。示例应用程序使用了flutter
的location
插件来实现这一点。
iOS
在Info.plist
中添加以下键以解释为什么需要访问用户的位置数据:
<key>NSLocationWhenInUseUsageDescription</key>
<string>[Your explanation here]</string>
推荐的解释是:“在地图上显示您的位置并帮助改进地图。”
运行示例代码
请参考文档了解如何运行示例代码。
贡献
我们欢迎对本仓库的贡献!如果您有兴趣帮助构建此Mapbox-Flutter集成,请阅读贡献指南以了解如何开始。
示例代码
以下是完整的示例代码,展示了如何使用mapsm_lv
插件在Flutter中展示地图。
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mapsm_lv/mapsm/map/pages/map_page.dart';
import 'package:mapsm_lv/mapsm/util/bloc_observer.dart';
import 'package:http/http.dart' as http;
import 'package:mapsm_lv_platform_interface/mapsm_lv_platform_interface.dart';
void main() async {
BlocOverrides.runZoned(
() => runApp(const MapsDemo()),
blocObserver: AppBlocObserver(),
);
}
const MaterialColor primaryColorShades = MaterialColor(
0xFF181861,
<int, Color>{
50: Color(0xFFA4A4BF),
100: Color(0xFFA4A4BF),
200: Color(0xFFA4A4BF),
300: Color(0xFF9191B3),
400: Color(0xFF7F7FA6),
500: Color(0xFF181861),
600: Color(0xFF6D6D99),
700: Color(0xFF5B5B8D),
800: Color(0xFF494980),
900: Color(0xFF181861),
},
);
class MapsDemo extends StatelessWidget {
static const String ACCESS_TOKEN = String.fromEnvironment("ACCESS_TOKEN");
const MapsDemo({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
List<LatLng> rPoints = [];
rPoints.add(LatLng(21.0085698, 105.7300834));
rPoints.add(LatLng(21.007515599999998, 105.8075224));
rPoints.add(LatLng(21.0008976, 105.80317009999999));
return MaterialApp(
title: 'MB SmartMap',
theme: ThemeData(
primarySwatch: primaryColorShades,
),
home: MapPage(
rPoints: rPoints,
),
);
}
}
更多关于Flutter地图展示插件mapsm_lv的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图展示插件mapsm_lv的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
mapsm_lv
是 Flutter 中的一个地图展示插件,它允许开发者在应用中集成地图功能。以下是如何使用 mapsm_lv
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 mapsm_lv
插件的依赖。
dependencies:
flutter:
sdk: flutter
mapsm_lv: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 mapsm_lv
插件。
import 'package:mapsm_lv/mapsm_lv.dart';
3. 使用地图组件
在你的 Flutter 应用中使用 MapSmLv
组件来展示地图。
class MapScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map Example'),
),
body: MapSmLv(
initialCameraPosition: CameraPosition(
target: LatLng(37.7749, -122.4194), // 初始位置,例如旧金山
zoom: 12.0, // 初始缩放级别
),
onMapCreated: (controller) {
// 地图创建后的回调
// 你可以保存 controller 以便后续操作
},
),
);
}
}
4. 运行应用
现在你可以运行你的 Flutter 应用,并在应用中看到地图展示。
5. 其他功能
mapsm_lv
插件可能还提供了其他功能,例如添加标记、绘制路线、监听地图事件等。你可以参考插件的官方文档来了解更多详细用法。
示例代码
以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 mapsm_lv
插件:
import 'package:flutter/material.dart';
import 'package:mapsm_lv/mapsm_lv.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Map Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MapScreen(),
);
}
}
class MapScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map Example'),
),
body: MapSmLv(
initialCameraPosition: CameraPosition(
target: LatLng(37.7749, -122.4194), // 初始位置,例如旧金山
zoom: 12.0, // 初始缩放级别
),
onMapCreated: (controller) {
// 地图创建后的回调
// 你可以保存 controller 以便后续操作
},
),
);
}
}