Flutter地图瓦片插件mbtiles的使用

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

Flutter地图瓦片插件mbtiles的使用

mbtiles

Mapbox MBTiles v1.3 文件,支持矢量和栅格瓦片。

  • 支持的栅格瓦片:jpgpngwebp
  • 支持的矢量瓦片:pbf
  • Web 不支持,因为它缺少对 SQLite 的支持。

Getting started

pubspec.yaml

dependencies:
  # this package:
  mbtiles: ^0.4.0
  # coordinates will be returned as `LatLng`, include the following package 
  # if you want to work with them.
  latlong2: ^0.9.0
  # sqlite libraries (in case not otherwise bundled)
  sqlite3_flutter_libs: ^0.5.18

Usage

这个包设计时没有依赖于 Flutter,因此可以在 Dart 程序中使用。如果你想要在 Flutter 应用中使用它,请参考 Flutter 指令,如果你想在纯 Dart 中使用它,请参考 Dart-only 指令

Flutter

  1. 如果你不提供 sqlite3 库,则需要添加 sqlite3_flutter_libs 包作为依赖。
  2. 打开你的 .mbtiles 文件。
    • 建议将 mbtiles 文件存储在由 path_provider 提供的目录之一中。
    • 如果你想从内部设备存储或 SD 卡打开文件,你需要先请求权限!你可以使用 permission_handler 来请求所需的用户权限。
    • 注意:mbtiles 文件不能放在 Flutter 资源中!请先将其复制到文件系统中。

示例代码

import 'package:mbtiles/mbtiles.dart';
import 'package:path_provider/path_provider.dart';

Future<void> main() async {
  // 获取应用文档目录路径
  final appDocDir = await getApplicationDocumentsDirectory();
  final mbtilesPath = '${appDocDir.path}/your-mbtiles-file.mbtiles';

  // 打开 mbtiles 文件为只读
  final mbtiles = MBTiles(mbtilesPath: mbtilesPath);

  // 获取元数据
  final metadata = await mbtiles.getMetadata();
  print('Metadata: $metadata');

  // 获取瓦片数据
  final tile = await mbtiles.getTile(z: 0, x: 0, y: 0);
  if (tile != null) {
    print('Tile size: ${tile.length}');
  } else {
    print('Tile not found');
  }

  // 关闭 mbtiles 文件
  await mbtiles.dispose();
}

Dart-only

  1. 打开 mbtiles 数据库。
    • 你需要为 Dart 程序提供平台特定的 sqlite3 库。
    • 可以在 www.sqlite.org 上获取构建版本。

示例代码

import 'package:mbtiles/mbtiles.dart';

void main() {
  // 根据操作系统选择 sqlite3 路径
  final sqlitePath = switch (Platform.operatingSystem) {
    'windows' => r'assets\windows\sqlite3.dll',
    'macos' => 'assets/macos/sqlite3',
    'linux' => 'assets/linux/sqlite3',
    String() => throw Exception(
        'The example program is dart-only and running it on flutter is '
        'not supported.\n'
        'If you want to use this package in a flutter app, head over to '
        'the package documentation!',
      ),
  };

  // 打开 mbtiles 文件
  final mbtiles = MBTiles(
    mbtilesPath: 'assets/mbtiles/countries-raster.mbtiles',
    sqlitePath: sqlitePath,
  );

  // 获取元数据
  final metadata = mbtiles.getMetadata();
  print('Metadata: $metadata');

  // 获取瓦片数据
  final tile = mbtiles.getTile(z: 0, x: 0, y: 0);
  if (tile != null) {
    print('Tile size: ${formatSize(tile.length)}');
  } else {
    print('Tile not found');
  }

  // 关闭 mbtiles 文件
  mbtiles.dispose();
}

/// 返回格式化的字节大小字符串
String formatSize(int amountBytes, {int decimals = 0}) {
  const suffixes = ["b", "kb", "mb", "gb", "tb"];
  if (amountBytes == 0) return '0${suffixes[0]}';
  final i = (log(amountBytes) / log(1024)).floor();
  return ((amountBytes / pow(1024, i)).toStringAsFixed(decimals)) + suffixes[i];
}

Additional information

通过上述步骤和示例代码,你应该能够在 Flutter 或纯 Dart 环境中成功使用 mbtiles 插件来处理地图瓦片文件。


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

1 回复

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


在Flutter中,使用mbtiles格式的地图瓦片文件可以通过flutter_mapflutter_mbtiles这两个插件来实现。以下是一个基本的代码示例,展示如何在Flutter应用中加载和使用mbtiles地图瓦片。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^10.2.0  # 确保使用最新版本
  flutter_mbtiles: ^0.10.0  # 确保使用最新版本

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

接下来,是主应用程序的代码示例:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_mbtiles/flutter_mbtiles.dart';
import 'package:latlong2/latlong.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Map with MBTiles'),
        ),
        body: MapScreen(),
      ),
    );
  }
}

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

class _MapScreenState extends State<MapScreen> {
  late MBTilesPlugin _mbtilesPlugin;

  @override
  void initState() {
    super.initState();
    // 初始化 MBTiles 插件,并提供 mbtiles 文件的路径
    _mbtilesPlugin = MBTilesPlugin(
      dbPath: 'assets/your_map.mbtiles',  // 请确保 mbtiles 文件在 assets 目录下
    );
    _mbtilesPlugin.openDatabase().then((_) {
      // 数据库打开成功后,可以在这里执行其他操作
    }).catchError((error) {
      // 处理错误
      print('Error opening MBTiles database: $error');
    });
  }

  @override
  Widget build(BuildContext context) {
    return FlutterMap(
      options: MapOptions(
        center: LatLng(0.0, 0.0),  // 设置地图中心
        zoom: 5.0,
      ),
      layers: [
        TileLayerOptions(
          tileProvider: MBTilesTileProvider(
            plugin: _mbtilesPlugin,
            zoomLevels: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
          ),
        ),
      ],
    );
  }
}

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

  1. 添加依赖:在pubspec.yaml文件中添加了flutter_mapflutter_mbtiles两个依赖。
  2. 初始化插件:在MapScreeninitState方法中,初始化了MBTilesPlugin并指定了mbtiles文件的路径。
  3. 加载地图:在FlutterMapTileLayerOptions中,使用了MBTilesTileProvider来提供地图瓦片。

请注意,你需要将你的mbtiles文件放在assets目录下,并在pubspec.yaml中声明它:

flutter:
  assets:
    - assets/your_map.mbtiles

此外,请确保你的mbtiles文件是有效的,并且包含了你希望展示的地图数据。

这个示例展示了如何在Flutter应用中加载和使用mbtiles格式的地图瓦片。你可以根据需要进一步自定义和扩展这个示例。

回到顶部