重要说明
- 本打算基于 Flutter 做一个使用离线地图的简单应用,但下载的离线地图在 Flutter 下使用测试并未成功。
- Mapbox 下载工具下载的的离线地图瓦片数量有限制:6000 个。
- 本文仅记录编译 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文件在地图创建前加载了,但是地图没有加载到数据,最近实在有点儿忙,就不研究问题出在哪里了。
参考
- https://linuxize.com/post/how-to-install-gcc-compiler-on-centos-7/
- https://galaxydata.ru/community/updating-cmake-from-2-8-11-to-3-6-2-or-newer-version-on-centos-linux-682
- https://stackoverflow.com/questions/34143265/undefined-reference-to-symbol-pthread-createglibc-2-2-5