Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding GeoJSON Layer in onMapCreated is unreliable #568

Open
marcellangmaier opened this issue May 29, 2024 · 6 comments
Open

Adding GeoJSON Layer in onMapCreated is unreliable #568

marcellangmaier opened this issue May 29, 2024 · 6 comments

Comments

@marcellangmaier
Copy link

marcellangmaier commented May 29, 2024

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

@felixkrautschuk
Copy link

@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.

@fighterii
Copy link

fighterii commented Jun 13, 2024

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)

@evil159
Copy link
Contributor

evil159 commented Jun 13, 2024

For reliable results, use onStyleLoaded event to perform runtime styling.

@felixkrautschuk
Copy link

@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.

@evil159
Copy link
Contributor

evil159 commented Jun 13, 2024

@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

@felixkrautschuk
Copy link

@evil159 alright, I created another thread for my issue here: #601

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants