Changelog
View on GitHub →Changelog
All notable changes to this project will be documented in this file. See standard-version for commit guidelines.
[v6.0.1] - 2026-08-18
BREAKING CHANGES
- due to
40ef746- fog the whole map in 2D and let an app replace the fog shader (PR #123 by @farfromrefug):
TerrainOptions.FogColor/FogStartDistance/FogDistance and
SkyOptions.FogBlend/FogHorizon are gone - use FogOptions, whose range is in multiples of the
camera-to-focus distance rather than metres, so the old numbers do not carry over. The style
properties fog-start-distance / fog-distance become fog-range-start / fog-range-end. See
docs/migration.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- fix(renderers): draw stars as dots and stop the haze erasing them
Two things were wrong with the star field:
- It lit a whole cell of a direction-space lattice, which reads as a grid of grey squares.
Port the demo day-cycle sky's version (scripts/android-dev, DemoSky.buildSkyShader), which
had it right: cells in (azimuth, elevation) rather than a flat projection that streaks them
near the horizon, one star per cell at most, placed at a random point INSIDE its cell and
drawn as a soft dot with its own brightness.
- They were added before the fog blend, so they were multiplied by (1 - haze) like everything
else and vanished wherever the fog band reached - which HorizonBlend alone decided, leaving
them in the strip of sky above it and nowhere else. They are now added after it and take
only the square root of the haze: they sit beyond the atmosphere, so they dim into it rather
than being erased by it, and they still go where the haze actually saturates. That also puts
them outside skyColor, so a custom sky shader gets them too - StarIntensity defaults to 0.
Give every fog preset a high colour as well - it is the one property with no other way to see
it - and make the 'space' preset a night sky: dark ground haze, deep blue atmosphere,
near-black zenith, stars well up.
Note when testing: a custom sky shader that replaces skyColor still draws its own gradient, and
'--es daycycle true' installs the demo's sky, whose stars are gated on its own day value.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- feat(demo): let the camera tilt down to 10 degrees
The tilt range floored at 30, which is a fairly steep view: the sky is a thin strip at the top
of the screen and the horizon never really opens up. 10 gives enough sky to judge the fog band,
the atmosphere colours and the stars against.
- due to
d6f25d2- keep long mountain shadows when panning back, in view-relative units (commit by @farfromrefug):
LightOptions.setShadowDistance takes a multiple of the
camera-to-focus distance, not metres. The signature is unchanged, so an app passing
20000 compiles and asks for 20000 times the view. Drop the call and take the
default, or scale from there. See docs/migration.md.
- due to
35174ea- keep mountain and building shadows sharp and present at every zoom and tilt (PR #128 by @farfromrefug):
LightOptions.setShadowDistance takes a multiple of the
camera-to-focus distance, not metres. The signature is unchanged, so an app passing
20000 compiles and asks for 20000 times the view. Drop the call and take the
default, or scale from there. See docs/migration.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- feat(terrain): add LightOptions.shadowNormalOffset for cleaner building shadows
A receiving surface is pushed along its own normal by N shadow-map texels before it looks
itself up, mapbox's model (default 3, theirs). Acne then clears by moving the sample sideways
rather than by lifting its depth, so the depth bias can stay small enough for a shadow to stay
attached to the building casting it. 3D extrusions only - the terrain surface takes its normal
per fragment from the DEM, out of a vertex-stage offset's reach. 0 disables it.
Requires libs-massif 67a0ef7 (vt: the offset itself, and the clamp that stops a far cascade's
offset walking a roof out of the mountain shadow it stands in).
Demo: panel slider, --es shadowNormalOffset, and live over the CONFIG broadcast.
Emulator-verified at Grenoble z17 tilt 40; not checked on the Crosscall. No camera has yet been
found where the offset earns its cost - documented as an open gap in
docs/internals/rendering/08-lighting-sky-fog.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- perf(terrain): make the shadow map the depth buffer, not a packed copy of it
TerrainShadowMap attaches a DEPTH_COMPONENT24 texture as the depth attachment and drops the
colour attachment entirely wherever a depth texture can be sampled (ES3 core, or
OES_/ANGLE_depth_texture). The caster pass then writes depth alone: before it wrote depth to a
renderbuffer AND a packed-RGB copy of gl_FragCoord.z to an RGBA8 target, which the receiver
unpacked with a dot. The atlas goes RGBA8 + D16 -> D24 and the packing is masked off.
24 bits and not 16 because the packed path spread gl_FragCoord.z over three bytes - a D16
texture would have LOST precision and bought acne back. ES2 + OES_depth_texture has only the
unsized form.
GLContext gains ES3 / DEPTH_TEXTURE / SHADOW_SAMPLERS detection and logs them at startup. A
depth-only framebuffer is complete by the ES3 spec but is not guaranteed on ES2 drivers, so an
incomplete status falls back to the packed map rather than to no shadows - iOS builds against
MetalANGLE, whose README records the build patched down to ES2 for 32-bit devices.
Requires libs-massif 20d9a43 (vt: the SHADOW_DEPTH_TEXTURE lookup).
Emulator, OpenGL ES 3.0 (4.1 Metal - 90.5): depth texture 1, shadow samplers 0, shadows ACTIVE,
depth-only framebuffer complete, image equivalent to the packed path at Grenoble z12.53 tilt 26.
NOT checked on the Crosscall, and no ES2 device has exercised the fallback.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- perf(terrain): bind the shadow map as a comparison sampler for hardware PCF
TerrainShadowMap sets TEXTURE_COMPARE_MODE = COMPARE_REF_TO_TEXTURE and LINEAR filtering on the
depth texture wherever the shading language can declare a sampler2DShadow - ESSL 3.00, hence an
ES3 context. LINEAR is only meaningful there, because the comparison happens BEFORE the filter:
one fetch returns the bilinear average of four depth compares, where the manual path did a fetch,
an unpack and a compare per tap.
GL_EXT_shadow_samplers reads 0 on the Crosscall (Adreno, OpenGL ES 3.2 V@0502.0) and on the
emulator, because it is an ES2 extension that a driver does not advertise on an ES3 context -
sampler2DShadow being core there. The capability is therefore derived from ES3 + depth texture,
not from the extension string.
Requires libs-massif 0954e2c (vt: the ESSL 3.00 programs and the comparison lookup).
Emulator, OpenGL ES 3.0 (4.1 Metal - 90.5), Grenoble z12.53 tilt 26: shadows ACTIVE, 123,401 px
of 2,592,000 differ from the manual-tap path. FRAME TIME NOT MEASURED on either device - the win
is inferred from the fetch count. NOT run on the Crosscall.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- docs(terrain): record that hardware PCF buys quality, not speed
Interleaved A/B on the Crosscall (Adreno 610, -PprofileRender, Grenoble z13 tilt 30, base
composite, shadow 0.6, panning, medians over 42 one-second windows): hardware PCF 14.6 fps /
6.0 ms drape against manual taps 14.5 / 6.0 - within noise. Four taps against one: also within
noise. The tap count was never the cost.
What the feature costs at that camera is 23.9 -> 14.6 fps and 1.2 -> 6.1 ms of drape, and
1.4 ms of it is the CASCADE COUNT (14.6 -> 17.0 fps at one cascade) - one shadow matrix per
vertex and one highp vec3 varying per cascade. Same conclusion the earlier tap-count experiment
reached from the other side.
Corrects this page's claim that the frame-time win was merely unmeasured: it was measured and it
is zero. What hardware PCF does buy is 16 effective samples for the price of 4.
Next perf step is therefore cascades, not sampling.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- docs(terrain): record why building shadows are softer than mapbox's at z16
The cause is the shadow-map texel, not the filter and not the screen-space mask. With the range at
4.5 x the camera-to-focus distance (~7 km at z16) split three ways, the near cascade covers ~1.5 km
through a 1024 page - about 1.5 m of ground per texel, i.e. metres-wide steps across a street.
mapbox puts the same near-cascade distance through a 2048 page and spends nothing on a third
cascade.
Measured on the Crosscall, Grenoble z16 tilt 45, same camera forced by broadcast: 1024 x 3 gives
14.1 fps / 5.8 ms drape and washed courtyard shadows, 2048 x 2 gives 13.6 / 5.8 and tight edges.
Nearly free, because the per-cascade cost is matrices and varyings rather than sampling. Defaults
are left alone - 2048 x 2 at D24 is ~33 MB of atlas against ~12.6 MB - and the knobs are documented
instead.
Records the dead end too: SHADOW_MASK_DIVISOR = 1 was tried on the theory that the quarter-
resolution mask was blurring building shadow edges. It made them look worse - the full-res mask
exposed the shadow-map staircase the blur had been hiding. The mask hides quantisation, it does not
cause it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- fix(terrain): keep building shadows sharp as the view tilts
Each shadow cascade is now fitted to the bounding sphere of its view-frustum slice instead of to
the visible-ground wedge, so the texel size no longer depends on the pitch, the bearing or the sun
azimuth. Shadows at a low tilt look like shadows at tilt 90, which is how mapbox behaves and why
theirs stay sharp.
MapRenderer passes the camera-to-focus distance into the fit. It used to be read from the vt view
state, which TileRenderer::onDrawFrame fills AFTER the shadow pass runs - stale at best, absent on
the frames that matter.
Requires libs-massif 9548f46 (vt: the sphere fit itself, and the ~200 lines of wedge machinery it
replaces).
Device-verified on the Crosscall at the reported camera (lat 45.188499 lon 5.734500, z16 tilt 45
rotation -15.12, bld3d, sun 16.5 UTC): shadows with no locatable edge before, hard edges on
individual buildings after. Frame cost not re-measured, and tilt 90 not re-checked for regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- fix(terrain): bound the shadow caster ring by the throw distance, not by a tile count
A mountain's shadow was missing at z16 and appeared as soon as you zoomed out or panned enough to
pull the mountain into the visible cover. The caster ring was a fixed number of tiles at the
cover's own zoom, and a tile count is a DISTANCE THAT SHRINKS WITH THE ZOOM: at z16 a tile is
~430 m, so the default margin of 3 reached 1.3 km while the mountain casting into the view was
several km away and simply had no caster drawn for it.
The ring is now sized by how far a shadow can physically be thrown - relief / tan(sun altitude),
which the shadow pass's 15-degree floor caps at about 3.7 x the relief. Holding that distance means
dropping the resolution, since 7 km at z16 would be a 35x35 ring: the ring is generated at the
COARSEST tile zoom that still spans the throw in shadowCasterMargin tiles, and the existing
partition logic subdivides whatever overlaps the finer cover.
shadowCasterMargin therefore now sets the ring's RESOLUTION rather than its reach; the reach is
derived and correct at every zoom. Documented on the option and in the rendering notes.
Device-verified on the Crosscall at the reported camera (lat 45.193196 lon 5.735717 z16.04 tilt 90
rotation -15.12, terrain lighting, shadow 0.8): the shadow is now present at the default margin and
matches what the old code only produced at margin 8 (81k px of 1.36M differ, tile-load noise;
against the old margin 3 it is 750k). 22 caster tiles per pass, 1.0 ms per pass; the ring costs
2.3 ms of drape (20.5 fps against 25.4 with no ring at all), where the old fine ring drew up to 49
tiles there and still missed the mountain.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- fix(terrain): size the shadow caster ring from the surrounding massif, not the visible cover
The previous commit bounded the caster ring by the shadow throw, but computed the throw from the
relief of the VISIBLE COVER. At z16 top-down over a valley that cover is a few tiles of flat ground:
metres of relief, a throw of a couple of hundred metres, and a ring that collapses straight back
onto the cover's own zoom - the exact behaviour it was meant to replace. The mountain casting into
the view is outside the cover, so its height was never in that range.
The relief now comes from a coarse ancestor of the cover (SHADOW_RELIEF_ZOOM = 10, ~28 km at
latitude 45), which spans the massif. One elevation query per frame.
FASTER than the broken version, not slower, because the same number of caster tiles now covers the
throw coarsely instead of covering the valley floor finely. Crosscall, lat 45.193196 lon 5.735717
z16.04 tilt 90, terrain lighting, shadow 0.8, panning:
cover relief (broken): 20.5 fps, 4.8 ms drape, 22 caster tiles per pass
massif relief (this): 23.5 fps, 3.5 ms drape, 21 caster tiles per pass
no ring at all: 25.7 fps, 2.3 ms drape
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- feat(terrain): log how many shadow casters were skipped for missing elevation
Added to the periodic shadow line beside the caster tile count and the extrusion draws, because
"the shadow is missing" has three different causes - the caster was never in the list, it was
clipped by the light box, or it had no elevation and was skipped - and nothing on screen tells
them apart.
Requires libs-massif 9c5888a (vt: the counter itself).
Used it straight away to rule out the coarse caster ring asking for DEM tiles that had not been
fetched: at Grenoble lat 45.190410 lon 5.734305 z16.53 tilt 90 the count is 0 per pass with 33
caster tiles drawn, so the remaining truncation reported at that camera is neither the ring's
reach nor a missing DEM.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- fix(terrain): span the caster tiles with the shadow height slab, not the cover
vt has no per-tile heights for the caster RING - it measures every ring tile at the single range it
is handed - so a ridge taller than that range is clipped out of the caster pass by the light box's
near plane. Its shadow then arrives truncated along an edge that moves with the camera, because the
range follows the cover. Measured at Grenoble lat 45.190410 lon 5.734305 z16.53 tilt 90: the cover's
range was 5.75..17.43 while the caster tiles reached 145.13, eight times taller.
The range is now widened with the caster tiles' own min/max - exact, rather than the coarse-ancestor
guess tried first, which fell short at 120. The per-tile ranges still narrow each cascade's RECEIVER
slab, so the texel size does not pay for it.
Device-confirmed by Martin: reproducible before, not reproducible with this build, reproducible
again after rebuilding without it.
Recorded in the docs because it was nearly lost: a single-frame screenshot A/B scored this fix at
19,425 px of 1,357,952 - noise - and it was reverted as refuted. The symptom only appears while
panning, so a still frame never measured it. Two other candidates were ruled out with the same
method and those refutations stand on their own evidence (0 casters skipped for missing elevation;
ring reach needs 1.76 of its 3 tiles), but a static frame is not a valid detector for a motion
artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
New Features
645c736- demo: add the style regression repro layer (commit by @farfromrefug)40ef746- renderers: fog the whole map in 2D and let an app replace the fog shader (PR #123 by @farfromrefug)6f13bb4- terrain: add LightOptions.shadowNormalOffset for cleaner building shadows (commit by @farfromrefug)525d15b- terrain: log how many shadow casters were skipped for missing elevation (commit by @farfromrefug)f94ef5c- labels: let one style pick flat labels in 2D and billboard ones in 3D (PR #136 by @farfromrefug)
Bug Fixes
97da528- vt: the reported style regressions in labels, lines and clipped text (commit by @farfromrefug)c999149- terrain: stop the previous zoom flashing over the map when zooming out (PR #124 by @farfromrefug)d6f25d2- terrain: keep long mountain shadows when panning back, in view-relative units (commit by @farfromrefug)be7f83f- terrain: keep building shadows sharp as the view tilts (commit by @farfromrefug)1351675- terrain: bound the shadow caster ring by the throw distance, not by a tile count (commit by @farfromrefug)6bf362a- terrain: size the shadow caster ring from the surrounding massif, not the visible cover (commit by @farfromrefug)0f10837- terrain: span the caster tiles with the shadow height slab, not the cover (commit by @farfromrefug)35174ea- terrain: keep mountain and building shadows sharp and present at every zoom and tilt (PR #128 by @farfromrefug)ff196c8- shadow strenght was too high (commit by @farfromrefug)fb4b533- terrain: shade contours with the ground they lie on (PR #130 by @farfromrefug)
[v6.0.0] - 2026-08-16
The first release under the project's own name. The CARTO Mobile SDK is now Massif Maps: every
namespace, package, class prefix, artifact and debug token is renamed, the hosted CARTO services are
gone, and the project has moved to the massif-maps organisation.
The same release carries the whole 3D terrain, lighting and rendering-performance cycle that landed
since v5.2.3 — 3D terrain with GPU draping and cascaded shadows, a sky and sun model, MapLibre Tiles
(MLT) support, on-the-fly contours, composite vector-tile layers, celestial objects, custom shaders,
and a large body of measured performance work.
Full documentation: <https://massif-maps.github.io/MassifMaps/>
Migration from the CARTO Mobile SDK
Massif Maps is the CARTO Mobile SDK, forked and kept alive after CARTO stopped maintaining it.
The 4.x/5.x concepts, class shapes and CartoCSS styles all still apply — what changed is the name.
For most apps the migration is a dependency line and a find-and-replace.
1. Change the dependency.
// before
implementation 'com.carto:carto-mobile-sdk:4.4.+'
// after — JitPack overrides the declared groupId, so the coordinate is the GitHub path
implementation 'com.github.massif-maps:MassifMaps-android-aar:v6.0.0'
On iOS the CocoaPod is replaced by a Swift package:
https://github.com/massif-maps/MassifMaps-ios-swift.
2. Rename the imports.
# Android / Java / Kotlin
grep -rl 'com\.carto\.' src/ | xargs sed -i '' 's/com\.carto\./com.massifmaps./g'
# iOS / Obj-C / Swift — class prefix NT -> MSF
grep -rl 'NT[A-Z]' Sources/ | xargs sed -i '' -E 's/\bNT([A-Z][A-Za-z0-9]*)/MSF\1/g'
3. Replace anything that talked to CARTO's servers (see Removed below).
4. Styles need no change. nuti:: still parses, with a deprecation warning.
| | Before | After |
|---|---|---|
| Java / Kotlin | com.carto. | com.massifmaps. |
| Java (routing-lib) | com.akylas.routing. | com.massifmaps.routing. |
| Objective-C / Swift | NTMapView, NT_ | MSFMapView, MSF_ |
| .NET | Carto.Ui, Carto.Layers | Massif.Ui, Massif.Layers |
| C++ | carto:: | massif:: |
| Build defines | _CARTO__SUPPORT | _MASSIF__SUPPORT |
| Native library | libcarto_mobile_sdk.so | libmassif.so |
| Gradle artifact | com.carto:carto-mobile-sdk | com.massifmaps:massif |
| logcat tag | carto-mobile-sdk | massif |
CartoCSS keeps parsing the old spelling, with one deprecation warning per token per stylesheet:
nuti::x → param::x, nutiparameters → styleparameters, and the placements
nutibillboard → billboard, nutibillboardline → billboard-line, nutipoint → flat,
nuticallout → callout.
Deliberately not renamed, because they name data users already have on disk or upstream work,
not this SDK: the NUTi bitmap magic, nutikeysha1, .nutigraph / .nutigeodb,
__Nuti_pkgmgr_, cartodb_id, CartoCSS the language, and the CartoDB attribution.
Every renamed token is listed in docs/migration.md
(online).
Rebrand PR: #99.
New Features
#### 3D terrain
The map surface is displaced by a DEM elevation source (Mapbox or Terrarium RGB encoding), attached
with Options.setTerrainOptions(...). Every layer type renders on it — vector tiles, raster
overlays, hillshade, 3D buildings and vector elements — with a single shared depth model.
See docs/features/3d-terrain.md and
docs/internals/rendering/04-terrain.md.
- GPU draping. Elevation tiles are uploaded as GL textures and every draped vertex shader
replaces its z by sampling the shared texture, so all layers agree on heights exactly.
Polygon fills and backgrounds are baked into a per-tile render-to-texture drape (MapLibre's
model), cached across frames, so they follow the terrain with no holes or see-through.
TerrainOptions.NoDrapeLayerFilter (default ^contour.*) keeps hairline content at screen
resolution. (#17,
#21)
- Painter-order depth model, ported from tangram-ng: a terrain depth pre-pass is the single
depth source, so overlapping draped layers cannot z-fight while ridges still occlude what is
behind them. Red-green edge-local tesselation removes the T-vertex cracks at LOD transitions.
(#17)
- Matching DEM heights across tile edges. Elevation texture borders are backfilled from real
neighbours (texel-exact at the same level, sampled at border texel centres from a coarser
ancestor), and visible tiles now prefetch their own elevation tile and its neighbours through a
background worker instead of relying on map-tile fetches. Opt out with
setSeamlessTileEdgesEnabled(false) / setElevationPrefetchEnabled(false).
(#35)
- Camera and gestures are terrain-aware.
TerrainOptions.setCameraClearanceholds the camera
above the ground as a zoom bound rather than a corrective jump, panning keeps the touched terrain
point under the finger, and pinch/rotate take their scale and angle from the screen (tangram's
model) so a grazing ray can no longer cancel a gesture.
(#23,
#77)
- View distance and fog.
TerrainOptions.ViewDistanceFactorends the ground on tangram's rule
and the background plane and sky pick up the same fog; FarPlaneFactor controls the far plane.
(#39,
#49)
- Labels and billboards are anchored on the surface, hidden behind ridges via a depth readback
with hysteresis (setBillboardOcclusionEnabled), and keep a constant screen size.
- Also:
setMaxTileZoomOffsetcaps terrain LOD relative to camera zoom,setExaggeration,
setMeshResolution, setDrapeResolution, and getElevation/getElevations queries sharing the
elevation cache. Terrain is PLANAR render projection only.
#### Sky, sun lighting and shadows
LightOptions gains the sun (azimuth/altitude, or setSunPositionFromTime), intensity, ambient
and the shadow controls; TerrainShadowMap renders cascaded shadow maps (3×1024 by default),
snapped and cached so the caster pass only re-runs when the light box, caster set or tile content
changed. SkyOptions draws a ray-direction sky that an app can replace wholesale with
setShaderSource. StyleEnvironment::resolveLighting/resolveFog merge the app's options with
the CartoCSS Map block, per property and zoom-dependent, and light the fog itself — dark at
night, warm at a low sun — so ground, background plane and sky always agree.
(#27,
#40,
#29) —
docs/features/sky-sun-shadows.md
#### Data sources and tile formats
- MapLibre Tiles (MLT).
MBVectorTileDecoder.TileFormat=AUTO(default) /MVT/MLT.
Resolution order is an explicit setTileFormat, then the source's own metadata, then per-tile
detection (measured at 1 ns/tile for MVT, 19 ns for MLT). Everything downstream of the decode is
unchanged, so an app pointed at an MLT source needs no code change.
TileDataSource::getMetaData(key) is now a base virtual, forwarded by the cache, contour, ordered
and combined sources. (#90) —
docs/features/maplibre-tiles.md
ContourTileDataSource— on-the-fly contour lines from any RGB-elevation source via marching
squares, sharing its fetch and decode. Emits a contour layer with ele and div matching the
gdal_contour pipeline, so it drops into a normal VectorTileLayer with no style change.
Options for base interval, generation resolution, min zoom, simplify tolerance and seamless edges.
(#18) —
- GeoJSON sources are tiled from a geojson-vt pyramid instead of rescanning every feature for
every tile and keeping one re-simplified copy per zoom.
(#54) —
docs/features/geojson-vector-tiles.md
DirAssetPackageandAndroidAssetPackageload a style from a filesystem directory or from
the app's assets, so a style can be edited in place with no repackaging.
(#42)
#### Layers and styling
CompositeVectorTileLayerweaves named external sources (raster, hillshade, extra vector or
contour) into a master CartoCSS style's layer order, each placed at a matching layer name and
configured from a #name { … } block with zoom- and parameter-dependent expressions. Sources can
be added and removed at runtime. Single-pass rendering decodes the master style once and is the
default (setSinglePassRenderingEnabled(false) restores the per-group path).
(#19,
#20) —
docs/features/composite-vector-tile-layer.md,
CustomRasterTileLayerruns an app-supplied GLSL filter shader over any raster source;
HillshadeRasterTileLayer is now its DEM specialisation and gains shader-drawn contour lines
(setContourEnabled/Interval/Color/Width) evaluated per fragment at a fixed metre interval.
(#18) —
docs/features/custom-raster-shaders.md
- Hillshade matches MapLibre. The
STANDARDmethod is back at parity: the north-south aspect
mirror and the 90° azimuth error are fixed, applyLighting no longer divides out the slope
intensity, colours are premultiplied up front, and contrast / exaggeration are separated onto
MapLibre's meanings with matching defaults. CompositeVectorTileLayer gains zoomLevelBias so a
high-resolution DEM child can be fetched at more detail than the base map.
(#34) —
- Live style parameters. A
setStyleParametercall whose parameters only feed properties the
renderer evaluates per frame now answers with a repaint instead of a full re-decode of every
visible tile (~130 ms per tile before). Covers colour-only changes and selection parameters.
(#73,
#76) —
docs/features/style-parameters.md
- Post-process effects.
MapRenderer.setPostProcessEffect(...)renders the frame through a
custom fullscreen GLSL shader with the packed terrain depth available, plus
TerrainOptions.setSurfaceShaderSource for the terrain surface itself and runtime float/colour
parameters on both. Ships a PeakFinder-style relief-outline effect built entirely from these
hooks. (#56) —
docs/features/post-processing.md
CelestialLayerplaces objects that are not on the map — by direction (azimuth/altitude,
distance 0 = infinitely far) or by geographic position and altitude. CelestialSprite is a
camera-facing quad sized by angle or pixels, batched per bitmap so a catalogue of thousands is one
draw call; CelestialArc draws a circle about an axis, a path or disjoint segments. Both are
clickable — which also fixed the click path dropping any touch whose ray missed the ground.
(#55) —
docs/features/celestial-objects.md
#### Labels and text
- Variable shield placement (Mapbox/tangram-style: the name takes the free side) and **font
icons** instead of bitmap shields. (#57) —
docs/features/label-styling.md
- System fonts.
SystemFontUtilsresolves aface-namethe style does not package from the
device (Android scans /system/fonts and friends, iOS/macOS asks CoreText, UWP asks DirectWrite),
with style fonts keeping precedence. An inline CartoCSS string, which cannot carry a font asset
package, previously failed every label with Failed to load text font.
(#45)
- Font name lists on both text stacks — style
text-face-nameand every vector-element font
name — with optional per-platform entries. BalloonPopup, Text and popup buttons rasterize
through the platform text API and so never saw the system-font work at all; the SDK default
HelveticaNeue-Light is an iOS PostScript name that silently rendered as Roboto on Android.
(#101)
- Callout labels with a band, leader line and plate box.
(#78)
#### Camera, gestures and views
- The tilt may go below 0 so the camera can look above the horizon, keeping the camera in place
and pitching the view about it (dist(camera, focus) is preserved, so zoom, culling and the depth
budget are unchanged). Opt-in — the default tilt range is still (0, 90).
- Free roam is a mode:
Options.FreeRoamMode=OFF/LOOK/FIRST_PERSON. In
FIRST_PERSON, tilt and rotation pivot about the camera for every caller, so an orientation
sensor driving setTilt/setMapRotation behaves exactly like a one-finger drag, and two fingers
move instead of panning.
- A map view can be translucent:
setTranslucent(boolean)onMapView,TextureMapViewand
MSFMapView — with a transparent clear colour the frame is empty wherever the map does not paint.
Options.PanningSpeedMode(defaultANCHORED) controls whether a tilted pan re-derives its
scale from where the finger is now. (#55)
#### Geometry
ManeuverArrowBuildercuts the turn arrow a navigation app draws on a route: given a route
and a maneuver (a position, or the point index from a RoutingInstruction) it returns the piece
of the route around it as one WGS84 line feature, which the style draws with line-end-arrow —
no marker, no bitmap, no label. (#61) —
docs/features/maneuver-arrows.md
Performance
Measured on an Adreno 610 device unless stated; method, cameras and the candidates that measured as
not the bottleneck are in
docs/internals/performance-log.md and
docs/internals/rendering/10-performance.md.
| Area | Result | PR |
|---|---|---|
| Terrain pan (mid-range device) | 1.2 fps / 810 ms per frame → usable | #49 |
| Label re-anchoring on DEM load | 82% of the render thread, ~750 k elevation samples/frame → targeted per-tile path | #58 |
| City pan | 7.5 → 27 fps; GPU total 33 → 12 ms; 3.4× fewer geometry indices | #82 |
| Style load (symbolizer context) | 277 ms → 27 ms | #84 |
| Elevation refetching on terrain start | stopped | #80 |
| GeoJSON tile build (long lines) | 3.3× faster on device | #54 |
| Idle map | a still 3D map no longer re-renders every 16 ms | #27 |
| Release build | render and tile paths compiled at -O2 instead of -Oz | #63 |
| Valhalla | built without the 19 unused service actions | #64 |
| iOS static framework | LTO applied to the artifact that actually ships | #67 |
| Android build | ninja + ccache: 70.9 s cold, 13.8 s warm (one arm64 Release ABI) | #62 |
| SWIG regeneration | 28.3 s → concurrent passes | #66 |
BREAKING CHANGES
- Everything is renamed.
carto::→massif::,com.carto.→com.massifmaps.,
NT → MSF, Carto. → Massif., libcarto_mobile_sdk.so → libmassif.so,
_CARTO__SUPPORT → _MASSIF__SUPPORT. CartoCSS is the exception — the old spellings still
parse with a deprecation warning. (#99)
- CARTO's hosted services are removed with no renamed equivalent:
CartoOnlineVectorTileLayer
and the hosted basemap, the CARTO offline package endpoints, the hosted routing and geocoding
endpoints, and the API-key / app-registration flow. Bring your own TileDataSource and style, use
MBTiles or PMTiles offline, and the embedded Valhalla / SGRE engines for routing.
(#99)
- C++20 is required for Android, Apple and UWP (the MLT decoder's public headers use
std::span and std::ranges). (#90)
TerrainOptions.DrapeLinesEnablednow defaults totrue. Vector-tile lines over 3D terrain
are baked into the drape texture rather than drawn as geometry; set it to false for sharp lines
that keep their style width at any slope.
(#47,
#82)
TerrainOptions.FarPlaneFactordefaults to2, so a terrain app's far plane moves unless it
sets the factor to 0. (#49)
Options.setFreeRoam(bool)is replaced byOptions.setFreeRoamMode(FreeRoamMode)—
setFreeRoam(true) becomes setFreeRoamMode(FREE_ROAM_MODE_LOOK).
(#55)
ViewState.setTerrainMinCameraZis replaced bysetTerrainCameraReference(terrainZ, minCameraZ)
and is no longer exposed to bindings — it is renderer plumbing published once per frame.
(#77)
- **
TerrainOptionslosesPainterOrderDepthEnabled,RegularGridEnabledand
ElementTerrainSlack.** All three were pinned to their only working values; drop the calls, there
is no replacement. (#88)
- Removed classes:
NMLModelLODTreeLayer,On/OfflineNMLModelLODTreeDataSource,
NMLModelLODTreeEventListener, NMLModelLODTreeClickInfo, GDALRasterTileDataSource,
OGRVectorDataSource, OGRVectorDataBase, StyleSelector, StyleSelectorBuilder, and the
nmlmodellodtree build profile — none was in a buildable profile, so no working app binds them.
NMLModel the vector element is untouched.
(#88)
- The map now goes idle when nothing changes. It previously re-rendered continuously; anything
that quietly relied on a free frame every 16 ms must now request one.
(#27)
- Any change to
all/modules/.iregenerates the bindings, so *every platform binding must be
rebuilt** — gradle never runs SWIG.
Bug Fixes
Terrain
- Camera clearance is a zoom bound instead of a corrective event (#23)
- The drape no longer flashes white and rebuilds itself on zoom out (#30)
- Landcover fills no longer disappear in non-draped terrain mode (#32)
- 3D terrain labels stabilised, and the label/tile churn behind them cut (#31)
- The shadow sun altitude is floored for the shadow pass (#29)
- The view distance applies immediately and the ground behind it is fogged (#39)
- Far tiles no longer render flat — the elevation level is re-clamped (#38)
- Drape textures baked from a previous layer stack are dropped (#43)
- Labels no longer blink against the terrain depth buffer (#48)
- The map stays movable with the camera against the ground; the zoom pivot no longer drags the focus underground (#77, #82)
- The shadow caster set is kept a partition of the ground, cutting the shadow cost (#92)
- Terrain occludes 3D extrusions (#37)
Labels and vector tiles
- Labels no longer jump or disappear while panning — placement identity is stable across tile-set changes (#16)
- Composite child layers get their labels placed (#46)
- Line joins fixed, and contours stay meaningful zoomed out (#50)
- Halo width restored to what the single-raster build drew (#79)
- Terrain occlusion is queried with the camera the depth was rendered from (#87)
- A translucent layer no longer punches its shape out of every layer after it (#86)
- A terrain line is capped against the unpacked binormal (#74)
- Style attachments match in composite group filters (#28)
Layers, data sources and UI
- A long view distance no longer paves the horizon in fine tiles (#59)
- The pan axes no longer go arbitrary at a vertical tilt (#60)
PersistentCacheTileDataSourceno longer dereferences a failed tile (#24)MemoryCacheTileDataSourceattaches tile metadata (#25)- Android HTTP failures report the underlying Java exception (#26)
- A redraw is requested after
Layers::setAll(#69)
Build, platforms and tooling
- Valhalla upgraded to 3.8.3 (#103)
- Mac Catalyst archives work again — prelinking removed for the Catalyst slices and
date's
ios.mm pulled in for the timezone symbols (#104,
#106,
#107)
- iOS framework build and the published API reference repaired
(#100,
#102)
- An iOS demo bench mirroring
scripts/android-dev, with the camera readout overlay
(#68,
#70)
- CI: build caching, retry resilience and composite actions
(#110); the release body is generated with
the changelog and install instructions (#108);
release-tag drift now fails fast (#111–#118)
- 6261 lines of code the fork will not use removed, along with 23 empty translation units per
ABI per build (#88)
Documentation
- A documentation site with the generated Android and iOS API reference, deployed automatically
to <https://massif-maps.github.io/MassifMaps/>
(#22,
#105)
- Everything consolidated into one
docs/tree, browsable on GitHub and published verbatim,
including the rendering internals (#114,
#91) — the frame and threads, tiles and LOD,
the GL draw path, 3D terrain, the depth model, labels, hillshade and contours, lighting/sky/fog,
the composite layer, performance method, and a tangram comparison
[v5.0.0-rc.13] - 2025-10-11
New Features
332c6c6- add fetcDelay tostartDownloadAreato add delay between each tile request
[v5.0.0-rc.12] - 2025-06-30
Bug Fixes
15c9997- nutibillboardline fix (commit by @farfromrefug)
[v5.0.0-rc.11] - 2025-06-08
New Features
f23d26b- added the ?? operator for cartocss and mapnikvt (commit by @farfromrefug)
[v5.0.0-rc.10] - 2025-06-02
New Features
4ceb7d2- view::rotation and view::tilt (commit by @farfromrefug)
[vv5.0.0-rc.9] - 2025-05-25
Bug Fixes
c8a1f4d- valhalla non network penalty fix (commit by @farfromrefug)
[v5.0.0-rc.8] - 2025-05-13
Bug Fixes
64d3035- with position line shields should not be oriented (commit by @farfromrefug)
[v5.0.0-rc.7] - 2025-04-20
Bug Fixes
9a3256e- exclude_unpaved for bicycle (commit by @farfromrefug)
[v5.0.0-rc.6] - 2024-12-06
Bug Fixes
597cde4- valhalla fix
[v5.0.0-rc.4] - 2024-10-25
:bug: Bug Fixes
5.0.0-rc.2 (2024-08-30)
Features
- add map options to disable rotation gesture without disabling programmatic changes to rotation (f2ce639)
- add valhalla instruction to RoutingInstruction (5bd5a9e)
- added const predicate support (with
#variable) (f9f182b) - added doubleClickMaxDuration option (51f3861)
- added doubleClickMaxDuration option (533bdf8)
- added new options for
VectorTileSearchService:sortByDistance,layers,preventDuplicates(c890104) - added OruxDBDataSource (748de52)
- allow calculateRoute and matchRoute to return rawResult (a092b66)
- basic TextureMapView (78d3dc7)
- basic TextureMapView (85d31dd)
- custom normalmap shader support (ba27fc6)
- exagerateHeightScaleEnabled property (4269754)
- GeoJSONVectorDataSource all to add/remove single features (607350b)
- LocalPackageManagerTileDataSource (2df9f52)
- maxOverZoomLevel for DataSource (e7d7cd2)
- maxSourceOverzoomLevel (47cc12e)
- MultiOSMOfflineGeocodingService, MultiOSMOfflineReverseGeocodingService (92e4ece)
- MultiValhallaOfflineRoutingService (f6aae4f)
- new
LayersLabelsProcessedInReverseOrderOptionsproperty (e82e9fc) - new methods for
MBVectorTileDecoder:setJSONStyleParametersandsetStyleParameters(9ad8e69) - normal accent color (44394a3)
Bug Fixes
- added missing methods to MultiTileDataSource (c85e6ca)
- allow shield to have no shield image (5ec739c)
- allow to add a layer to another renderer. The usecase is when an android activity is re created. You might still have the reference to the native layer which you want to add back to the carto map. It is faster to only add it again than to re create all layers (9ba3241)
- android: add support for 16 KB page sizes (7fef879)
- better support for tileMask (a0c304e)
- correctly copy info.plist (1219ff0)
- correctly encode/decode GeoJSON properties for
GeoJSONVectorTileDataSourceso that properties with sub-objects are correctly returned inonVectorTileElementClicked(313eb38) - correctly handle click events on MultiPoint PointGeometry (bcd1e83)
- correctly handle valhalla route result (f73a239)
- correctly query points elevation (a8a65d8)
- ensure customParameters are always applied (8bda9ed)
- ensure pointIndex is good on multi leg/trip (659d10d)
- fix after merge (e304cfc)
- fix for api name change (148eaae)
- for now dont crash on wrong geojson feature (bfc62f9)
- fully fixed normalIlluminationMapRotationEnabled (14ba203)
- hillshade exageration fix on overzoom (b07c869)
- hillshade getElevation(s) handle isReplaceWithParent (d22602f)
- hillshader overzoom fix (19f48bd)
- if replaced with parent we should return the other one (c8ea35c)
- LocalPackageManagerTileDataSource working (96b14e9)
- missing update for LIGHTING_SHADER_NORMALMAP with accent_color (1195473)
- MultiDataSource supports maxOverZoomLevel (36320ad)
- request parent tile if isReplacedByParent (5108d4b)
- searchProxy fix by allowing searchRadius<0 to disable distance check (65102fc)
- shader dymanic change fix (09d144c)
- some JNI cleanup (6df0354)
- some MultiDataSource improvements (7e6c8bd)
- support lite mode (5af204d)
- try to fix build on macos (6357995)
- trying to improve workflow for versioning (8975155)
- ValhallaOnlineRoutingService allow creating without apiKey (65d8895)
- working MultiTileDataSource (renamed from LocalPackageManagerTileDataSource) (527b8b9)
CARTO Mobile SDK 4.4.7RC1
New features:
- Added support for generic expressions in CartoCSS 'Map' element.
- Added support for CartoCSS 'line-miterlimit' property, tweaked join handling in case of offsets/patterns.
- Generalized CartoCSS font support, added support expression based face names
Changes, fixes:
- Fixed Angle UWP related threading issues, if multiple views were used.
- Fixed minor synchronization issue with RasterTileLayer
- Improved handling of null blob in TileData
- Improved normal map building for overzoomed tiles, resulting is less artifacts.
- Improved reporting of .so loading errors on Android (re-throw original exception, instead of just logging/failing afterwards)
- Added handling of 'OnPointerExited' event in UWP MapView
- Build script fixes, fixes related tolatest Python versions, Android NDK25 support
CARTO Mobile SDK 4.4.6
Changes, fixes:
- Fixed minor rendering issue with lines joined at steep angles when BEVEL/ROUND join modes were used
CARTO Mobile SDK 4.4.6RC1
New features:
- Added 'getTimeout', 'setTimeout' methods to 'CartoOnlineTileDataSource', 'MapTilerOnlineTileDataSource' and 'HTTPTileDataSource'
Changes, fixes:
- Fixed iOS specific issue related to SDK not properly handling 'didBecomeActive' notifications, resulting in MapView not being rendered.
- Fixed critical synchronization issue on UWP platform related to stopping rendering loop.
- Fixed flickering issues when MapView was resized on UWP platform.
- Fix global pattern alignment when using 'polygon-pattern' symbolizer.
CARTO Mobile SDK 4.4.5
Changes, fixes:
- Fixed 'PersistentCacheTileDataSource' tile preload canceling not working
- Fixed several cases where tile datasources could be accessed with tile coordinates out of bounds
CARTO Mobile SDK 4.4.5RC1
New features:
- Added 'setFeatureIdOverride' and 'isFeatureIdOverride' methods to 'MBVectorTileDecoder'
- Added 'isAnimationStarted' method to 'MapInteractionInfo'
Changes, fixes:
- Fixed critical issue with non-ASCII string wrapping on UWP platform
- Fixed missing 'onMapInterAction' callback on double tap zoom
- Changed user initiated zoom behaviour when 'PIVOT_MODE_CENTERPOINT' mode is used, now screen center is used as a pivot point.
- Updated harfbuzz, libwebp and pugixml dependencies to latest stable versions
- Fixed stack overflow issue in external css2xml utility due to missing rules for EXP/LOG functions
- Added 'build id' to Android shared libraries, to help analyze Android native stack traces
CARTO Mobile SDK 4.4.4
New features:
- Feature id is now accessible in CartoCSS using 'mapnik::feature_id' variable
Changes, fixes:
- Fixed issues with 'feature id' handling in vector tile renderer when feature was used in multiple layers
- Updated harfbuzz dependency to the latest stable version
- Fixed wrong compilation profile used for UWP builds, resulting in missing a few features
- Dropped 'PersistentCacheTileDataSource' from 'lite' compilation profile, making 'lite' SDK build smaller
- Minor tweaks to built-in styles, related to admin boundaries
- Minor fixes related to non-standard SDK profiles
- Minor optimizations
CARTO Mobile SDK 4.4.4RC1
New features:
- Added 'getDefaultLayerBuffer', 'setDefaultLayerBuffer' methods to 'GeoJSONVectorTileDataSource'. This allows controlling buffer size (in tile pixels) for vector tile layers.
Changes, fixes:
- Restored support for arbitrary expressions in transform arguments (available in 4.3.x but removed from 4.4.0-4.4.3)
- Improved batching for transformed geometries, all non-translated geometries can be now added into a single batch.
- Fixed shield symbolizer issues where background was affected by fill color.
- Fixed several clipping related issues in 'GeoJSONVectorTileDataSource'
- Improved EAGLContext handling for iOS, workaround for a crash when a view is moved out of a window and then back
CARTO Mobile SDK 4.4.3
New features:
- Added an experimental option to configure various 'VectorTileLayer' parameters via project.json nutiparameters
- Added support for configuring vector tile map parameters via project.json
- Updated boost dependency to the latest stable version
Changes, fixes:
- Build script cleanup
CARTO Mobile SDK 4.4.3RC3
New features:
- Added 'getRendererLayerFilter', 'setRendererLayerFilter', 'getClickHandlerLayerFilter', 'setClickHandlerLayerFilter' methods to 'VectorTileLayer'. These methods allow ignoring certain layers for rendering or click detection.
- Added 'reverse' function support to CartoCSS 'text-transform'
Changes, fixes:
- Dropped 'doclava' based javadoc generation, documentation for Android is now based on standard JDK doclet
- Improved Android documentation by hiding unneeded wrapping related details
- Fixed regression in 4.4.3RC2 related to parallel requests to 'ValhallaOfflineRoutingService'
- Added better support for 'none' keyword in CartoCSS
- Minor improvements to error reporting for CartoCSS issues
- Fixes and cleanups in Android build script
- Updated internal FreeType library to latest stable version
- Minor speed and size optimizations
CARTO Mobile SDK 4.4.3RC2
Changes, fixes:
- Fixed 'TileLayer' not properly recalculating tiles when visibility changes, causing layer to remain hidden.
- Fixed deadlock in 'ClusteredVectorLayer' when its data source is non-empty with all elements being hidden
- Fixed stale tiles remaining in caches when offline packages were removed
- Fixed subtle synchronization issues in 'PackageManager'
- Added support for parallel requests to 'ValhallaOfflineRoutingService'
- Added javadoc to published Android artifacts to Maven central
- Minor fixes to iOS build script
- Updated internal libjpeg-turbo, harfbuzz libraries to latest stable versions
CARTO Mobile SDK 4.4.3RC1
Changes, fixes:
- Fixed critical coordinate scaling issue in iOS Metal build (occurs only with iPhone 6 Plus, iPhone 7 Plus and iPhone 8 Plus devices)
- Fixed regression in 'GeoJSONVectorTileDataSource' which caused parsing failure with features with non-object properties
- Optimized parsing of complex CartoCSS styles, improving performance by 20-40% for complex styles
- Optimized loading of compiled 'Mapnik' styles by using symbolizer cache, improving performance by up to 50% for complex styles
- Updated internal Valhalla, sqlite, harfbuzz, botan and protobuf libraries to latest stable versions
CARTO Mobile SDK 4.4.2
Changes, fixes:
- Fixed style fallback version in 'CartoPackageManager' (when using 'startStyleDownload' method)
- Changed exception type when encoutering unsupported geometry in 'GeoJSONVectorTileDataSource'
- Minor iOS build script fixes
CARTO Mobile SDK 4.4.2RC1
New features:
- Added 'setSimplifyTolerance', 'getSimplifyTolerance' methods to 'GeoJSONVectorTileDataSource'
- Added support for complex CartoCSS selectors ('when' selectors)
- Added support for 'bevel', 'none' linejoin modes and 'square' linecap mode in CartoCSS.
- Added 'marker-color' property to CartoCSS that can be applied to both file-based markers and built-in markers.
Changes, fixes:
- Started using API 31 as compilation target on Android
- Implemented better error reporting of undefined variables in CartoCSS translator
- Fixed deadlock in NMLModel.setRotation(axis, angle) method caused by improper synchronization
- Reimplemented 'setLayerFeatureCollection' method in 'GeoJSONVectorTileDataSource' to make it faster by skipping serialization/parsing steps.
- Implemented switching to 'bevel' linejoin at sharp angles when using 'miter' linejoin
- Fixed multiple issues with string escaping in parsers and generators in CartoCSS and MapnikVT library.
- Fixed minor issues related to internal expression -> predicate conversion in MapnikVT library.
- Fixed dash array generation for subpixel wide lines when rendering vector tiles
- Revised feature id generation logic in 'GeoJSONVectorTileDataSource', SDK now uses feature id, if available or a deterministic auto id generation when not available.
- Reduced default simplication tolerance for 'GeoJSONVectorTileDataSource', new default value should not generate visible simplification artifacts
- Converted CartoCSS 'marker-opacity' property to a view-level parameter, so it can be dependent on 'view::zoom'.
- Updated protobuf and harfbuzz libraries to the latest versions
- Disabled Sqlite locking extensions on iOS and MacCatalyst builds
- Minor optimizations
CARTO Mobile SDK 4.4.1
Changes, fixes:
- Set minimum target to iOS 10 for i386 simulator target (due to thread_local not supported on iOS 9)
- Added libc++, libz dependencies to modulemap of iOS framework
- Updated build scripts to support building Swift Packages of the SDK
- Fixed SDK/MetalANGLE linking issue with iOS Metal build causing uncaught exceptions due to networking problems
CARTO Mobile SDK 4.4.1RC2
Changes, fixes:
- Fixed excessive initialization times when MBTilesTileDataSource was used with databases not containing zoom level metainfo
- Fixed potential memory leaks on iOS when network requests fail
- Added 'setDoubleClickMaxDuration' and 'getDoubleClickMaxDuration' methods to Options class
- Added 'extends' support to JSON project files, to reduce copy-paste declarations in map project files
- Added support for CartoCSS 'line-offset', 'line-pattern-offset' attributes
- Added support for CartoCSS 'text-wrap-character' and 'shield-wrap-character' attributes
- Added the following color manipulation functions to CartoCSS: 'hsl', 'hsla', 'red', 'green', 'blue', 'alpha', 'hue', 'saturation', 'lightness'
- Fixed handling of 'text-min-distance' and 'shield-min-distance' CartoCSS parameters
- Improved label id generation for repeated labels, creating more stable label placements
- Minor tweaks to built-in styles
- Minor optimizations to iOS Metal build
- Updated libjpeg, libwebp, freetype, harfbuzz, miniz to latest stable versions
- Minor optimizations
CARTO Mobile SDK 4.4.1RC1
New features:
- Metal build of iOS framework now supports Mac Catalyst apps
- Added ClickInfo class, to store click related information (click type, duration)
- New mode for reducing click event latency when double click handling is not required
Changes, fixes:
- Re-implemented 'click type detection disabled' mode, click events are now triggered when finger is lifted
- Added setDoubleClickDetection, isDoubleClickDetection methods to Options class to allow reducing click handling latency
- Added setLongClickDuration, getLongDuration methods to Options class to allow configuring long click detection duration
- Classes like MapEventListener, VectorElementClickInfo now contain ClickInfo instance for additional click attributes
- Added support for decoding proprietary Apple 'PNG' files
- Fixed decoding of specific bitmap formats when using CreateBitmapFromUIImage on iOS
- Fixed Android bitmap decoding when non-standard stride sizes are used
- Fixed tile layer refreshing issue when data source bounds changed
- Fixed old view state being used when adding labels to the vector layer
- Updated built-in style asset, tweaked displaying of multilingual names
- Updated MetalANGLE library to the latest stable version, tweaked build settings to produce smaller binaries
- Updated font rendering libraries, tesselation library to the latest stable version
- Various minor optimizations
CARTO Mobile SDK 4.4.0
Changes, fixes:
- Fixed CartoCSS string-expression evaluation issue, causing some misoptimizations
- GeoJSONGeometryReader and GeoJSONGeometryWriter are now RFC7946 compliant and accept null geometry in features.
- GeoJSONVectorTileDataSource now supports features with null geometry and non-object properties
- Added support for shorthand-encoding of 'nutiparameters' in project.json files
- SDK now catches feature processing exceptions earlier and report thems without causing whole tile decoding to fail.
- Fixes to iOS build scripts
CARTO Mobile SDK 4.4.0RC4
Changes, fixes:
- Fixed iOS Cocoapod packaging issues, causing issues with MetalANGLE framework when used within other frameworks
- Introduced 'carto.utils.DontObfuscate' annotation for Android Java library. This can be used to finetune Proguard obfuscation rules.
- Optimized protobuf library compilation, making SDK binaries 3-5% smaller.
- Replaced Cryptopp library dependency in SDK with Botan library, fixing portability issues
- Enabled 'tile blending speed' attribute for HillShaderRasterTileLayer (default value is 0). This also fixes blending artifacts when using the layer.
- Various fixes and tweaks in SDK build scripts
CARTO Mobile SDK 4.4.0RC3
Changes, fixes:
- Fixed issues iOS with simulator targets not working due to problems with latest cryptopp library
- Fixed issues with some 32-bit Android targets due to problems with latest cryptopp library
- Fixed potential deadlock issue with TouchHandler class. Removed redundant 'onMapMoved' callbacks.
- Fixed potential deadlocks in AnimationHandler and KineticEventHandler when certain SDK APIs were used in MapEventListener callbacks
- Changed compilation flags for 32-bit Android targets to make then compatible with really old devices not supporting NEON extensions
- Tweaked compilation flags for Android, binary sizes are now about 10% smaller while critical code paths are better optimized
- Enabled Link Time Code Generation for UWP builds. This results in smaller and faster binaries.
- Various fixes and tweaks in SDK build scripts
CARTO Mobile SDK 4.4.0RC2
New features:
- Implemented smarter caching logic for CARTO online tile sources. New implementation can keep larger number of tiles in memory and uses better zoom-based tile prioritization during eviction.
- Added getLayerBlendSpeed, setLayerBlendSpeed, getLabelBlendSpeed, setLabelBlendSpeed methods to VectorTileLayer, for controlling transition animations.
- Added getTileBlendSpeed, setTileBlendSpeed methods to RasterTileLayer, for controlling transition animations.
Changes, fixes:
- Fixed critical regression in GeoJSONVectorTileDataSource causing 'unknown pbf type' errors
- Fixed rendering artifacts with larger halo radiuses in vector tile renderer
- Fixed regression with tile loading canceling, causing updates to vector tiles being slow
- Fixed potential synchronization issues regarding tile invalidation and caching
- Fixed layers not being correctly refreshed in rare cases
- Implemented more robust time interval calculation for transition animations
- Various fixes in build scripts
CARTO Mobile SDK 4.4.0RC1
New requirements:
- Android 3.0 (API 11), previously 2.3 (API 9)
- iOS 9.0, previously 7.0
- CocoaPods 1.10.1, previously 1.6
Key highlights:
- Much faster CartoCSS processing and compilation. Loading and initialization of CARTO vector layers is now about 3x faster.
- 30-40% faster vector tile decoding performance and 10% lower memory consumption during decoding.
- Reworked tile loading and prefetching algorithms to provide more responsive UX.
- 3D NML models can now be used together with bitmap markers, with same basic features (auto orientation, transition animations, overlap analysis)
- Built-in Valhalla 3.1 routing engine vs Valhalla 3.0 in SDK 4.3.x.
- New 'TextureMapView' class for Android for applications that need to use 'MapView' with fragments.
- Additional map callback that provides detailed information about the user interactions.
- SDK for iOS is now distributed as XCFramework. Previous SDK versions used Universal Frameworks with 'fat binaries'.
- There are now two prebuilt versions of iOS frameworks: a legacy version using OpenGLES rendering backend and a new version using OpenGLES -> Metal API converter that does not use deprecated iOS APIs.
- SDK built-in vector styles now include fonts and glyphs for Arabic, Hebrew, Georgian and Armenian locales.
New features:
- Added TextureMapView class and MapViewInterface interface to the SDK. TextureMapView is a subclass of android.view.TextureView and behaves better in apps built from fragments. MapViewInterface provides a common interface for both MapView and TextureMapView.
- Added getDescription method to RoutingInstruction. This provides textual description of the instruction. The description depends on the routing instruction, it can be either generated by the engine or by the SDK.
- Added UI based interaction callback to MapEventListener (onMapInteraction method). The callback receives detailed information about the type of the interaction.
- NMLModel is now a subclass of Billboard. This allows using billboard features like special scaling, orientation modes and transition animations for 3D models.
Removed features and API changes:
- Removed deprecated compressToPng method from Bitmap (replaced with compressToPNG)
- Removed deprecated NMLModel constructors (replaced with constructors with NMLModelStyle argument)
- Removed getGeometryTagFilters and setGeometryTagFilters methods from RoutingRequest. They are replaced with getPointParameter/setPointParameter methods (with 'geometry_tag_filter' parameter)
- Removed setResolution method from TorqueTileDecoder, changed 'resolution' definition for getResolution method to reflect actual resolution defined in CartoCSS
Changes and fixes:
- Tile prioritization during tile loading has been reworked to provide quicker feedback, by fetching shared parent tiles when appropriate
- Cancelling of tile loading and decoding is more flexible, puts less pressure on tile caches
- Removed duplicate points in Valhalla routing results, consecutive manuevers can now share the endpoints. This uses the same convention as other routing engines, but may potentially break apps that depend on the old behaviour.
- SolidLayer is now deprecated. If really needed, a custom VectorTileLayer or RasterTileLayer can be used instead.
- CartoOnlineRoutingService is now deprecated, third party online routing services should be used instead
- Address is now depreacted and will be removed in future versions. use GeocodingAddress instead (currently a subclass of Address)
- setRotationAngle, getRotationAngle methods are deprecated in NMLModel, use setRotation, getRotation instead.
- Added setRotationAxis, getRotationAxis methods to NMLModel
- Added setOrientationMode, getOrientationMode, setScalingMode, getScalingMode methods to NMLModelStyleBuilder
- Added getOrientationMode, getScalingMode, getModelAsset methods to NMLModelStyle
- All street names (separated using '/') are now included in Valhalla routing results
- Fixed billboard size animations not working when using BILLBOARD_SCALING_WORLD_SIZE size mode
- Fixed potential native crash when geocoding databases were corrupted
- Fixed potential native crash when map packages were corrupted
- Tweaked memory usage of offline packages, fixed potential issues with read/write access rights
- Made SolidLayer work in globe mode
- Added bitmap argument nullptr check to SolidLayer constructor
- Fixed lighting direction calculation in NMLModelLODTreeRenderer (wrong sign)
- Added getAnimationDuration method to TorqueTileDecoder
- Added Resolution property to TorqueTileDecoder for dotnet APIs.
- Fixed getParent method in MapTile to handle negative tile coordinates
- Fixed NMLModel rotation in globe rendering mode
- Fixed complex offline geocoding queries failing due to memory constraints
- Fixed slow loading of Torque tiles
- Optimized handling of color interpolation expression in vector tile renderer
- Started using latest FreeType and HarfBuzz libraries to render localized names
- Replaced 'msdfgen' Signed Distance Field glyph render with official FreeType SDF glyph renderer.
- Reduced memory reallocation when decoding vector tiles
- Dropped glyph preloading when generating fonts to speeds up map initialization
- Improved error reporting for CartoCSS interpolation expression issues
- Better handling and optimization of 'match' operator when compiling CartoCSS property sets
- Implemented various MBVT decoder optimizations, including decoded geometry cache
- Added extra vector tile label sorting rule, to make visible label selection more deterministic
- Added model color support for NML models. This can be set using setColor method in NMLModelStyleBuilder.
- Added support for generic 'frame-offset' filters for Torque styles. Previously only equal comparison was available.
- Added support for cumulative data aggregation for Torque layers
- Changed vector tile background rendering order, fixed stencil configuration detection when FBOs are used.
- Optimized rendering of VT layers with 'comp-op' defined.
- Fixed potential issues when calculating intersections with 3D polygons.
- Changed internal vector tile rendering order, rendering is done done strictly per-layer, not per-tile. This fixes issues when stencil buffer is not available or switched off (Torque rendering).
- Fixed orientation angle interaction with line placements in TextSymbolizer
- Tweaks to marker placements on line geometry when using MarkersSymbolizer
- Changed argument types of setCapacity in cache classes from unsigned int to unsigned long on iOS, so that >4GB caches can be used on 64-bit targets.
CARTO Mobile SDK 4.3.5
Changes/fixes:
- Minor documentation fixes and updates
CARTO Mobile SDK 4.3.5RC1
Changes/fixes:
- Fixed handling of 'CANCEL' touch actions in Android. This caused mishandling of following touch events.
- Fixed thread race issue when connecting Java directors, causing issues with classes instantiaton
- Changed iOS framework packaging. Fixed several issues with header files, added support for xcframeworks.
- Fixed performance issue when calculating scaling of 3D polygons
CARTO Mobile SDK 4.3.4
Changes/fixes:
- Fixed out of range memory access issues when packing large VT geometries
- Fixed an issue in VT line clipping implementation causing missing initial vertices in border cases
- Optimizations when converting GeoJSON data to vector tile format (GeoJSONVectorTileDataSource)
CARTO Mobile SDK 4.3.4RC1
Changes/fixes:
- Added support for setting routing parameters to SGREOfflineRoutingService (setRoutingParameter, getRoutingParameter methods)
- Added 'placement-priority' support for vector tile labels, allowing setting priorities for individual labels
- Added onSurfaceChanged event to MapRendererListener. This method is called when map is resized.
- Reduced rendering artifacts of wide dashed lines in vector tile renderer
- Better precision when compressing vector tile coordinates, fixes rare visual artifacts
- Fixed critical Xamarin iOS synchronization redrawing/disposing issues, causing exceptions
- Fixed VectorTileLayer rendering issue related to opacity handling
- Fixed watermark options being ignored after initial rendering
- Fixed non-opaque highlight/shadow color handling in HillshadeRasterTileLayer
- Additional safety checks in Android bitmap conversions
CARTO Mobile SDK 4.3.3
Changes/fixes:
- Fixed regression in label ray-hit detection routine when using globe mode
CARTO Mobile SDK 4.3.3RC2
Changes/fixes:
- Fixed critical content scaling issue on iPhone Plus devices
- Started using API 30 as compilation target on Android
CARTO Mobile SDK 4.3.3RC1
Changes/fixes:
- Fixed PersistentCacheTileDataSource not working with large cache files
- Faster initialization of PeristentCacheTileDataSource with large database files
- Tweaks and fixes to vector tile feature click detection, marker images are now used to detect transparent pixels
CARTO Mobile SDK 4.3.2
Changes/fixes:
- Fixed PersistentCacheTileDataSource not working with large cache files
- Changed PersistentCacheTileDataSource to be more conservative when estimating cache file size
CARTO Mobile SDK 4.3.2RC2
Changes/fixes:
- Fixed multiline RTL text formatting in VT renderer
CARTO Mobile SDK 4.3.2RC1
Changes/fixes:
- Added two new properties to HillshadeRasterTileLayer: shadow color and highlight color
- Minor optimization: avoid tile reloading when listener is disconnected from the layer.
- Slighlty higher background thread priority for tile/data loading tasks
- Added dynamic thread creation to CancelableThreadPool when all workers are busy with lower priority tasks.
- Fixed transform/orientation being ignored when flipping vector tile labels
- Enabled SIMD optimizations for WebP image library for slight performance boost
CARTO Mobile SDK 4.3.1
Changes/fixes:
- Fixed a crashing issue with ClusteredVectorLayer
- Minor documentation updates
CARTO Mobile SDK 4.3.1RC1
Changes/fixes:
- Added HillshadeRasterTileLayer to the SDK. It can be used to add additional height-based shading to the map.
- Added getTileFilterMode/setTileFilterMode methods to RasterTileLayer. This allows to choose raster tile filtering mode between point, bilinear and bicubic filters.
- Changed lighting vector calculation for globe mode - the lighting vector is now always based on the local tangent frame of focus point
- Deprecated compressToPng method in Bitmap class, use compressToPNG instead
- Fixed issues with HTTPTileDataSource when multiple tile download threads were used on iOS, by making HTTPClient thread safe
- Fixed potential native crash when thread pool is downsized
- Fixed thread race between layers and renderers when GL context was lost
- Fixed compatibility issues with older GPUs not supporting high precision in fragment shaders
- Slightly better error reporting for CartoCSS errors
- Slightly better error reporting for PNG reading errors
CARTO Mobile SDK 4.3.0
Changes/fixes:
- Fixed linking issue with Xamarin iOS build
- Minor optimizations for Android build when using JNI
- Minor logging cleanup
- Documentation changes
CARTO Mobile SDK 4.3.0RC3
Changes/fixes:
- Changed shading of building symbolizers in VT renderer. The lighting is now NOT applied to the top of the building. This matches the behavior of Mapnik.
- Enabled support for rendering buildings with negative height in VT renderer
- Fixed cyclical resource manager referencing, causing memory leaks on Android
- Fixed potential timing related crashes happening when disconnecting layers from MapRenderer
- Fixed a deadlock regression in 4.3.0RC2 when bitmap texture cache was released
- Fixed an issue in layer removal code that could cause removing more layers than intended
CARTO Mobile SDK 4.3.0RC2
Changes/fixes:
- Fixed memory leak when switching render projection
- Thread safety fixes when adding/removing layers to the map
- Fixed memory leak in iOS implementation of HTTPClient
- Throw exception instead of crashing when null ptr is used as an argument for Bitmap constructor
- Fixed very high memory consumption when calling getServerPackages method in PackageManager class
- Optimized internal representation of tilemask, reduced memory usage by 5x
- Fixed RasterTileListener not working (regression in SDK 4.2.x vs 4.1.x)
- Fixed issue with font shaping when '\n' symbol is used in text
- Fixed texture coordinate artifacts when using dashed lines in VT renderer
- Removed unneeded error from the log when translating CartoCSS expressions ('Unsupported text expression type ..')
- Updated the way CartoCSS 'marker-feature-id' and 'text-feature-id' properties treat null/zero values and empty strings: now using these special values forces SDK to generate 'auto id'
- Fixed potential vector tile rendering issues on devices that supported OpenGL Vertex Array extension
- Optimized resource usage when layers are removed from the map, the resources are released sooner than before, resulting in smaller application memory footprint
- Fixed rare display corruption issues when OpenGL surface was lost and layers were being removed from the map
- Fixed styling issues with VectorLayers when bitmaps were shared between different vector element styles
- Implemented proper 'line-cap' support for dashed lines
- Added 'custom parameters' option to GeocodingRequest and ReverseGeocodingRequest classes. Custom parameters can be used to customize specific parameters of geocoding engines.
CARTO Mobile SDK 4.3.0RC1
This version is a major update and brings several new features and optimizations. Note that due to the inclusion of Valhalla 3,
then binaries of the SDK are considerably larger on Android compared to SDK 4.2.x.
Key highlights:
- Valhalla 3 routing support. Valhalla 2 routing was supported in SDK 4.1.x and removed from SDK 4.2.x. This release brings Valhalla back but with new major version and lots of improvements. Note that previous Valhalla 2 offline packages are incompatible with Valhalla 3 and can not be used.
- Support for building the SDK with Metal rendering backend on iOS, instead of OpenGLES. This is currently still experimental, as it generates larger binaries and is a bit slower.
New features:
- A fully featued matchRoute API for matching points to routing network and extracting routing attributes.
- Added custom metadata support for Layer class (getMetaData, setMetaData, containsMetaDataKey methods in Layer class)
- Support for rendering basemap Point-of-Interests, API for directly controlling POI/building rendering mode (setPOIRenderMode/getPOIRenderMode methods in CartoVectorTileLayer class)
- API for controlling the render style of basemap buildings (setBuildingRenderMode/getBuildingRenderMode methods in CartoVectorTileLayer class)
- Added 'custom parameters' option to RoutingRequest and RouteMatchingRequest classes. Custom parameters can be used to customize routing schemas of specific routing engines.
- New helper classes FeatureBuilder and VectorTileFeatureBuilder
- Moved matchRoute method to base RoutingService interface
- Moved setProfile/getProfile methods to base RoutingService interface
- Moved setLanguage and setAutocomplete methods to base GeocodingService interface.
- Added setMaxResults and getMaxResults methods to base GeocodingService interface.
- Moved setLanguage method to base ReverseGeocodingService interface.
- Added setClickRadius and getClickRadius methods to VectorTileLayer
- Added setMaxResults and getMaxResults methods to all search services. Note that searches are now capped, thus applications may need to configure the limit appropriately.
- Added 'uppercase', 'lowercase', 'length', 'concat', 'match', 'replace' functions to CartoCSS compiler.
- Added 'regexp_ilike' operator to the search API query language to perform case-insensitive substring matching
- Added support for ARM64 UWP target, removed deprecated ARM UWP target.
Changes/fixes:
- setGeometryTagFilters, getGeometryTagFilters methods in RoutingRequest are deprecated and will be removed in future versions. Instead use more general setPointParameter/getPointParameter methods with 'geometry_tag_filter' parameter name.
- Labels from different VectorTileLayer instances that have 'allow-overlap' flag set to false no longer overlap each other. This changes previous behavior where each VectorTileLayer did not affect other layers.
- SDK does not throw exception anymore when package manager device keys do not match, this fixes issues with TestFlight on iOS
- Tweaked and optimized offline geocoder, mostly affects autocomplete mode
- Better reporting of online Valhalla routing errors
- Added ferry instruction types (enter/leave ferry) to RoutingAction enum
- Fixed search API issues with tiles and non-closed polygons
- Tweaked rendering of lines with round join types to look smoother, especially when used with thin lines
- Suppressed GLKView deprecation warnings on iOS
- Additional NPE safety in OnlineNMLModelLODTreeDataSource
- Fixed native crash when loading 0-sized image files
- Minor improvements to CartoCSS error reporting.
- Made Mapnik-level string expression parsing recursive, fixes subtle issues with complex expressions
- Better SVG compatibility with RGBA color support
CARTO Mobile SDK 4.2.2
Changes/fixes:
- Fixed iOS specific compilation warning in NTExceptionWrapper.h ("This function declaration is not a prototype")
- Disabled LTO on iOS builds (fixes issue with bitcode generation on iOS platform)
CARTO Mobile SDK 4.2.2RC2
Changes/fixes:
- Fixed vector tile click radius of points if 'allow-overlapping' flag was set to true
- Fixed name wrapping of setWatermarkPadding method in Options class on iOS (was setWatermarkPaddingX, now setWatermarkPadding)
- Clearer error reporting when parsing CartoCSS styles
- Improvements and tweaks to text-on-line rendering in vector tiles
CARTO Mobile SDK 4.2.2RC1
Changes/fixes:
- Additional synchronization for iOS events to prevent potential GL calls while app is paused
- Fixed wrong rendering of vector tile labels using 'point-placement' mode
- Fixed vector tile label transformation handling
- Speed and memory usage optimizations for vector tile labels
- Minor improvements to CartoCSS error reporting
CARTO Mobile SDK 4.2.1
Changes/fixes:
- Optimized symbol tables in Android .so libraries so SDK is now 5% smaller
- Fixed a potential NPE crash in VT glyph rendering code
CARTO Mobile SDK 4.2.1RC2
Changes/fixes:
- Tweaks to built-in styles to better prioritise rendering of low rank street names
- Better Mapnik compatibility by supporting linestring geometry in PolygonSymbolizer, PolygonPatternSymbolizer and BuildingSymbolizer
- Minor tweaks to line placement clipping against frustum in VT renderer
- Use constant padding around labels, fixes obscure issues with label click area for long texts
- Fixed issue with label click handling - due to label geometry merging wrong geometry was returned in certain cases
CARTO Mobile SDK 4.2.1RC1
Changes/fixes:
- The SDK can now be used without calling registerLicense method of MapView class if CARTO basemap services are not needed. In 4.2.1 and later versions we are showing normal CARTO watermark instead of evaluation watermark in this case.
- Added MapTilerOnlineTileDataSource class that can be used for MapTiler or OpenMapTiles tiles
- Added getGeometryTagFilters/setGeometryTagFilters methods to RoutingRequest; they can be used to filter routing endpoints. This is currently supported only when using SGRE routing engine.
- ValhallaOnlineRoutingService is now included in the standard SDK build. It was available in 4.1.x versions but removed from 4.2.0.
- Added clear methods to VariantArrayBuilder and VariantObjectBuilder classes
- Changed the behavior or MapView screenToMap and mapToScreen methods if called before view size is initialized - the SDK now returns NaNs
- CartoPackageManager constructor now throws an exception if it is instantiated without a valid license
- protected loadConfiguration method in CartoOnlineTileDataSource is no longer exposed
- Fixed MapView background clearing issue with Android Q beta versions
CARTO Mobile SDK 4.2.0
Changes/fixes:
- Added support for 'marker-feature-id', 'text-feature-id' and 'shield-feature-id' CartoCSS properties for uniquely identifying labels
- Fixed regression in 4.2.0RC2 vs RC1 regarding VectorTile hit results ordering
- Fixed render projection switching issues in 4.2.0RC1/RC2
- Fixed kinetic rotation clamping issue in 4.2.0RC1/RC2
- Fixed culling related performance issue in ClusteredVectorLayer
- Guards against null pointer exceptions in ClusteredVectorLayer when interfacing with custom builder
- Better handling of horizontal offsetting in TileRenderer
CARTO Mobile SDK 4.2.0RC2
Changes/fixes:
- Added BalloonPopupButton and related classes so that basic interactivity can be added to BalloonPopups
- Major SGRE optimizations: replaced one-to-one routing engine with many-to-many routing engine, using optimized data structures for routing
- Fixed/improved label ordering in vector tile renderer: prefer bigger labels over smaller ones
- Fixed geometry simplifier attached to LocalVectorDataSource causing a crash
- Fixed multiple issues with billboard sorting and ray casting.
- When calculating actual ray hit with billboard or point, SDK now uses actual bitmap to detect if the clicked pixel is transparent
- Implemented more consistent ordering of vector elements
- Changed billboard rendering to ignore depth testing. Better fit with 3D objects.
- Fixed potential rendering issue with GeometryCollections when switching between planar/spherical rendering mode
- Fixed ray-intersection code with Polygon3D, use the closest intersection point, not the first found point
- Fixed subtle flickering in ClusteredVectorLayer animations
- Minor performance optimization by using platform-optimized zlib
- Fixed getElementClickPos method of PopupClickInfo to return click coordinates as pixel coordinates, not normalized-to-size coordinates
- Fixed issue in SDK4.2.0RC1 that caused map rotation to change when setting focus position in globe view mode
- Fixed GeometryCollectionRenderer to accept both clockwise and counterclockwise oriented polygons
- Documentation fixes
CARTO Mobile SDK 4.2.0RC1
This version is a major update and brings lots of new features and optimizations. Some features present in older releases are removed or deprecated in this version.
Key highlights:
- Globe view support. Maps can be displayed in planar mode (as in previous versions) or in globe view mode.
- EPSG4326 support. WGS84 coordinates can be directly used without needing to convert them to EPSG3857.
- Indoor 3D routing by using GeoJSON input and custom routing profiles. We pulled experimental versions with this into 4.1.x releases, but have since made some changes and stabilized it.
- On-the-fly conversion GeoJSON to vector tiles, so that CartoCSS can be used for styling.
- Faster basemaps with several rendering optimizations.
- Better compatibility with Swift on iOS. SDK does not require bridging header anymore and can be simply 'imported'.
- Faster networking on iOS, by better utilizing OS-provided caching.
- Increased security, all basemap services use HTTPS connection by default.
- Startup time on Android has been significantly reduced. Previously low-end devices required more than a second to load the native SDK component. This loading time is reduced by at least 5 times.
- Basemap style parsing and loading is now faster due to smaller font assets and due to internal optimizations.
- SDK is considerable smaller due to several factors:
- We have removed offline Valhalla routing support from the SDK. It is still available in the repository and SDK can be built with it.
- We have removed some font assets from the SDK, so Arabic and few other scripts need external fonts.
- We use carefully tuned compilation flags that produce smaller native binaries on all platforms.
- All SDK components are now open-source. In previous versions we kept one small component (LicenseManager) private, so custom builds could not connect to online services provided by CARTO. Now this restriction is removed.
- Improvements to build scripts, making compiling the SDK easier and less frustrating experience.
New features:
- Added EPSG4326 projection. This allows to use longitude/latitude coordinates in the SDK directly, without the need to convert them first.
- New class GeoJSONVectorTileDataSource - provides on-the-fly conversion from GeoJSON layers to vector tiles. This is useful for indoor mapping and allows to use SDKs vector tile renderer with CartoCSS styling.
- New class SGRERoutingService for indoor routing. Additional details can be found in Wiki.
- New class MergedMBVTTileDataSource that merges two MapBox Vector Tile sources into one.
- Added addFallbackFont method to VectorTileDecoder class. This can be used to supply universal fallback font (as binary .TTF asset) for basemaps.
- Added setRenderProjection/getRenderProjection methods to Options class, for switching between planar and globe mode.
- Implemented 3D coordinate support for VectorElements. Previously only billboards handled Z coordinate properly, while using non-zero Z coordinate for polygons or lines produced undefined and usually wrong results.
- Added setZBuffering/isZBuffering methods to VectorLayer. Z buffering may be needed if 3D coordinates are used for lines or polygons.
- Added NMLModelStyle and NMLModelStyleBuilder classes for constructing style instances for NMLModels.
- New HTTP connection class for iOS that works better with device proxy settings and provides better download concurrency.
- Added setSkyColor, getSkyColor to Options class
- Added getMidrange method to MapRange
- Added shrinkToIntersection method to MapBounds
- CartoCSS improvements, 'marker-clip' support, 'north-pole-color', 'south-pole-color' map settings support
Deprecated features:
- NMLModel constructors with explicit model assets are now deprecated. Use constructors with NMLModelStyle argument instead.
Removed features:
- Built-in map styles are now smaller and load faster due to fewer built-in fonts. Arabic and few eastern scripts that were displayed in previous versions now require custom font assets. These can be supplied to VectorTileDecoder using addFallbackFont method.
- Removed setSkyBitmap/getSkyBitmap methods from Options class. Sky bitmap usage was poorly documented and relied too much on internal implementation. Use setSkyColor instead of setSkyBitmap.
- simplify method is no longer exposed in GeometrySimplifier class and its subclasses.
- Frustum class is removed from the SDK.
- ViewState class does not expose getCameraPos, getFocusPos, getUpVec, getFrustum methods starting from version 4.2.
- setProjectionMode/getProjectionMode methods are removed ViewState class. Setting projection mode never really worked.
- Removed fromInternalScale method from Projection. This method was never expected to be part of public API and was not useful for applications.
- ValhallaOnlineRoutingService, ValhallaOfflineRoutingService and PackageManagerValhallaRoutingService classes are removed from the public build. SDK used customized version of Valhalla that is not compatible with the latest official Valhalla versions and the library made SDK binaries considerably larger. Valhalla support is still present in the code, it is possible to build a custom version supporting these classes.
- CartoVisBuilder and CartoVisLoader classes are removed from the SDK. These classes provided experimental 'vizjson' support, but were never really complete. 'vizjson' is now deprecated by CARTO.
Changes:
- All online connections to CARTO services are secure by default. Previously some non-critical services used plaintext connections, causing problems with some newer devices (Android 9) having strict security settings.
- MapView screenToMap now returns NaNs in coordinates if mapping from a given pixel is not possible (tilted map when using sky coordinates, for example)
- EPSG3857 toWgs84 does not return longitude in range -180..180 if the input X coordinate is outside of projection bounds.
- Default panning bounds is now ((-inf, -inf), (inf, inf)) instead of EPSG3857 bounds as in previous versions.
- Sky rendering implementation and default sky color has changed
- Restricted panning mode implementation and behaviour has slightly changed
- All internal fields of wrapped SDK classes on Android are now marked 'transient' and are never serialized. In previous versions trying to serialize/deserialize SDK classes caused native crashes during subsequent GC cycle. The new behviour should result in NPEs and not hard crashes.
- Algorithm for placing text on lines in vector tile renderer is re-implemented and should fix previously distorted placements
- iOS HTTP network stack now uses NSURLSession API for better performance and compatibility. Note that this may cause issues with custom HTTP datasources that do not use secure protocol.
- Much faster handling of [view::zoom] parameter in CartoCSS expressions
- Slightly more compact internal vector tile representation for rendering, gives better tile cache utilization and faster performance
Fixes:
- setColor, setBitmap, setBitmapScale methods in SolidLayer class properly update the view when called.
- Fixed a memory leak in Java-specific BinaryData constructor taking byte array argument
- Fixed setPreserveEGLContextOnPause not properly invoked in Android MapView class
- Improved compatibility with Android devices with very old GPUs
- Minor search API query language fixes, better support for unicode strings
- Fixed vertex array binding issues with NMLModel rendering
- Fixed minor glyph rendering issues causing glyphs to be slightly blurry under tilted view.
- Minor CartoCSS fixes related to patterned symbolizer support
- Fixed OrderedTileDataSource handling of 'replace with parent' flag
CARTO Mobile SDK 4.1.6
This update includes performance and stability improvements,
bug fixes and some minor new features. A new routing engine is introduced
as an experimental feature.
New features:
- Added experimental indoor routing support via SGREOfflineRoutingService class.
Fixes/changes:
- A reworked implementation of HTTP connection worker for iOS that fixes airplane mode switching issues.
- ValhallaOnlineRoutingService now connects to MapBox online service instead of defunct MapZen online service
- Added matchRoute method to ValhallaOnlineRoutingServices
- Added 'wheelchair' routing profile support for Valhalla routing services
- Optimized MBTilesTileDataSource constructor with no explicit minZoom and maxZoom arguments, zoom range is now read first from 'metadata' table. If this fails, full table scan is performed.
- getDataExtent method of MBTilesTileDataSource is now more robust for bad values in 'metadata' table
- GeometryCollectionStyle can now be used when importing FeatureCollection consisting of normal points, lines, polygons to LocalVectorDataSource
- Fixed OrderedTileDataSource getMaxZoom method implementation
- AssetPackage class can now be subclassed from applications
- SDK now handles empty vector tiles as a general case, renders them with background color, not as transparent tiles.
- Compatibility fix for CartoOnlineVectorTileDataSource by handling 404 code according to server changes (display empty ground tile)
- Added missing header to iOS umbrella header (NTCombinedTileDataSource.h)
CARTO Mobile SDK 4.1.4
This update includes performance and stability improvements,
bug fixes and some minor new features.
New features:
- Exposed TileUtils class with several static methods as part of public API
- SDK now supports custom service URLs as online source ids
Fixes/changes:
- Fixed Android HTTP connection class to use specified request method (previously always GET)
- Fixed JNI local reference overflows in Android HTTP connection class (with HTTP servers returning very long lists of headers).
- Removed unneeded iOS dependency of libstdc++.6 in Cocoapod, fixes build issues with iOS 12
- Fixed the issue with delayed layer initialization, layers were not automatically rendered
- Fixed several options not correctly reflected in renderer state when changed after the MapView was initialized
- Fixed infinite loop in TileLayer update method when called with inconsistent state (zero view dimensions)
- Fixed value clamping issue with Torque tiles (all floating point numbers were rounded to integers)
- Optimized CartoCSS compiler with 10% reduced map initialization time and faster tile loading time
- Better error reporting of CartoCSS issues
- SDK now uses default background bitmap in case of vector basemap with no background defined
- Bitmap class decoder now supports automatic ungzipping. This is a fix for wrongly configured HTTP servers that send gzipped images even when this is not included in accepted encodings.
- Fixed CartoNamedMapsService ignoring template parameter values when instantiating named maps
- Fixed several grouped marker symbolizers being represented by a single marker
- Fixed threading issue with online license management causing potential API token missing from initial HTTP requests
- Fixed WebP library embedding on iOS targets (Xamarin/native), WebP symbols were previously exported, causing potential linking conflicts
- Made Xamarin.iOS build compatible with 'Linker behaviour = Link All' mode by explictly preserving symbols used through reflection
CARTO Mobile SDK 4.1.3
This update includes performance and stability improvements,
bug fixes and some minor new features.
New features:
- Added support for TomTom online geocoding services (TomTomOnlineGeocodingService and TomTomOnlineReverseGeocodingService)
- Implemented multilanguage support for offline geocoding classes (getLanguage, setLanguage methods in OSMOfflineGeocodingService and PackageManagerGeocodingService classes)
- Implemented localization support for Pelias geocoding results (getLanguage, setLanguage methods in PeliasOnlineGeocodingService)
- Implemented proper location bias for all geocoding services, 'location radius' is no longer needed for bias to work
- Implemented opacity attribute for layers (setOpacity, getOpacity). Note that when used (opacity < 1.0), then this feature may have significant performance impact.
- Implemented background color and border support for Text vectorelements (TextStyleBuilder class)
- Implemented ‘break lines’ flag for texts (TextStyleBuilder class)
- Added online API key interface to CartoMapsService and CartoSQLService
- Added NTExceptionWrapper class for catching/handling SDK exceptions in Swift
Fixes/changes:
- Min API level on Android is now 10 for Xamarin
- Performance fix for CARTO Maps API - use cacheable requests when instantiating named and anonymous maps
- Fixed regression in SDK 4.1.x vs 4.0.x - packages with incomplete zoom levels had wrong tilemasks after serialized/deserialized in database
- Fixed bounds calculation for NML models
- Fixed zoom level handling in ‘restricted panning’ mode
- Fixed ‘restricted panning’ mode when tilt is applied
- Fixed tile cache invalidation issue when all packages are removed from PackageManager
- BalloonPopupStyleMargins class getters were not wrapped as properties for dotnet platforms previously, fixed now
- Optimized label handling in VT renderer for zoom levels > 14
- Optimized 3D buildings and transparent layers in VT renderer on GPUs that use tiled rendering
- Distance based filtering in search API is more robust now (for coordinate wrapping, etc)
- Fixed WKTGeometryWriter to NOT use scientific encoding
CARTO Mobile SDK 4.1.2
This is a maintenance release for SDK 4.1.x containing mostly fixes
but also some new features. This version deprecates support
for external MapZen services due to the services being closed.
New features:
- SDK has support for MapBox online geocoding services.
New classes MapBoxOnlineGeocodingService and MapBoxOnlineReverseGeocodingService can be used for this.
- All MapZen online service (Pelias and Valhalla) wrappers now include additional methods for specifying custom service URLs.
This feature was added as MapZen closes all online services as of February 2018.
- Added optional ‘restricted panning’ support to avoid zooming/panning outside world map area. If turned on, then map area is restricted to maximize visible map. This can be turned on/off using Options.setRestrictedPanning method
- Added custom service URL support for Pelias and Mapbox geocoders and Valhalla routing
- API documentation for iOS is using Jazzy tool, instead of Doxygen. This allows us to show both ObjectiveC and Swift syntax for the API.
Fixes/changes:
- Implemented fine-grained clipping in VT loader - reduces drawing of invisible geometry and improves performance
- Removed MapZen-specific handling from CartoOnlineTileDataSource
- Smaller built-in style asset due to optimized fonts
- Proper handling of line-placement of markers and texts with polygon geometry
- Fixed C#-specific API wrapping issue: Polygon3DStyleBuilder and Polygon3DStyle SideColor property was not properly wrapped
- SDK includes latest version of CARTO styles, with minor fixes
- Improved text placement along lines in vector tile renderer
- Fixed text wrapping in vector tile renderer when ‘wrap-before: true’ mode was used
- MapZen-specific code is removed from CartoOnlineVectorLayer
- Minor optimizations in vector tile renderer for faster rendering of transparent features
CARTO Mobile SDK 4.1.1
This is a maintenance release for SDK 4.1.x containing mostly fixes
but also some new features.
New features:
- Implemented route matching support in ValhallaOfflineRoutingService and PackageManagerValhallaRoutingService classes
- Included NMLModelLODTree in the build (missing from all previous 4.x builds)
- Added postcode to geocoding responses
- Implemented building-min-height parameter for CartoCSS
- Improved support for offline Valhalla routing with multimodal profile
Fixes/changes:
- Improved text placement in vector tile renderer with texts that have non-zero vertical offsets
- Improved tilting gesture handling on UWP
- Performance optimizations for MB vector tile decoder
- Pelias Online geocoding fixes
- Text rendering quality improvements
- Improvement of Mapnik XML styling reader
- Fixed building height issue with built-in basemaps when 3d buildings are enabled
- Fixed vector tile layer elements missing at zoom level 24
- Fixed http:// and https:// handling when accessing CartoCSS external resources
- Fixed subtle background rendering issues on iOS (PowerVR) due to insufficient precision in fragment shaders
- Fixed UWP specific issue - do not try to create EGL context when panel size is 0
- Fixed custom HTTP headers being ignored when using HTTPTileDataSource
- Fixed basemap 3D building height calculation
- Fixed z-fighting/flickering issue with overlapping basemap 3D buildings
- Fixed minor rendering issues with NMLModelLODTreeLayer
- Fixed a small memory leak with vector layers containing NMLModels
- Documentation fixes
CARTO Mobile SDK 4.1.0
This is a major release containing many new features, fixes and performance
optimizations.
Key highlights:
- SDK now supports geocoding and reverse geocoding. For offline geocoding, custom geocoding packages can be used through PackageManager. We have provided country-based packages (bigger countries like US, Germany have split packages) but custom packages based on bounding box can be also used. For online geocoding, SDK includes wrapper class for MapZen Pelias geocoder; your MapZen API key is required for that.
- SDK has optional support for MapZen Valhalla routing. This feature requires a special SDK build as the routing engine is fairly complex and makes compiled SDK binaries approximately 30% larger. Compared to the custom built-in routing Valhalla routing packages are univeral - single package can be used for car, bicycle or walking profiles. We have prepared country-based packages that can be downloaded using PackageManager. Also, custom packages based on bounding box are supported. For online Valhalla routing, SDK includes wrapper class that uses MapZen Mobility API.
- New built-in styles and vector tile structure. This change is backward-incompatible due to two reasons: the old styles are removed from the SDK and new styles require different tile and offline package sources. New styles are better optimized for lower-end devices and have more consistent information density on all zoom levels. Also, new styles are based on view-dependent zoom parameters instead of tile-based zoom parameters, which gives much more pleasant zooming experience and cleaner visuals at fractional zoom levels.
- SDK supports offline searching features from various sources (VectorTileDataSource, FeatureCollection, VectorDataSource) via unified search API. The search API supports search requests based on geometry and distance, metadata and custom SQL-like query language.
- The VectorElements appearing on the map can now have transitioning animations. This is currently supported for billboards only (markers, texts, popups). Different animations styles are supported and the effects can be customized.
- SDK 4.1 has major speed and memory usage improvements when using ClusteredVectorLayer class. Performance can be up to 10x better compared to SDK 4.0.x and memory usage 2x lower.
- Lots of lower level performance and memory usage optimizations, mostly related to vector tiles.
API changes:
- The new built-in styles (Voyager, Positron, Darkmatter) use different data schema and are not compatible with nutiteq.osm source. Instead, "carto.streets" source must be used. This applies to both online tiles and offline map packages. The old styles (Dark, Grey, Nutibright) and data source continue to work for now, but are no longer included in the SDK and must be downloaded/applied separately. Offline map packages are not updated for nutiteq.osm source.
- The old nutibright, dark and grey styles are no longer included in the SDK and as a result the following CartoBaseMapStyles are removed: CARTO_BASEMAP_STYLE_DEFAULT, CARTO_BASEMAP_STYLE_GREY, CARTO_BASEMAP_STYLE_DARK. Instead, new styles CARTO_BASEMAP_STYLE_VOYAGER, CARTO_BASEMAP_STYLE_POSITRON, CARTO_BASEMAP_STYLE_DARKMATTER should be used.
- Public constructors from various vector element Style classes are now hidden, these classes can now be instanced only through corresponding StyleBuilders.
- Removed unsafe clone method from StyleBuilder.
- Removed public constructors for internal 'UI info' classes.
- Removed public constructors for Frustum class
- New CartoStyles package with following changes:
1) default language is now "en" (before "local")
2) 'buildings3d' style parameter is no longer used, instead 'buildings' style parameter can be used to control rendering of buildings (0=no buildings, 1=2D buildings, 2=3D buildings)
- Tilemasks used by the offline packages have stricter semantics now and PACKAGE_TILE_STATUS_PARTIAL tile status is now deprecated (never used by the SDK) and will be removed in the later versions.
Detailed list of new features:
- New 'geocoding' module that includes following generic classes/interfaces: GeocodingRequest, GeocodingResult, GeocodingService, ReverseGeocodingRequest, ReverseGeocodingService. The module also includes several classes for offline geocoding/reverse geocoding: OSMOfflineGeocodingService, OSMOfflineReverseGeocodingService, PackageManagerGeocodingService, PackageManagerReverseGeocodingService. For online geocoding the module includes PeliasGeocodingService and PeliasReverseGeocodingService classes.
- The routing module includes three new classes for Valhalla routing: PackageManagerValhallaRoutingService, ValhallaOfflineRoutingService, ValhallaOnlineRoutingService. These classes are only included in Valhalla-supporting builds.
- New 'search' module for searching features from various sources. The module includes following classes: SearchRequest, FeatureCollectionSearchService, VectorElementSearchService and VectorTileSearchService. These classes can be used to search features from loaded geojson collections, vector data sources and vector tile data sources.
- Billboards now support fade-in/fade-out animations. AnimationStyle objects can be now attached to billboard StyleBuilder objects and the specified animations will be used when billboard appear/disappear.
- PackageManager now includes two additional methods: isAreaDownloaded and suggestPackage. These methods can be used to detect is the view area is downloaded for offline use and if not, to get the best package for the area.
- SDK now support optional zoom gestures. Options class includes setZoomGestures/isZoomGestures methods, when zoom gestures are turned on, SDK automatically interprets double tap as a zoom-in action and two finger tap as a zoom-out action. By default, zoom gestures are not enabled.
- Implemeted RasterTileClickEventListener class for receiving click events on raster tile layers. SDK provides click coordinates and the raster tile color at the click point.
- Implemented simulateClick method for Layer class. This method can be used to programatically call event handlers of the layer.
- Implemented automatic background/sky color calculation for VectorTileLayers. If background/sky image is not explicitly defined using Options, then appropriate background/sky image is generated by the SDK. This provides much better experience with dark styles compared vs SDK 4.0.x.
- Implemented setClearColor/getClearColor for Options class to specify background color of the MapView. This can be used to enable partially transparent map views.
- CartoOnlineDataSource has now support for 'water masks' and coarse water tiles are automatically detected and no longer requested from the server, thus reducing latency and providing better user experience.
- Added getDataExtent method TileDataSource class. SDK uses the datasource extent information when generating tiles and this results in much lower memory usage in some cases (local raster overlays, for example).
- Added getDataExtent method VectorDataSource class.
- Exposed screenToMap and mapToScreen methods of MapRenderer with explicit ViewState argument.
- Added new helper classes VariantArrayBuilder and VariantObjectBuilder for building Variant instances.
- Added containsObjectKey method to Variant
- The performance of the clustering (ClusteredVectorLayer) is improved up to 10x. Also, the memory usage of the clustering is now 2x lower. Due to the improvements, clusters of 100k points should works well even on lowend devices.
- Optimized memory usage of LocalVectorDataSource setAll/addAll methods.
- ClusteredVectorLayer now monitors which attributes of elements change and avoids unnecessary costly reclustering.
- Added option to disable clustering animations via setAnimatedClusters method
- Added new option for faster clustering: ClusterElementBuilder includes additional buildClusterElement method (with cluster position and 'count' arguments). ClusterElementBuilder can specify ClusterBuilderMode which determines which of the two buildClusterElement method gets called.
- Lower level vector tile text rendering uses now SDF (Signed Distance Field) glyph representation which gives
crisper texts especially on high-DPI devices. Also, memory usage of glyph atlas textures is reduced. Additionally, the rendering artifacts of vector tile texts with large halos and overlapping glyphs are now fixed.
- Better support for shared dictionaries for offline packages to reduce package sizes.
- Added addFeatureCollection method to LocalVectorDataSource
- CartoVectorTileLayer includes static createTileDecoder method that can used to instantiate VectorTileDecoder from built-in styles.
- Added isOpen method to PersistentCacheTileDataSource.
- PersistentCacheTileDataSource now support asynchronous tile download/cache prefill (startDownloadArea method). An optional listener can be used to monitor tile download progress.
- Implemented setVectorTileBufferSize method for CartoMapsService. This method can be used to tweak tile sizes/fix rendering artifacts when using vector tiles from CARTO Maps API.
- Reduced memory consumption when large vector tiles are used
- iOS: added support for converting 16 bits-per-component UIImages
- UWP: Added mouse wheel support for zooming.
- Optimizations for GeoJSONGeometryReader, loading large geojson files is now approximately 2x faster
- Implemented ClickSize property for MarkerStyle, this allow enlarging of the click area when very small markers are used.
- Faster loading of complex vector tiles, SDK now optimizes CartoCSS styling rules.
- Optimized memory usage of complex Polygon vector elements (up to 25% in complex cases).
- New classes VectorTileFeature and VectorTileFeatureCollection that are used by the new search API
- CartoCSS: Implemented 'pow' operator
- CartoCSS: Added support for metavariables
- Implemented more optimizations in CartoCSS for various degenerate rendering rules: empty text expressions, zero size features, etc
- Added SideColor property to Polygon3DStyle/builder classes. Previously single Color was always used for all faces of the 3D polygon.
- Added toString method to BinaryData
- CartoCSS feature: comp-op support for markers
- CartoCSS: text-size attribute is now evaluated per-frame, allowing to use smooth text size interpolation based on zoom level
- CartoCSS: enabled PointSymbolizer support
- CartoCSS: parser now supports meta-variables
Fixes:
- Fixed equals/hash implementation for several built-in classes. Previously both methods provided unreliable results.
- Tile layer preloading tweaks - avoid cache trashing and constant refreshing in rare cases, reduce preloading dataset size
- SDK does not show harmless 'failed to decode tile' warning for empty tiles anymore
- Fixed subtle case of duplicate Layer instance handling in Layers container
- SDK allows vector element to be attached to only a single data source, violating this results in an exception now
- Fixed Windows Phone/UWP related pointer handling, previous version assumed MapView control to be at (0, 0) coordinates in the window
- Fixed touch handling issues on Windows Phone when more than 2 fingers are used
- Fixed regression in SDK 4.0.2 vs 4.0.0 when rendering vector tile lines with null width
- CartoCSS: fixed handling of shield-text-opacity and shield-text-transform
- Fixed multigeometry bounds calculations
- Fixed alpha channel handling when translating color interpolation expressions from CartoCSS to rendering library
CARTO Mobile SDK 4.0.2
Maintenance release for CARTO Mobile SDK 4.0.x
Fixes/Changes:
- Enabled stack protector for Android builds for better app security
- Implemented null pointer checks throwing exceptions for various Layers methods, previously such cases could result in native level crashes
- Implemented workaround for Xamarin/Android multithreading issues - native threads were sometimes not automatically registered when managed delegates are called from multiple threads
- Fixed issues with online licenses when license server was unreliable and took long time to respond
- Fixed app token issues with CARTO named map services
- Fixed SDK log filters being ignored/not working
- Fixed CartoCSS marker-transform handling for non-overlapping points
- Fixed VectorTileLayer click detection when custom transform was applied
- Fixed layer background not being properly set when VectorTileDecoder was updated
CARTO Mobile SDK 4.0.1
This is a maintenance release for 4.0.x that includes several important reliability and performance fixes, in addition to
some minor new features.
New features and changes:
- Added Layer visibility control API to CartoVectorTileDecoder (setLayerVisible, isLayerVisible methods)
- Implemented 'screen' and ‘clear’ comp-op support for CartoCSS/vector tile rendering
- Rendering of vector tile layers with multiple line/polygon symbolisers is now optimized as a special case, this is usually done with a single draw call
- Changed moveToFitBounds behaviour - from now SDK does not change zoom level if single point is used for MapBounds
- Better error reporting for CARTO SQL API, including error logging and error parsing
- Minor optimizations in vector tile renderer
- implemented timeout for online license update procedure
- forward-compatible changes for future features in online tile service and offline packages
- Exposed CartoVectorTileDecoder constructor for better integration with CARTO vector overlays
- Added additional CartoOnlineVectorTile constructor with explicit source and built-in style enumeration parameters
- Added countVisibleFeatures method to TorqueTileLayer
- Added comp-op support to points, markers, texts and shields
- Increased internal visible tile cache size by 4x, for really large overlay datasets (does not affect memory usage in normal cases)
- MBTilesDataSource and OfflineNMLModelLODTreeDataSource classes now open database in read-only mode (previously in read-write mode)
- More precise label coverage analysis for transformed labels
Fixes:
- Fixed Torque tile usage in MapsService API due to malformed URL
- Fixed deadlock with indirect texts fields in Text and BalloonPopup objects
- Fixed feature batching related issue in vector tile renderer that caused high number of draw calls and low performance
- Fixed 'multiply' comp-op handling with non-opaque alpha values
- Fixed parameter name typo in CartoCSS (instead of 'polygon-pattern-comp-op', 'polygon-pattern-op' was used)
- Fixed performance issue on iOS with empty Text objects
- CartoCSS compatibility fixes for handling negative line widths and marker sizes
- Minor memory usage, speed optimizations
- Added missing NTCartoVectorTileDecoder to iOS umbrella header
- Fixed CartoVectorTileDecoder layer ordering issues
- Fixed regression regarding VisJSON vector sublayer grouping; visibility and attribute info was previously lost
- Fixed handling of zero size ellipse markers in CartoCSS
- Fixed vector tile click detection issues
- Fixed rare cases on iOS when screen remained black after returning from background state
- Heavily distorted texts are no longer displayed on the map
- Fixed bad_weak_ptr exception when using PersistentCacheTileDataSource
- Fixed crash with some Xamarin Android versions when MapView finalizer is called
- Fixed license registration issues on Windows Phone targets
- Fixed vector tile layers in layergroup ignoring 'visibility' attribute
- Fixed billboard sorting issues causing flickering with overlapping markers/texts/popups
- Implemented clamping for CartoCSS opacity values for better compatibility
CARTO Mobile SDK 4.0.0
CARTO Mobile SDK is built on top of Nutiteq Maps SDK 3.3, and includes over 100 API related improvements, performance updates and fixes. The new API is not compatible with Nutiteq SDK 3.3, but most apps can be converted relatively quickly and most changes are only related to class/module naming. See Upgrading from Nutiteq SDK for more details.
Release notes for next releases can be found from Releases section.
New features and improvements:
- New 'services' module that gives integration with CARTO online services (Maps services, SQL API, high level VisJSON map configuration)
- JSON serializing/deserializing support and JSON based vector element metadata
- Revamped tile layer support, with more shared features between all tile layers including generic UTF grid support for vector/raster tile layers and many other tweaking options
- Vector editing is now available in all builds (Nutiteq SDK included this only in special GIS builds)
- Improved GeoJSON support, supporting GeoJSON features and feature collections
- Improved and more compliant CartoCSS support for vector tiles with 2 times faster CartoCSS parsing/compiling speed
- Additional styling options for vector overlays (lines, 3D polygons)
- Event handling by layer specific listeners
- Full Collada standard material support in NML models
- Usage of exceptions to signal about most common error cases, for example, file access errors, null pointers, out of range indexing
- Faster vector basemap rendering with better text quality
- Faster and higher quality vector overlay rendering (especially lines)
- Click detection and feature introspection for vector tiles
Removed features:
- Windows Phone 8.1 is no longer supported, as the platform is generally deprecated, only Windows Phone 10 is now supported
- Basic CartoCSS styling support is removed from styles module, full CartoCSS is available for vector tiles
[v5.0.0-rc.4]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.2...v5.0.0-rc.4
[v5.0.0-rc.6]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.5...v5.0.0-rc.6
[v5.0.0-rc.7]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.6...v5.0.0-rc.7
[v5.0.0-rc.8]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.7...v5.0.0-rc.8
[vv5.0.0-rc.9]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.8...vv5.0.0-rc.9
[v5.0.0-rc.10]: https://github.com/Akylas/mobile-sdk/compare/vv5.0.0-rc.9...v5.0.0-rc.10
[v5.0.0-rc.11]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.10...v5.0.0-rc.11
[v5.0.0-rc.12]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.11...v5.0.0-rc.12
[v5.0.0-rc.13]: https://github.com/Akylas/mobile-sdk/compare/v5.0.0-rc.12...v5.0.0-rc.13
[v6.0.0]: https://github.com/massif-maps/MassifMaps/compare/v5.2.3...v6.0.0
[v6.0.1]: https://github.com/massif-maps/MassifMaps/compare/v6.0.0...v6.0.1