This release, 9.0, was made on 2nd June 2025 and was based on commit 9.0-0-g6f54cbf72.

The previous release, 8.12, was made on 7th November 2024 and was based on commit 8.12-19-g3f49c29ef.

The main changes are the introduction of an auto-map-loader, allowing sets of tiles, possibly overlapping, to be loaded and unloaded automatically to cover a larger map, and the simplification of the router state, meaning that only one current route can exist at a time.

The auto-map-loader

The auto-map-loader system loads and unloads maps representing tiles automatically as the map is panned and zoomed. At any zoom level and location, any number of maps may be loaded and overlaid to create the display. The Framework functions LoadMapsAutomatically and CancelAutomaticMapLoading start and stop the auto-map-loader.

Simplification of the router state

The Framework object now has only one current route, or none if a route has not been created or supplied (via UseRoute). Therefore the route index argument has been removed from functions that formerly needed one, such as SetViewToRoute. Also, RouteProfile replaces Profile, SetRouteProfile replaces SetMainProfile, BuiltInRouteProfile replaces BuiltInProfile, SetBuiltInRouteProfile replaces SetBuiltInProfile, and AddProfile, ChooseRoute and RouteCount have been removed.

Route objects are now immutable

This change mainly affects the C++ API. Route objects now immutable, which means they have no functions that can change their internal state. Thus property allows them now to be passed using shared pointers where a function needs to retain the route object, or a route object is passed to a user. Further, the RouteSegment class representing part of a route is also immutable.

New error code

Added the error code KErrorMapAlreadyLoaded = 73.

Removal of some functions returning map bitmaps

Functions for returning map bitmaps containng subsets of data, such as MemoryDataBaseMapBitmap, have been removed. The functionality can still be performed by enabling or disabling specific maps before drawing a bitmap.

C++-specific changes

Added DotProduct and CrossProduct functions to Point3.

Added IN_MEMORY_MAP_DB, CTM1_ONLINE and MVT_ONLINE to the FileType enumeration, although these are not really file types but data source types.

The classes FrameworkEngine and FrameworkMapDataSet are no longer public, but are now used internally only. Consequently Framework::Param no longer has the members SharedEngine and SharedMapDataSet.

The Legend class no longer has a public constructor which might throw an exception, but a New function returning an error.

MString::Trimmed, which is simpler and faster, replaces MString::Trim, which had more complicated functionality that is no longer needed.

Android-specific changes

Added the TileParam class to support the auto-map-loader.

Added Framework.loadMapAsync and the class loadMapAsyncInterface.

Added Util.UKGridReferenceFromDegrees and Util.pointInDegreesFromUKGridReference.

.NET-specific changes

Added the TileParam class to support the auto-map-loader.

Added LoadMapAsync.

Added Util.UKGridReferenceFromDegrees and Util.PointInDegreesFromUKGridReference.

UWP-specific changes

Added the TileParam class to support the auto-map-loader.

Added Util.UKGridReferenceFromDegrees and Util.PointInDegreesFromUKGridReference.

iOS-specific changes

Added the CtTileParam class to support the auto-map-loader.

Added CtFramework.loadMapAsync.

Added the static CtFramework methods UKGridReferenceFromDegrees and PointInDegreesFromUKGridReference.

Other changes made during the lifetime of the previous release, 8.12

much less RAM is used when loading multiple maps side by side
fixed #368: 32-bit .NET version of CartoType cannot load very large maps, such as a map of North America
fixed #369: CenterInDegrees returned KErrorNoProjection for interpolated street addresses
tile cache size is now limited to 128 tiles in UWP builds, by user request
Swift demo now uses CtStringMatch set operations
CtLegendStyle in the iOS API is now a set of options, making it easier to use in Swift
fixed typo causing Framework::SetFollowScale not to work
fixed bug in setting scale according to speed when navigating
fixed #373: Mapbox Vector Tile handler failed when given an empty tile
fixed #372: fuzzy matching is too broad in address searching
fixed #367: locality ignored in address searching in USA
fixed #374: 'State Highway 55' should not match 'State Highway 57' in address searching
fixed #376: A-star routing using version 5.1 CTM1 files did not work correctly
scale and rotation changes are alternated when navigating: mitigates #322 (matrix interpolation does not work correctly)
--- 8.12.40 ---
loading or unloading a map side by side with another map is now faster and causes no display flicker
added asynchronous map loading
makemap now takes map distortion into account when finding nearest towns to streets, etc.: fixes case #383
the relevance of text searches and address searches is now calculated in a better way, giving a greater likelihood of a successful query
fixed bug preventing address objects from being loaded into CTM1 files, making address searches less likely to succeed
--- 8.12.66 ---
makemap now ignores point postcodes if there are any containing polygon postcodes when deciding which postcodes a street belongs to
fixed #399: labels from a second map are not drawn
--- 8.12.68 ---
bug fix: the LoadFont functions did not return an error code when a font failed to load
fixes #403: maps app doesn't show a message when Find fails to find anything
replaced old C# demo with a new much more capable one
--- 8.12.78 ---
fixed infinite loop when generating route instructions from Mapbox data
fixed #418: small airfields should be drawn with less prominence than airports
fixed #426: makemap generates same layer data twice when -lowres is used
fixed #432: a-star route segment times do not take account of gradients
--- 8.12.87 ---