【问题标题】:Google map ground overlay flutter谷歌地图地面覆盖颤动
【发布时间】:2021-01-03 10:10:27
【问题描述】:

我想使用FlutterGoogle map 上的给定纬度日志位置叠加显示图像。我正在使用flutter包google_maps_flutter: 0.5.32,目前该包不提供实现该功能。

【问题讨论】:

标签: google-maps flutter dart google-maps-flutter


【解决方案1】:

我能够找到解决方案。目前我已经在 Android 中实现了它,但还没有在 IOS 中实现。

一旦我弄清楚了,它实际上是相当简单的。但首先需要进行一些基础工作。

首先,我为我的应用创建了一个methodChannel。在那个方法通道中,我传递了一个包含一个或多个groundOverlays 的XML 字符串。这包括 GPS 坐标的基础知识、我的 JPG 文件位置。

其次,我创建了一个名为MapOverlays 的类,它是一个静态类,包含一个名为MapOverlay 的类的列表。这只是我一次实际进行多个叠加的一种方式。

在 Android Studio 中执行此操作,您可以在其中打开 Flutter 项目中的 Android 文件夹。如果您已经创建了 methodChannel 并且特别是运行它以进行调试,那么您应该知道如何执行此操作。

这些类创建于:

google_maps_flutter/java/io.flutter.plugins.googlemaps

完成此操作后,我可以通过方法通道接收 XML 字符串,并将其传递给 MapOverlays 的构造函数,该构造函数解析 XML 代码并创建一个 MapOverlay 项目数组。

一旦完成这项基础工作,在 Google 地图上显示叠加层就很简单了。

我必须将以下代码复制/粘贴到 GoogleMapController.java 类中。它位于方法onMapReady() 的最后。

请参阅底部的最后说明!

    ArrayList<MapOverlays.MapOverlay> mapOverlays =  MapOverlays.getMapOverlays();
    
        for (MapOverlays.MapOverlay mo: mapOverlays) {
          if (mo.getVisible()) {
            LatLng southWest = new LatLng(mo.getSouth(), mo.getWest());
            LatLng northEast = new LatLng(mo.getNorth(), mo.getEast());
            LatLngBounds bounds = new LatLngBounds(southWest, northEast);
            Bitmap bitmap = BitmapFactory.decodeFile(mo.getImageLocation());
            GroundOverlayOptions mapOptions = new GroundOverlayOptions().image(BitmapDescriptorFactory.fromBitmap(bitmap));
            mapOptions.positionFromBounds(bounds);
            mapOptions.bearing(mo.getBearing()*-1);
            mapOptions.transparency(mo.getTransparency());
    
            GroundOverlay groundOverlay = this.googleMap.addGroundOverlay(mapOptions);
          }
      }

最后说明:我知道这是一种 hack。但是我需要这个功能并且不想编写自己的 Flutter Google Map。我查看了一个看起来非常有前途的传单(flutter_map 插件),并实现了一个 OverlayImage 项目,一旦我发现这是可以工作的项目,这是微不足道的。但是,flutter_map 不支持轴承/旋转。我用 Google 地球创建了许多 groundOverlays,它们都应用了一些旋转。没有这个,地图没有在flutter_map 上对齐,我不知道如何修改代码以进行旋转。所以这是一场表演。

我真的很惊讶flutter_google_maps 不支持地面覆盖。为 Android 添加这种支持将非常简单。我希望 iOS 也能如此。

我最后的评论是,您正在修改从 Flutter 插件缓存的 Google 代码。任何时候升级flutter_google_maps(或通过其他方法清除),您都需要重新应用这些更改。

但是,就目前而言,我能够为迫切需要的功能找到解决方法。

我断断续续地寻找了几个月的解决方案。所以也许这也会对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多