Adding GeoJSON Layer in onMapCreated is unreliable
Opened this issue · 6 comments
When I add a GeoJSON Layer in onMapCreated, sometimes it gets displayed, sometimes not.
https://github.com/mapbox/mapbox-maps-flutter/assets/26068556/0027f248-5a57-46d8-ad06-332f4a6fa58e
https://github.com/mapbox/mapbox-maps-flutter/assets/26068556/856634f2-d741-45c4-85f5-178b61050aa1
pubspec.yaml: mapbox_maps_flutter: ^2.0.0-rc.1
My _onMapCreated method:
_onMapCreated(map.MapboxMap mapboxMap) async {
this.mapboxMap = mapboxMap;
await drawRoute();
}
The method which adds the geojson layer
Future<void> drawRoute() async {
var data = await rootBundle.loadString('assets/line.geojson');
var source = map.GeoJsonSource(id: "line", data: data);
await mapboxMap?.style.addSource(source);
var lineLayer = map.LineLayer(
id: "line_layer",
sourceId: "line",
lineJoin: map.LineJoin.ROUND,
lineCap: map.LineCap.ROUND,
lineColor: Colors.red.value,
lineWidth: 6.0,
// slot: map.LayerSlot.TOP
);
await mapboxMap?.style.addLayer(lineLayer!);
}
Simple example:
main.dart.zip
GeoJson file:
line.geojson.zip
@marcellangmaier does this happen only on Android on your side or also on iOS?
I have similar problems using the latest mapbox plugin (v. 2.0.0), but only on Android.
I am trying to load a custom json style inside the onMapCreated handler.
_onMapCreated(MapboxMap mapboxMap) async {
final styleJson = await rootBundle.loadString("assets/map-styles/style1.json");
mapboxMap.style.setStyleJSON(styleJson);
print("style loaded");
}
I can see the log-message in the console, so the onMapCreated handler is executed, but the map is still showing the default style.
In addition, when adding a geojson source and a layer inside the onStyleLoadedListener like this:,
_onMapStyleLoaded(StyleLoadedEventData eventData) async {
final data = await rootBundle.loadString('assets/data.json');
await mapboxMap?.style.addSource(
GeoJsonSource(
id: "my_source",
data: jsonEncode(data)
)
);
await mapboxMap?.style.addLayer(
SymbolLayer(
id: "my_layer",
sourceId: "my_source"
)
);
//...
}
then the layer is visible (on the default map style instead of the custom json style that is not getting loaded correctly), but I also get an exception on Android.
E/flutter ( 8826): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(Throwable, java.lang.Throwable: Source my_source already exists, Cause: null, Stacktrace: java.lang.Throwable: Source my_source already exists
E/flutter ( 8826): at com.mapbox.maps.mapbox_maps.StyleController.addStyleSource(StyleController.kt:289)
E/flutter ( 8826): at com.mapbox.maps.mapbox_maps.pigeons.StyleManager$Companion.setUp$lambda-51$lambda-50(MapInterfaces.kt:6490)
E/flutter ( 8826): at com.mapbox.maps.mapbox_maps.pigeons.StyleManager$Companion.$r8$lambda$DXAQ35E-7m0eWhGSNgtBkwfDJqQ(Unknown Source:0)
E/flutter ( 8826): at com.mapbox.maps.mapbox_maps.pigeons.StyleManager$Companion$$ExternalSyntheticLambda8.onMessage(Unknown Source:2)
E/flutter ( 8826): at io.flutter.plugin.common.BasicMessageChannel$IncomingMessageHandler.onMessage(BasicMessageChannel.java:261)
E/flutter ( 8826): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/flutter ( 8826): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/flutter ( 8826): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/flutter ( 8826): at android.os.Handler.handleCallback(Handler.java:958)
E/flutter ( 8826): at android.os.Handler.dispatchMessage(Handler.java:99)
E/flutter ( 8826): at android.os.Looper.loopOnce(Looper.java:205)
E/flutter ( 8826): at android.os.Looper.loop(Looper.java:294)
E/flutter ( 8826): at android.app.ActivityThread.main(ActivityThread.java:8177)
E/flutter ( 8826): at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 8826): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
E/flutter ( 8826): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
E/flutter ( 8826): , null)
E/flutter ( 8826): #0 StyleManager.addStyleSource (package:mapbox_maps_flutter/src/pigeons/map_interfaces.dart:6373:7)
E/flutter ( 8826):
E/flutter ( 8826): #1 StyleSource.addSource. (package:mapbox_maps_flutter/src/style/style.dart:308:66)
E/flutter ( 8826):
E/flutter ( 8826): #2 MapPageState._onMapStyleLoaded (package:flutter_mapbox/main.dart:63:5)
E/flutter ( 8826):
Everything was working correctly with plugin version 1.1.0 on Android and iOS, and with version 2.0.0 it is still working on iOS, but NOT on Android.
I do have a similiar problem after upgrading to 2.0.0 on android. With 1.1.0 everything worked fine.
In my onMapCreated i add a terrain Source:
_onMapCreated(MapboxMap mapboxMap) {
this.mapboxMap = mapboxMap;
_addTerrainToMap();
}
_addTerrainToMap() async {
await mapboxMap?.style.addSource(RasterDemSource(id: "mapbox-raster-dem", url: mapboxTerrainDem, tileSize: 512, maxzoom: 14));
var terrain = {'source': 'mapbox-raster-dem'};
mapboxMap?.style.setStyleTerrain(json.encode(terrain));
}
and I got an error:
I/flutter (14176): PlatformException(Throwable, java.lang.Throwable: Source mapbox-raster-dem is not in style, Cause: null, Stacktrace: java.lang.Throwable: Source mapbox-raster-dem is not in style
I/flutter (14176): at com.mapbox.maps.mapbox_maps.StyleController.setStyleSourceProperties(StyleController.kt:340)
For reliable results, use onStyleLoaded
event to perform runtime styling.
@evil159 as I mentioned above, I still have similar issues on Android after upgrading to 2.0,0, even when adding sources and layers in onStyleLoaded.
@felixkrautschuk It appears you have another issue, you are trying to add a source that already exists
E/flutter ( 8826): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(Throwable, java.lang.Throwable: Source my_source already exists, Cause: null, Stacktrace: java.lang.Throwable: Source my_source already exists