我能够找到解决方案。目前我已经在 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(或通过其他方法清除),您都需要重新应用这些更改。
但是,就目前而言,我能够为迫切需要的功能找到解决方法。
我断断续续地寻找了几个月的解决方案。所以也许这也会对其他人有所帮助。