flutter mapbox_gl及flutter_map使用

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

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

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

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 提供了一些免费的瓦片地址链接,可以用于开发和测试目的。以下是其中一些链接:
地图样式: https://api.mapbox.com/styles/v1/{username}/{style_id}/tiles/{tilesize}/{z}/{x}/{y}@2x?access_token={access_token}
地图标签: https://api.mapbox.com/v4/{map_id}/{z}/{x}/{y}.png?access_token={access_token}
地图卫星图: https://api.mapbox.com/v4/{map_id}/{z}/{x}/{y}.jpg?access_token={access_token}
需要替换的变量有:
{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。
输入https://github.com/mapbox/mapbox-maps-ios.gitURL,按Enter拉入包,然后单击Add 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
+

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
flutter_map是一个用于在Flutter应用程序中集成地图的插件[^2]。下面是一个使用flutter_map插件的示例: 首先,您需要在`pubspec.yaml`文件中添加flutter_map的依赖项: ```yaml dependencies: flutter_map: ^0.3.0 ``` 然后,运行`flutter packages get`命令来获取依赖项。 接下来,您可以在Flutter应用程序中使用flutter_map插件。以下是一个简单的示例,展示如何在地图上显示一个标记点: ```dart import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong/latlong.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Map Demo', home: Scaffold( appBar: AppBar( title: Text('Flutter Map Demo'), ), body: FlutterMap( options: MapOptions( center: LatLng(51.5, -0.09), zoom: 13.0, ), layers: [ TileLayerOptions( urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", subdomains: ['a', 'b', 'c'], ), MarkerLayerOptions( markers: [ Marker( width: 80.0, height: 80.0, point: LatLng(51.5, -0.09), builder: (ctx) => Container( child: FlutterLogo(), ), ), ], ), ], ), ), ); } } ``` 在上面的示例中,我们创建了一个Flutter应用程序,并在地图上显示了一个标记点。我们使用了`FlutterMap`小部件来显示地图,并使用`MapOptions`来设置地图的中心点和缩放级别。我们还使用了`TileLayerOptions`来指定地图瓦片的URL模板,以及`MarkerLayerOptions`来添加标记点。 请注意,为了使用flutter_map插件,您还需要在`pubspec.yaml`文件中添加`latlong`库的依赖项: ```yaml dependencies: latlong: ^0.6.1 ``` 这是一个简单的示例,您可以根据自己的需求进行更多的定制和功能扩展。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值