Changelog
This page records user-visible SDK changes, including smaller fixes and compatibility updates. Major features may also have a separate article in the blog.
2.3.0 — 21 October 2026
New data formats
- GOM5 maps. Map geometry is four times more precise, so building corners and narrow areas keep their shape. GOM5 maps also bring route search, polygon results and container names (see Added). A map download grows by about a fifth (Masovian Voivodeship: 151 MB instead of 125 MB), while the installed map stays about the same size. Installed GOM4 maps keep working. What a map vertex costs tells the story.
- gcl1 elevation. Elevation downloads are smaller and more accurate: for Lower Silesia, 31 % smaller, with 95 % of heights within 1 m instead of 2 m. Elevation downloaded by earlier versions keeps working.
- VTC navigation packs. Offline navigation data downloads about half as large and takes about 60 % less storage once installed: for Poland, a 180 MB download instead of about 375 MB, and 541 MB on the device instead of 1.43 GB. Routes stay the same. A pack installs in the background after the download.
Earlier SDK versions cannot read these formats and keep receiving the previous ones.
Added
- Added route search on GOM5 maps: routes such as bus lines and hiking or cycling trails are found by name, number, origin or destination. A result is a
GLMapVectorRelationwith a point on the route and the route's bounding box, andloadMergedLines:inMap:/GLSearch.LoadMergedRelationLinesload its line as for a tapped route. - Added
loadStopsInMap:on iOS andGLSearch.LoadRelationStopson Android: the stops and platforms of a route in route order, on GOM4 maps too. - On GOM5 maps, named parks, lakes, cemeteries and national parks are polygon results, and places inside malls, parks and campuses also match by the name of their container, as in "Costa Galeria Krakowska".
- Added
loadVisiblePolygonsOf:on iOS andGLSearch.VisiblePolygonFragmentson Android. They return the drawn pieces of a polygon result or a tapped label, to highlight exactly what is on screen. Call them again fromvisibleTilesChangedBlock, or from the new AndroidsetVisibleTilesChangedCallback. - Added
searchGeometryKindon iOS andGLSearch.GetGeometryKindon Android: a search result is a point, a line, a polygon or a relation. Android gainsGLSearch.FindRelationNearPoint(point, osmID), as on iOS. - Added road number shields to MapCSS:
shield-image,shield-text,shield-color,shield-text-color,shield-fitandshield-priority. The default style draws them in the colours of the road signs of 35 countries, most of Europe and the United States, selected by themap:countrytag of a tile, with darker plates in the dark theme. Shields give way to names and points of interest and keep apart, so they mark the roads between places rather than every city street. Metro stations show the official logos of Prague, Warsaw, Minsk and Kyiv, and the U-Bahn sign. - Added side-by-side routes to MapCSS:
per-relationdraws a way once for each of its relations,offsetshifts a line sideways, andrelationSlot()gives each route its place. The Outdoor style draws hiking and cycling routes as translucent bands in their waymarked colours from zoom 13, and metro lines side by side in palette colours. - Added typography to MapCSS:
text-letter-spacingand thefont-weightvaluesmediumandsemibold, andfont-style: italicnow draws italic letters.font-sizeaccepts expressions, andfont-size,font-stroke-widthandtext-letter-spacingchange smoothly with zoom throughzlinear. Point and area names longer than 12 letters take up to three lines of similar length, breaking between names first. - Added to MapCSS: the tag filters
^=,$=and*=; strings with\",\'and\\escapes, in which;,{,},//and@are ordinary characters;icon-fallback, a smaller image shown when an icon has no room;linejoin: roundandbevel; and the functionslistItem,length,mapColor,mapValueandrelationSlot.mapValuepicks a value, such as an icon, from a"key:value"table, so one rule replaces a rule for every tag value. - Added frame capture for video encoders:
captureFrameIntoPixelBuffer:on iOS renders the map into a BGRACVPixelBuffer, and AndroidcaptureFrameandcaptureFrameWhenFinishrender into an RGBA_8888HardwareBufferon OpenGL ES 3 and Vulkan. - Added the typed vector geometry of iOS to Android:
GLMapVectorPoint,GLMapVectorLinewith a great-circle constructor,pointAtLineDistanceandlineDistanceToPoint, andGLMapVectorPolygonwithbuildOutline. Point, line and polygon counts andgetPointAtIndexare public.GeometryBuilderhas the same methods on both platforms: iOS gainsbeginLine,addPoint:,addGeoPoint:andaddGeoLine:count:, and Android gainsaddGeoPoint,addGeoLineandaddLine(count, callback). - Added
GLMapVectorObject.typeon iOS, asgetType()on Android, andGLMapVectorLayer.simplification/setSimplification: how much a layer simplifies its geometry, in points, 1.5 by default; 0 keeps every vertex, so a highlighted building keeps its exact outline. - Added
setStyle:completion:toGLMapTrackon both platforms. - The SDK packages and the Android AARs include
THIRD_PARTY_NOTICES.txt, and the Android POMs list their licences.
Changed
- Zooming uses about a quarter less CPU on an iPhone 15 than in 2.2.0, and styles load about a fifth faster.
- Offline search takes about a quarter less time, with the same results.
- Maps no longer keep a
.cachefile next to them, which saves storage; an existing one is deleted when its map opens. Cutting map polygons into triangles tells how. - Tracks have exactly round joins and ends, no dark tick inside sharp turns, an even colour where a translucent track crosses itself, and arrows that run through turns.
- Labels stay steady while the map moves, each label fades on its own, and text edges are smoother. A label stands 0.25 em from its icon on every screen density.
font-weight: bolddraws heavier than before; the old bold looks like the newmedium.- MapCSS reads strings strictly. A quoted value is text as written, keeping its spaces, so
"none"is the word none. An unpaired quote, such as the apostrophe in[name=McDonald's], stops the style from loading withUnclosed quote. A malformedeval(), such aseval(1 +), is a parse error.~=in a tag filter matches an item of a;list; use*=for a substring. - The default style names countries, regions and city districts in letter-spaced capitals, sets water names in italics, and grows names smoothly over all the zooms they are shown at. Cities and capitals are semibold, label colours reach about 4.5:1 contrast with the map, and large areas no longer hide the towns inside them.
- Hillshades and 3D terrain are sharper between zoom 10.5 and 11.5: elevation layers switch to detailed data half a zoom level earlier.
- On the bundled world map, country names are sized by the area of the country, and every downloadable map has its border.
visibleTilesChangedBlockalso fires when loaded vector data appears, and may repeat the same tile hashes.- Track progress: a NaN or infinite index leaves the boundary unset, an index past the end means the end of the track, and a change to or from unset is not animated.
- The
qualityof a great-circle line is a subdivision step in metres, with at most 65536 segments; the documentation said internal map units. - A vector object can have no geometry, and GeoJSON features without geometry load as such objects.
- A tap on the map attribution opens the GLMap attribution page.
allIconNamesalso lists the icons named insideicon-image: eval(...), such as those of amapValuetable.- Android libraries build with compileSdk 37 and NDK 30; the minimum stays at Android API 21.
- On Android the SDK checks server certificates against a list bundled with it, now Mozilla's list of 20 October 2026 instead of March 2024. It no longer trusts the eMudhra intermediates whose keys leaked, nor roots Mozilla has retired, such as DigiCert Global Root CA, GlobalSign Root CA and Baltimore CyberTrust Root: a tile or data server whose certificate chains only to such a root fails on Android.
Fixed
- Fixed one-way arrows, dashed lines and pattern fills that stretched to twice their length for a frame when the map zoomed out across a zoom level, and shrank when it zoomed in.
- Fixed style rules for a zoom range, such as
|z13-, that applied up to 1.5 zoom levels early since 2.2.0. - Fixed
tileRefreshTimeInterval/SetTileRefreshIntervalhaving no effect on online vector and elevation tiles. - Fixed an app crash on a malformed
eval()in a style, such aseval()oreval("a" "b"). - Fixed Mac Catalyst map views that stopped drawing while a menu was open, so
captureStateon a tilted map waited until the menu closed. - Fixed Android map views that lost their OpenGL state on the emulator after every map view was paused.
- Fixed jagged outlines of small vector-layer polygons and lines, whose points were rounded to 1–2 m.
- Fixed track progress for NaN, very large and end-only indices, and an animated change from an unset boundary that never reached its value.
- Fixed GeoJSON export of multipolygons, which wrote empty coordinates.
- Fixed
uppercase()of Georgian text, whose capitals the bundled fonts do not have, and an abort in debug builds on single-zoom selectors such as|z13. - Fixed
-[GLMapLocaleSettings init]on iOS, which made settings without data: it orders the current language before native names, with metric units.
Migration notes
Both platforms
- Rebuild clients against the new SDK; this release includes source and binary API changes.
- Draw-object completions report a result on both platforms.
GLMapDrawObjectUpdateResulton Apple platforms andGLMapDrawObject.UpdateResulton Android (Ready,Superseded,Cancelled,Failed) replace the 2.2.0 vector-layer types, and the completions of balloons, images, labels, marker layers and tracks receive the result too. Swift blocks take{ _ in ... }, and Java lambdasresult -> ...; Kotlin lambdas compile unchanged. GLMapVectorRelationreplacesGLMapRelation. It is a vector object, and taps,relationsNearPoint,findRelationNearPointand search return it. The object typeRelationis part ofAny(Allon Android); search returns routes only when the requested object types include it.- Review styles for the stricter MapCSS strings, the list meaning of
~=, and the heavier bold. - Data that 2.3.0 downloads can use formats earlier versions cannot read, so it does not survive a downgrade.
Android
- Deprecated, to be removed in 2.4.0:
GLMapVectorObject.createPoint,createGeoPoint,createGeoLine,createMultilineandcreatePolygonwith theirGeovariants (use theGLMapVectorPointandGLMapVectorLineconstructors andGeometryBuilder),GeometryBuilder.addLineCb(useaddLine(count, callback)), theGLMapVectorObjectoverloads ofGLMapLineArrow.setLineandGLRouteBuilder.addLine, andGLMapVectorRelation.createFromJSONOrError(save the OSM id and a point, then useGLSearch.FindRelationNearPoint). GLMapInfo.getPolygons()returnsGLMapVectorPolygon, andGLRouteManeuver.getLine()andGLSearch.LoadMergedRelationLinesreturnGLMapVectorLine.
Apple platforms
-initis unavailable onGLMapVectorObjectand its subclasses,GLMapValue,GLMapDrawObject,GLMapUserLocation,GLRoute,GLRouteManeuverandGLRouteElevation; use their designated initializers.GLMapVectorRelation()creates a relation without geometry.GLMapTrack -setStyle:becomes-setStyle:completion:, andGLMapLabelBlockandGLRoute.lineare removed.-[GLMapVectorObject findNearestPoint:toPoint:maxDistance:]is deprecated and will be removed in 2.4.0: use-[GLMapViewState findNearestPoint:nearObject:maxDistance:], with the distance in screen points.
2.2.0 — 29 September 2026
Added
- Added a standalone Android
globus:glmapcorelibrary and a SwiftPMGLMapCoreproduct. Geometry, storage, and downloads can be used without a map view; Search and Route no longer require the Android renderer. - Added camera values to
GLMapViewStateon iOS and Android: center, scale, zoom, angle, pitch, and origin. Android also gains synchronousGLMapViewRenderer.getState()for queries that do not need rendered terrain depth. - Added
GeometryBuilder.addLineLonLat(double[])on Android for packed longitude/latitude input, with synchronous input consumption and coordinate validation. - Added
GLMapAnimation.setCompletionon Android to distinguish completed animations from interruptions. The existingsetOnFinishcallback remains available. - Added
GLSearchRequest.visibleAreaon iOS and Android as an optional viewport hint for geographically relevant online spelling corrections. It is not a strict bounding-box filter; offline mobile search does not include fuzzy matching. - Added
GLMapManager.automaticallyManagesDownloadBackgroundTaskson iOS. Applications that manage their own background execution can disable GLMap's automatic short UIKit background tasks for offline map downloads.
Changed
- Vector-layer updates now report an explicit terminal outcome:
Ready,Superseded,Cancelled, orFailed. Updates replace the layer's geometry; a callback is delivered asynchronously on the main thread.Readymeans geometry is ready to draw, not that a frame has been presented. - Android SDK initialization is centralized in
GLMapManager.Initialize, which initializes Core and the included Map, Search, and Route modules. Repeating initialization with a new API key updates the key without preparing resources again. - Apple activation now returns a boolean reporting missing resources or an unwritable storage path. Android initialization no longer reports failure merely because a cached map list is absent. These results are not API-key validation.
- iOS API documentation is now one combined DocC site covering GLMapCore, GLMap, GLSearch, GLRoute, and the Swift conveniences.
Fixed
- Fixed valid search results disappearing when submitting a query: unverified candidates and duplicate fragments no longer consume the result limit before filtering and merging.
- Preserved search result names when merging display tags and made ordering of equally ranked results more stable. Short autocomplete tokens are less likely to favor incidental words in the middle of a name.
- Improved search-cache maintenance after map changes and cache placement for the read-only bundled world map.
- Preserved Android map frames across surface transitions and added
setRenderingEnabledto pause drawing without discarding the last frame. Recreated SurfaceView surfaces are redrawn before reporting redraw completion. - Fixed Vulkan rendering with a 180-degree surface rotation and rebuilt affected screen-space geometry when screen rotation or font scale changes.
- Fixed route-builder maneuver geometry and elevation alignment when appending maneuvers.
- Fixed nearest-point coordinates for point and line geometry on both platforms. Android vector queries now preserve the computed nearest point, including when updating a hit-test input point.
- Android storage configuration now creates and checks writable map directories, rejects invalid or read-only write locations without replacing the previous configuration, and allows initialization to be retried after storage access is restored.
- Fixed iOS bounding-box download completion lifetime and Android dataset removal by absolute path. Android resource copying now handles interrupted reads, partial writes, and failed copies more reliably.
- Fixed SVG ellipse radius parsing, SVG error handling, and a crash when parsing excessively long CSS color values.
- Fixed synchronization when cancelling map animations and improved Android safety when queued animation work outlives its map view.
Migration notes
Both platforms
- Rebuild clients against the new SDK; this release includes source and binary API changes.
GLMapVectorLayer.setVectorObjectandsetVectorObjectscompletions now receive an update result instead of being parameterless. Submit updates on the main thread and check forReadybefore doing success-only work. Swift callbacks that intentionally ignore the result use{ _ in ... }; Java callbacks useresult -> .... Kotlin lambdas can access the result asit. Calls with a null completion, or with an omitted Swift completion, remain source-compatible. A detached layer or paused map can keep an update pending until rendering resumes, it is superseded, or the layer is released.GLMapInfo.getPolygonsnow returns a nullable vector object (GLMapVectorPolygonon Apple platforms,GLMapVectorObjecton Android), not nested arrays of points. Use the vector geometry accessors to inspect its rings.
Android
- Call
GLMapManager.Initialize(context, apiKey, progressCallback)successfully before using any native-backed SDK API, including headless geometry. Native libraries are no longer loaded by class initializers. Do not use SDK APIs concurrently with initialization; concurrent or reentrant initialization throwsIllegalStateException.GLSearch.Initialize(context)is a deprecated compatibility no-op. Pure Java point/bounding-box values and pre-initializationSetStoragesremain available. - Renderer-dependent queries move to
GLMapViewState. Obtainrenderer.getState()on the UI thread for immediate queries, or usecaptureStatewhen rendered terrain depth is needed. Close the state after use; captured camera values survive renderer changes and disposal, but label layout is not a fully frozen snapshot.
| Before | Now |
|---|---|
object.findNearestPoint(renderer, point, distance) | state.findNearestPoint(point, object, distance) |
track.findNearestPoint(renderer, point, distance) | state.findNearestPoint(point, track, distance) |
objects.findNearPoint(start, end, renderer, point, distance) | state.findNearPoint(objects, start, end, point, distance) |
object.updateDrawAttributes(renderer, style) | state.updateDrawAttributesOfVectorObject(object, style) |
GLSearch.MapObjectNearPoint(renderer, ...) / RelationsNearPoint(renderer, ...) | Pass a GLMapViewState instead of the renderer. |
- Core classes retain their
globus.glmapJava package names. Applications using only Search or Route must explicitly addglobus:glmapif they also need map rendering; those modules now depend on Core rather than Map. GLMapValueno longer inherits drawable operations. Native bridge consumers must useGLMapCore/GLMapBridge.hinstead ofGLMap/GLMapBridge.h.
Apple platforms
- Minimum deployment targets rise to iOS 15 and macOS 12, including the corresponding Mac Catalyst target. The GLMapCore watchOS minimum remains watchOS 10.
- Core Swift conveniences move to
GLMapCoreSwift;GLMapSwiftre-exports them, so existing Map clients can keepimport GLMapSwift. Headless clients useGLMapCoreandGLMapCoreSwift. Recompile prebuilt Swift dependents and useGLMapManager.shared.resourcesBundlerather than relying on the SwiftPM resource bundle's internal filename.
2.1.0 — 4 September 2026
Added
- Added
GeometryBuilderon iOS and Android for efficiently constructing lines, multilines, polygons, and multipolygons. - Added direct geometry inspection to iOS
GLMapVectorObject. - Added in-place WGS-84 coordinate conversion with
MapPoint.setLatLonon Android. - Added route maneuver types for road merges, elevators, steps, escalators, building and level transitions, and parking before continuing on foot.
Changed
- Reworked vector and track geometry around compact immutable storage to reduce allocations and temporary objects.
- On iOS,
GeometryBuilderreplacesGLMapPointArrayand the old line and polygon constructors. Track append and merge methods were also renamed. - On Android,
createPolygonandcreatePolygonGeonow accept one ordered array of rings, with the outer ring first and holes following it. The oldgetMultilinePointsaccessors were removed. - Search now uses explicit country, region, and locality context more consistently, including fallbacks for distant localities and unavailable house numbers.
- Improved font-family selection, fallback, and glyph-atlas lifetime across iOS and Android.
- Map animation configuration and cancellation now enforce their main-thread lifecycle.
2.0.2 — 2 August 2026
Fixed
- Fixed an iOS crash when GLMapCore used ICU before GLSearch had configured its data directory.
2.0.1 — 28 July 2026
Fixed
- Text labels with an outline no longer lose their fill when duplicate-stencil suppression is enabled. The fix applies to the Metal and OpenGL renderers.
- Post offices remain available in text and category search, but no longer appear as a promoted quick category.
2.0.0 — 22 July 2026
Added
- Added offline 3D terrain with configurable altitude scale.
- Added terrain-aware tracks, markers, labels, hillshades, slope shading, and contour lines.
- Added
GLSearchRequestas one request model for online and offline text search, autocomplete, and category browsing. - Added stable identifiers to search categories.
- Added walking, hiking, wheelchair, and blind-pedestrian routing profiles.
- Added Vulkan rendering on supported Android devices with automatic OpenGL ES fallback.
- Added Android 17 and
targetSdk 37compatibility while retaining Android API 21 as the minimum. - Added watchOS build support for
GLMapCore. - Added compact Swift/UIKit and Kotlin reference applications covering maps, search, routing, terrain, downloads, markers, and camera operations.
Changed
- Online and offline search now return the same display-ready map-object model.
- Custom style parsing on iOS now reports errors; Swift
GLMapStyleParsermethods are throwing. - Fly-to animations now use
flyToModeand a map-center change inside the animation block. - Drawable hit testing now uses screen-bounds testing.
- Applications must provide WGS-84 coordinates; the legacy China-coordinate switch was removed.
- Android applications can allow GLMap to choose between Vulkan and OpenGL ES automatically.
Fixed
- Improved cancellation and exactly-once completion for search and routing requests.
- Improved handling of empty input, malformed responses, renderer recreation, and interrupted downloads.
- Improved route tracking, alternative selection, and elevation validation.
See GLMap 2.0 for the release overview and migration guidance.
1.13.0 — 16 February 2026
Added
- Added
GLMapTrackArrowfor drawing directional arrows along navigation routes and other tracks. - Added
GLMapUserLocationto manage the user-location marker, accuracy circle, images, and location updates with less application-side code.
Changed
- Simplified the iOS track and image APIs.
- Improved cross-platform API parity for route construction, map animations, and Android documentation.
- Reworked Android gesture handling and improved shader compilation caching.
Fixed
- Fixed an Android rendering and animation deadlock.
- Fixed a triangulation crash and data races in scale-ruler updates.
- Fixed iOS custom-callback memory leaks and improved map-download error handling.
See GLMap 1.13.0 for examples and migration notes.
1.12.0 — 13 July 2025
Changed
- Reworked tile loading on both platforms to progressively request detail, avoid unnecessary cancellations, and make better use of the download cache during rapid pan and zoom gestures.
- Android screen-coordinate conversion now uses
android.graphics.PointF, while geographic map coordinates continue to useMapPoint. - Renamed the continuous iOS
mapZoomproperty tomapScaleto align terminology across platforms. - Rebuilt Android libraries with NDK r28.1 and added support for devices using 16 KB memory pages.
Added
- Added public Android surface lifecycle APIs for custom rendering integrations.
- Added
isTapZoomInvertedon iOS for applications that invert double-tap zoom behavior.
See GLMap 1.12.0 for API migration examples.
1.11.0 — 14 January 2025
Added
- Added turn-lane information to route maneuvers, including possible, valid, and active directions for each lane.
- Added route creation from Valhalla JSON responses for server-generated, cached, and hybrid online/offline routing workflows.
- Added alternative-route tracking, including detection when the user passes a junction or continues along another route option.
Changed
- Tap gesture callbacks no longer return a handled flag; pan gesture callbacks retain it for gesture conflict handling.
See GLMap 1.11.0 for the lane-guidance and route-tracking APIs.
1.10.0 — 15 November 2024
Added
- Added map pitch for tilted navigation and perspective map views.
Changed
- Gesture callbacks gained a handled result so applications could coordinate custom pan behavior with built-in map gestures. Tap callbacks were simplified again in 1.11.0.
See GLMap 1.10.0 for the map-pitch introduction.