Skip to main content

These engines overlap far more than they differ — all four draw vector tiles well. The differences worth choosing on are the licence, what ships in the SDK (routing, geocoding, contour generation, shadows) and how much of the map you can change at runtime.

Massif Mapsthis SDKMapLibre GL NativeBSD-2Mapbox Maps SDKproprietaryTangram ESMIT
The basics
LicenceBSD 3-ClauseBSD 2-ClauseProprietary, account and token requiredMIT
Access token / account neededNone. Bring your own tilesNoneRequired, and billed per map loadNone
Actively maintainedUpstream archived; this project tracks a fork
PlatformsAndroid, iOS. Desktop and web nextAndroid, iOS, desktop, plus GL JS on the webAndroid, iOS, webAndroid, iOS, Linux, macOS
Styling
Style languageCartoCSSMapLibre / Mapbox GL style JSONMapbox GL style JSONYAML scene files
Convert a MapBox / MapLibre stylemassif-style mapbox2css, with a coverage reportNative formatNative format
Change a style value without re-decoding tilesLive style parameters — repaint onlyRuntime style API, per propertyRuntime style API, per propertyScene updates re-parse the scene
Custom shaders in the styleRaster shaders, sky shader, post-processing passesCustom layers, written against the GL contextCustom layersShader blocks in the scene file
Terrain and relief
3D terrainRTT fill draping, depth-correct occlusion, auto-flatten
HillshadeGDAL, Igor and multidirectional, plus exaggeration
Contour lines generated on the flyFrom RGB elevation tiles — no pre-baked contour dataNeeds a contour tile sourceNeeds a contour tile sourceShader contours in the scene
Sun shadowsCascaded shadow maps on 3D buildings; terrain cast shadows wired but off3D lighting for models
Elevation queries from the appgetElevation on the hillshade layerqueryTerrainElevation?
Data formats
Mapbox Vector Tiles
PMTilesBuilt in, local or over HTTP range requestsVia a protocol handler / plugin
MBTilesVia a custom source
MapLibre Tiles (MLT)Decoder only — reads MLT, does not write itThe reference implementation, in progress
App GeoJSON tiled and styled like a tile sourcegeojson-vt pyramid, then CartoCSSGeoJSON source
Beyond drawing the map
Routing in the SDKValhalla embedded, online and offline; SGRE indoorA separate Navigation SDK, billed separately
Offline geocodingOSM packages on the deviceHosted service
Offline mapsMBTiles, PMTiles, persistent cache, bundled stylesOffline manager and ambient cacheOffline regionsMBTiles
JavaScript binding for a mobile frameworkNativeScript today; Flutter and React Native plannedReact Native, Flutter, community-maintainedReact Native, Flutter
One id/JSON API across every languageThe surface API — same strings from Java, Swift, TS or CA per-platform bindingA per-platform binding

yes partial, see the note no ? not checked

Where Massif Maps is the weaker choice

  • Only Android and iOS today. If you need the same renderer on the web, MapLibre is one project across native and GL JS. Desktop and web are on the roadmap, not shipped.
  • CartoCSS, not GL style JSON. The ecosystem of ready-made styles is written for the Mapbox format. The style CLI converts one and reports exactly what it could not carry, but that is a conversion, not a drop-in.
  • Smaller community. Fewer answered questions, fewer third-party bindings, one maintainer team.

Where it is the stronger one

  • Outdoor and mountain maps. On-the-fly contours from elevation tiles, terrain shadows, a physical sky and the peak-finder relief look are in the SDK rather than in your app.
  • Routing and geocoding without a service. Valhalla is embedded and runs offline; geocoding reads OSM packages on the device.
  • One API from every language. The surface API is ids and JSON, so the same map code reads the same in Kotlin, Swift, TypeScript and C — and a new SDK feature reaches every binding without a binding change.
  • No token, no billing, no account. BSD 3-Clause, your own tiles.

Something here wrong or out of date? Correct it in one file.