Mapbox-gl-native: Cannot introspect source or layer obtained from style

Created on 5 Oct 2016  路  6Comments  路  Source: mapbox/mapbox-gl-native

A source or style layer obtained from a map鈥檚 current style has its identifier set but has no other properties set. Therefore, there鈥檚 no way to obtain the source associated with a particular layer that comes with the Mapbox Streets style, nor is there a way to get the tile sets associated with that source.

I鈥檓 filing this issue in the course of fixing #6406, based on a close reading of the iOS/macOS and Android code base. To reproduce this issue on iOS or macOS, try the following code with the Mapbox Streets v9 style:

NSURL *url = [NSURL URLWithString:@"mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7"];
NSAssert([[mapView.style layerWithIdentifier:@"country-label-md"].source.URL isEqual:url]);

To fix this issue, we鈥檒l have to expose more members of mbgl::style::Layer and mbgl::style::Source that up to now have been stashed away in private Impl classes. For instance, we鈥檒l need an mbgl::style::VectorSource::getTileset() that returns the existing mbgl::style::TileSourceImpl::tileset. I鈥檓 sure these members were hidden for good reason. To mitigate any questions about the expected lifetime of the returned object, it may be necessary to fix #6254 in the course of fixing this bug. (#6254 probably applies to the Android SDK as well.)

/cc @jfirebaugh @ivovandongen @incanus @frederoni @boundsj

Android Core archived bug iOS macOS runtime styling

Most helpful comment

It's probably fine used as a package of parameters you can pass when creating a source. I'm saying, write VectorSource::getTileURLTemplates(), VectorSource::getZoomRange(), etc., not a single VectorSource::getTileset().

All 6 comments

I鈥檓 sure these members were hidden for good reason.

Not really, there's just never been a requirement to expose accessors for them before.

API design considerations:

  • I'd prefer _not_ to expose a Tileset / TileJSON concept in public APIs. I think these concepts are on their way out, and sources will eventually just have inline properties for their URL templates, zoom range, etc. So those properties are best exposed directly on the source object, without an intermediate "Tileset" domain object.
  • In the current implementation, the tileset properties might not be available during the initial load, while the TileJSON is being requested. This wrinkle will go away if we inline TileJSON properties, but for now the API needs to take it into account.

I'd prefer not to expose a Tileset / TileJSON concept in public APIs.

Noting that this concept was recently added to the iOS SDK in https://github.com/mapbox/mapbox-gl-native/pull/6316 to support the initialization of sources with tile templates.

Noting that this concept was recently added to the iOS SDK in #6316 to support the initialization of sources with tile templates.

Also has been a part of the Android API for a bit now. If we want to change this, we need to do this either before the upcoming 4.2 release or wait until 5.0.

It's probably fine used as a package of parameters you can pass when creating a source. I'm saying, write VectorSource::getTileURLTemplates(), VectorSource::getZoomRange(), etc., not a single VectorSource::getTileset().

The main thing developers would want to extract from a GeoJSON source would be the (untiled) GeoJSON it contains: #7376.

This issue has been automatically detected as stale because it has not had recent activity and will be archived. Thank you for your contributions.

Was this page helpful?
0 / 5 - 0 ratings