记录 Mapbox 离线地图下载工具 mbgl-offline 的编译

Published: 2020-09-13

Tags: Flutter

本文总阅读量

重要说明

  1. 本打算基于 Flutter 做一个使用离线地图的简单应用,但下载的离线地图在 Flutter 下使用测试并未成功
  2. Mapbox 下载工具下载的的离线地图瓦片数量有限制:6000 个。
  3. 本文仅记录编译 mapbox-gl-native 及下载地图数据库编译步骤,可能有一定参考作用。

下载离线地图

下载 mapbox 的离线地图需要使用 mapbox-gl-native 提供的工具:mbgl-offline

编译 mapbox-gl-native

我用于编译的系统是 Centos 7.3,在 Ubuntu 18.04 下也编译来着,基本一致,后来遇到报错,应该也是 GCC 工具链版本的原因,因为用 Centos 编译成功了就没在 Ubuntu 下再测试。

准备编译环境

# 更细系统安装编译工具集
$ yum update
$ yum groupinstall "Development Tools"

# 添加 epel 源
$ yum -y install epel-release

# 安装必要依赖
$ yum install libcurl-devel \
              libjpeg-turbo-devel \
              freeglut-devel \
              libpng-devel \
              glfw-devel \
              libuv-devel

# 如果系统已经安装有旧版本的 cmake 需要先移除
$ yum remove cmake -y

# 安装 cmake 
$ wget https://github.com/Kitware/CMake/releases/download/v3.18.2/cmake-3.18.2.tar.gz
$ tar -zxvf cmake-3.18.2.tar.gz
$ cd cmake-3.18.2
$ ./bootstrap --prefix=/usr/local
$ make 
$ make install

# 编辑 ~/.bash_profile 文件
# 将 
PATH=$PATH:$HOME/bin
# 修改为
PATH=/usr/local/bin:$PATH:$HOME/bin

# 查看 cmake 版本
$ cmake --version

# 升级 GCC 版本(当前系统 GCC 版本5.x,经测试使用8.x版本能够成功编译,7.x版本报错)
$ yum install centos-release-scl  # 安装 scl 工具
$ yum install devtoolset-8        # 安装 8 版本工具链
$ scl enable devtoolset-8 bash    # 启用
$ yum install libstdc++-static

# 查看 GCC 版本
$ gcc --version

下载项目并编译

# 下载项目
$ git clone https://github.com/mapbox/mapbox-gl-native.git
# 更新子模块
$ git submodule update --init --recursive
# 准备编译环境
$ cmake . -B build
# 编译
$ cmake --build build

我在编译过程中遇到一个错误:

ld: libmbgl-core.a(thread.cpp.o): undefined reference to symbol 'pthread_setname_np@@GLIBC_2.12'

解决办法:

修改 build 文件夹下的 CMakeCache.txt 文件

将其中的 CMAKE_CXX_FLAGS:STRING= 修改为 CMAKE_CXX_FLAGS:STRING=-pthread

重新编译,编译完成后,build 文件夹下的 bin 目录下会看到 mbgl-offline 工具。

申请 mapbox 的 token

访问:https://www.mapbox.com/ 注册后即可看到 token

下载离线地图数据

$ ./mbgl-offline \
      --north 45.3822 \
      --west 130.5740 \
      --south 45.2687 \
      --east 131.3869 \
      --minZoom 12 \
      --maxZoom 14 \
      --style mapbox://styles/mapbox/streets-v11 \
      --token 'your token' \
      --output mapcache.db

(下载速度尚可,截图是最开始的执行命令,超过 6000 瓦片下载时报错了,所以要么减小区域,要么减少地图层级)

集成离线地图(可能不具有参考性)

创建 Flutter 应用

$ flutter create -a java offline-map-demo

引入依赖包

dependencies:
    mapbox_gl: ^0.8.0

引入地图数据

在项目目录创建 assets 文件夹,将下载到的 mapcache.db 文件重命名为 cache.db 放在文件夹下,然后配置文件中声明资源

assets:
    - assets/cache.db

修改最小支持版本

配置位置:android / app / build.gradle

defaultConfig {
        minSdkVersion 20
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
}

代码可以参考:https://medium.com/@jamesayvaz/offline-maps-for-your-flutter-app-3ea64111b73c

以及 mapbox_gl(https://pub.dev/packages/mapbox_gl) 的示例:

  • Install Flutter and validate its installation with flutter doctor
  • Clone the repository with git clone git@github.com:tobrun/flutter-mapbox-gl.git
  • Add a Mapbox access token to the example app (see next section)
  • Connect a mobile device or start an emulator, simulator or chrome
  • Locate the id of a the device with flutter devices
  • Run the app with cd flutter_mapbox/example && flutter packages get && flutter run -d {device_id}

在线的 Mapbox,还是很好用的

Mapbox 提供的 API 一般情况下也够用,不过遗憾的是我想用它的离线地图,根据教程db文件在地图创建前加载了,但是地图没有加载到数据,最近实在有点儿忙,就不研究问题出在哪里了。

参考

  1. https://linuxize.com/post/how-to-install-gcc-compiler-on-centos-7/
  2. https://galaxydata.ru/community/updating-cmake-from-2-8-11-to-3-6-2-or-newer-version-on-centos-linux-682
  3. https://stackoverflow.com/questions/34143265/undefined-reference-to-symbol-pthread-createglibc-2-2-5