This release was made on 28th May 2024 and is based on commit 8.9-312-g25b22d38f in the Git repository.

The previous release, 8.8, was made on 1st February 2024 and was based on commit 8.7-304-gf1fb8f68d in the Git repository.

The main change is the addition of support for online Mapbox vector tile data, searching and geocoding.

Support for online Mapbox data

Online Mapbox vector tile data can now be used to display maps. When Mapbox vector tiles are in use, route calculation uses the Mapbox directions API, and searching and geocoding use the Mapbox search APIs. You need a Mapbox account and an access token to use these features. You can open a world map by passing the Mapbox vector tile URL instead of a filename. It is "https://api.mapbox.com/v4/mapbox.mapbox-streets-v8". You supply your access token as the Key member of the framework parameter object. Mapbox data is converted automatically to the layers used in the standard CartoType style sheet.

The new Framework function SetProviderParam can be used to pass parameters specific to a certain data provider. It was introduced to allow users to set the "permanent" parameter when using Mapbox geocoding to return results that are stored permanently. To set the "permanent" parameter to "true", call SetProviderParam("mapbox/geocoding/permanent","true").

Changes to Framework parameters

The Framework::Param class (FrameworkParam, CartoTypeFrameworkParam, etc., in the various platform APIs) now has a Key member, which replaces the previous EncryptionKey member. It is used both for the encryption keys, if any, of CTM1 files, and access tokens or API keys for online map data. The MapFileName member may be a filename or a URL.

Standard map legend construction

The Legend constructor now takes an optional style argument consisting of integer flags. In the C++ API they are:

/** A style flag used in the constructor to add the name of the main map as a title. */
static constexpr uint32_t KStyleFlagTitle = 1;
/** A style flag used in the constructor to add the scale in the form 1:NNN to the title. */
static constexpr uint32_t KStyleFlagScaleInTitle = 2;
/** A style flag used in the constructor to add lines for common map objects including roads, forests, parks and stations. */
static constexpr uint32_t KStyleFlagMapObjects = 4;
/** A style flag used in the constructor to add a scale bar. */
static constexpr uint32_t KStyleFlagScaleBar = 8;
/** Style flags used in the constructor to select the standard style. */
static constexpr uint32_t KStandardStyle = KStyleFlagTitle | KStyleFlagScaleInTitle | KStyleFlagMapObjects | KStyleFlagScaleBar;
/** Style flags used in the constructor to create an empty legend object. */
static constexpr uint32_t KEmptyStyle = 0;

To create a legend containing the map name and current scale as a title (e.g., Norway 1:250,000), lines for common map object types, and a scale bar, use KStandardStyle.

Setting metric or non-metric units

Whether metric or non-metric units are used can now be set using new Framework setter and getter functions (SetMetricUnits and MetricUnits) or properties (MetricUnits), according to the platform.

Use of metric or non-metric units in Legend objects

Legend objects now determine whether to use metric or non-metric units from the Framework object supplied at the time of creation; therefore the aMetricUnits argument has been removed from Legend::AddScaleLine and Legend::AddTurnLine.

Framework functions affecting Legend objects, including scale bars and turn instructions, no longer take the argument aMetricUnits. Whether metric units are used is determined by the setting of the Framework object.

Consistent directions in degrees

Absolute directions returned in degrees are now consistent and are clockwise starting from north as zero, and in the range 0 ... 360. However, you may provide directions that are negative or greater than 360 to any API function taking a direction and it will be handled correctly. For example, north-west may be supplied as -45 as well as 315.

This affects the meaning of the members InDirection and OutDirection in the Turn class, which formerly were anti-clockwise, starting from east as zero, but are now clockwise starting from north as zero.

Relative directions, as used in the TurnAngle member of the Turn class, may be positive or negative as before, and are in the range -180 ... 180. Negative values indicate a left turn and positive values indicate a right turn.

Turn instructions provided by a routing system

The new Instructions member of the RouteSegment class allows a routing system such as the Mapbox directions API to provide its own turn instructions. If present, these instructions are used in preference to those synthesized by CartoType from the turn information.

New error code KErrorNoRoad

The new error code KErrorNoRoad (71) is used in routing when no road or other routable segment was found near one or more route points, and it is not known whether the problem occurred at the start or end of a route, in which case KErrorNoRoadsNearStartOfRoute (59) or KErrorNoRoadsNearEndOfRoute (60) is used, as before.

New feature code Ocean

The feature code Ocean ("oce") is now defined.

Specific C++ SDK changes

Some new functions have been added to the MString base class, mainly for internal use.

std::string PercentEncode() // creates a percent-encoded UTF-8 copy of a string; for use when building URLs to access online services
Text PathExtension() const noexcept // treating the string as a file path, returns the extension
Text PathDirectory() const noexcept // treating the string as a file path, returns the directory
Text PathFileName() const noexcept // treating the string as a file path, returns the filename
void SetPathExtension(const char* aExtension) // treating the string as a file path, sets the extension

Also, MString::Token now returns a Text object, not a String, for increased speed, and as a consquence no longer treats quoted and escaped embedded strings as tokens

Specific .NET and UWP SDK changes

Removed Legend.CreateLegend().