flutter mapbox_gl及flutter_map使用

919 阅读4分钟

1、项目背景由于高德地图、百度地图、腾讯地图必须商用授权才可以使用,收费标准都是5w/年。这里是否被商用被理解的很模糊,首先他们都有一定的量是免费的,难道只要是公司开发者就是商用?这点不得而知……

2、开始调研开源的组件,因为是flutter项目出去高德、百度自身的插件还是挺少的。谷歌谷歌地图由于被qiang和收费暂时没有考虑

3、开始是想使用flutter_map,无奈还是fq原因,某些瓦片无法使用,可以使用的就比较丑比如觉得是瞬间回到上个世纪的产物。

flutter_map 插件依赖leafletjs 具体文档可以查看flutter_map

可以把flutter_map理解为一个容器可以添加自定义的瓦片,比如mapbox、openStreetMap等,这里就开始讲重点了,mapbox的代码实现如下。注意additionalOptions、urlTemplate

 FlutterMap(
                options: MapOptions(
                  center: LatLng(39.904989, 116.405285),
                  minZoom: 10.0,
                ),
                nonRotatedChildren: [
                  AttributionWidget.defaultWidget(
                    source: 'OpenStreetMap contributors',
                    onSourceTapped: () {},
                  ),
                ],
                children: [
                  TileLayer(
                    additionalOptions: {
                      'accessToken':
                          '公钥',
                      'id':
                          'mapbox://styles/username/地图id',
                    },
                    urlTemplate:
                        "https://api.mapbox.com/styles/v1/wellsodo/cli9owtp001fw01pjakmo757i/tiles/{z}/{x}/{y}@2x?access_token=公钥",
                    //瓦片地图的URL
                    subdomains: ['a', 'b', 'c'],
                  ),
                  MarkerLayer(markers: markers),
                ],
              )

4、Mapx是什么? Mapbox 提供了一些免费的瓦片地址链接,可以用于开发和测试目的。以下是其中一些链接: 地图样式: api.mapbox.com/styles/v1/{… 地图标签: api.mapbox.com/v4/{map_id}… 地图卫星图: api.mapbox.com/v4/{map_id}… 需要替换的变量有: {username}: Mapbox 账户的用户名 {style_id}: 地图样式的 ID {tilesize}: 瓦片的大小,通常为 256 {z}: 瓦片的缩放级别 {x}: 瓦片的 x 坐标 {y}: 瓦片的 y 坐标 {access_token}: Mapbox 访问令牌 mapbox收费参考 5、首先注册mapbox注册,这里需要提供visa卡

注册完就可以创建自己私有的token了,secret scopes 务必勾选 Downloads:read ,否则访问的时候会提示鉴权失败。 在这里插入图片描述 这样就生成了私钥,一定要复制出来粘贴到一个地方,只被允许一次复制!!!,注意公私钥的区别,开头分别是pk、sk

TileLayer(
                    additionalOptions: {
                      'accessToken':
                          '公钥',
                      'id':
                          'mapbox://styles/username/地图id',
                    },
                    urlTemplate:
                        "https://api.mapbox.com/styles/v1/wellsodo/cli9owtp001fw01pjakmo757i/tiles/{z}/{x}/{y}@2x?access_token=公钥",
                    //瓦片地图的URL
                    subdomains: ['a', 'b', 'c'],
                  ),
                  MarkerLayer(markers: markers),
                ],

怎么使用呢?还需要地图id是什么? 在这里插入图片描述 mapbox强大之处还支持自己创建喜欢的风格

在这里插入图片描述

在这里插入图片描述

创建完这里就显示了,右侧有个分享按钮。

是不是还是挺好看的 在这里插入图片描述地图id就是xxx.html?的xxx。urlTemplate的username一定要是自己注册的名字accessToken也就是公钥pk开头的那个 链接写错的话会报404、401、或者鉴权错误

我们运行一下看看效果 在这里插入图片描述 到这里flutter_map就运行成功了。

6、其实mapbox也有自己的插件mapbox_gl yaml中 mapbox_gl: ^0.16.0引入 这就完了?其实这只是开始,坑就开始了。务必需要分别查看Android和ios的文档 Android ios 创建token上面已经说了,主要还是私钥的创建,注意划线的地方 在这里插入图片描述 这里主要说下Android的实现, 1、Add your secret token your gradle.properties file: MAPBOX_DOWNLOADS_TOKEN=YOUR_SECRET_MAPBOX_ACCESS_TOKEN 2、R.strings.xml YOUR_MAPBOX_ACCESS_TOKEN 3、权限授权

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

4、 Android Studio less than Arctic Fox (2020.3.1) and Gradle less than v6.0:

allprojects {
    repositories {
        maven {
              url 'https://api.mapbox.com/downloads/v2/releases/maven'
              authentication {
                  basic(BasicAuthentication)
              }
              credentials {
                // Do not change the username below.
                // This should always be `mapbox` (not your username).
                  username = "mapbox"
                  // Use the secret token you stored in gradle.properties as the password
                  password = project.properties['MAPBOX_DOWNLOADS_TOKEN'] ?: ""
              }
          }
    }
}

Android Studio Arctic Fox (2020.3.1) or later and Gradle v6.0 or later: settings.gradle

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
          url 'https://api.mapbox.com/downloads/v2/releases/maven'
          authentication {
            basic(BasicAuthentication)
          }
          credentials {
            // Do not change the username below.
            // This should always be `mapbox` (not your username).
            username = "mapbox"
            // Use the secret token you stored in gradle.properties as the password
            password = MAPBOX_DOWNLOADS_TOKEN
          }
        }
    }
}

运行一下报错 在这里插入图片描述 通过查issueI changed this in /android/settings.gradle

在这里插入图片描述 5、


 MapboxMap(
        accessToken: App.ACCESS_TOKEN,
        trackCameraPosition: true,
        onMapCreated: onMapCreatedOne,
        myLocationEnabled: true,
        gestureRecognizers: Set()
          ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer()))
          ..add(
              Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer())),
        onStyleLoadedCallback: () => onStyleLoaded(mapboxMapController),
        initialCameraPosition: CameraPosition(target: center, zoom: 14),
      )

如何添加marker呢? controller.addSymbol


void onStyleLoaded(MapboxMapController controller) {
    if (latitude! > 0 && longitude! > 0) {
      Future.delayed(new Duration(seconds: 1), () {
        controller.addSymbol(SymbolOptions(
          geometry: LatLng(latitude!, longitude!),
          iconImage: "assets/symbols/2.0x/custom-icon.png",
        ));
      });
    }
  }

6、 pod install ios报错 在这里插入图片描述 需要在用户名目录下创建.netrc文件,有可能被隐藏了command +shift +. 查看一下 文件的内容为 machine api.mapbox.com login username password YOUR_SECRET_MAPBOX_ACCESS_TOKEN

pod install 没问题了,发现没有引入包

打开您的 Xcode 项目或工作区,然后转到File > Swift Packages > Add Package Dependency。 输入github.com/mapbox/mapb… Package。 要安装特定版本,请将Dependency Rule字段设置为基于版本的选项之一并插入所需版本。Maps SDK 的最新稳定版本是10.13.1. 此时,应该获取并加载所有内容。选择“MapboxMaps”库,然后按完成。 在您的代码中,您现在可以import MapboxMaps以及作为依赖项下载的任何其他包。 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 7、iOS模拟器无法运行


Building for iOS Simulator, but linking in dylib built for iOS, file '/Users/wlp/StudioProjects/duxing-v2-staff2/ios/Pods/Mapbox-iOS-SDK/dynamic/Mapbox.framework/Mapbox' for architecture arm64

参考 issue

 post_install do |installer|
+  installer.pods_project.build_configurations.each do |config|
+    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
+  end
   installer.pods_project.targets.each do |target|
     flutter_additional_ios_build_settings(target)
   end
 end
+

打包成功! 在这里插入图片描述

还有很多用法还没完全了解先记录到此。 在这里插入图片描述