我想使用Flutter
在Google map
上的给定lat-log位置以叠加方式显示图像。我使用的是flutter包google_maps_flutter: 0.5.32
,目前该包没有提供实现该功能。
我能够找到一个解决方案。目前我已经在安卓系统中实现了它,但还没有在IOS中实现。
事实上,一旦我想明白了,它就相当简单了。但首先需要进行一些基础工作。
首先,我为我的应用程序创建了一个methodChannel
。在那个方法通道中,我传递了一个XML字符串,其中包含一个或多个groundOverlays
。这包括GPS坐标的基础知识,我的JPG的文件位置。
第二,我创建了一个名为MapOverlays
的类,它是一个静态类,包含一个称为MapOverlay
的类的列表。这只是我一次实际完成多个叠加的一种方式。
在Android Studio中执行此操作,在那里您可以打开Flutter项目中的Android文件夹。如果您已经创建了methodChannel
,并且特别是为了调试而运行它,那么您应该知道如何做到这一点。
这些类创建于:
google_maps_flutter/java/io.flutter.plugins.googlemaps
完成此操作后,我可以通过方法通道接收XML字符串,并将其传递给MapOverlays
的构造函数,后者解析XML代码并创建MapOverlay
项的数组。
一旦完成了这些基础工作,在创建覆盖图时在谷歌地图上显示覆盖图就变得微不足道了。
我必须将以下代码复制/粘贴到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);
}
}
最后一点:我知道这是一种黑客攻击。但我需要这个功能,不想写我自己的Flutter谷歌地图。我看了一份传单(flutter_map
插件(,它看起来很有前途,并实现了一个OverlayImage
项目,一旦我发现这是一个可以工作的项目,它就变得微不足道了。但是,flutter_map
不支持轴承/旋转。我用谷歌地球创建了许多groundOverlay
,它们都应用了一些旋转。如果没有这一点,映射就无法在flutter_map
上排列,我也不知道如何修改代码以进行轮换。所以这是一个节目的终结者。
我真的很惊讶flutter_google_maps
不支持地面覆盖。在Android中添加这种支持将是非常琐碎的。我希望iOS也一样。
我最后的评论是,你正在修改从Flutter插件缓存的谷歌代码。任何时候升级flutter_google_maps
(或通过其他方法清除(,都需要重新应用这些更改。
但是,就目前而言,我能够为一个急需的功能找到一个变通方法。
我断断续续地找了几个月的解决方案。因此,也许这也会帮助其他人。