Skip to main content

Release v1.12.0

· 2 min read
Evgen Bodunov
Evgen Bodunov
CEO @ Globus Software

TL;DR

  1. Unified screen-to-map conversion API on Android – now uses android.graphics.PointF, eliminating the old MapPoint/Point mix-up.
  2. Property clean-up on iOS – mapZoom → mapScale (and heads-up about 1.13 renaming of mapZoomLevel).
  3. Smarter tile pipeline on both platforms – fewer aborts, fewer duplicate downloads, better cache hit-rate.
  4. NDK r28.1 & 16 KB page-size support for Android – rebuilt libs and updated CMake configs.

What’s new

🌍 Cross-platform

AreaDetails
Tile request strategyInstead of firing every tile that might be visible and cancelling later, 1.12.0 starts with the coarsest visible zoom, queues deeper tiles lazily, and only cancels if the request hasn’t begun. If the download has already started, the SDK finishes it and stores the data in the on-device cache.
Consistent namingWe’re converging on the Android naming scheme: scale = real-world scale, zoom = discrete zoom level. See iOS section below.

🤖 Android

ChangeNotes
NDK 28.1Pre-built .so files were rebuilt with NDK r28.1.
Coordinate-conversion API modernisedBefore 1.12.0 methods such as convertDisplayToInternal(MapPoint val)/convertInternalToDisplay(MapPoint val) relied on MapPoint both for screen and map space.

Minor

  • Added setSurface(surface, w, h, scale) helper (useful for custom Surface routing).
  • destroySurface() is now public.

Migration hints

// 1.11.x
MapPoint geo = renderer.convertDisplayToInternal(new MapPoint(x, y));

// 1.12.0+
MapPoint geo = renderer.convertDisplayToInternal(x, y);

🍏 iOS

ChangeNotes
mapZoom → mapScaleThe floating-point scale property is now called mapScale, matching Android’s getMapScale()/setMapScale().
Upcoming (1.13.0)mapZoomLevel will be renamed mapZoom (integer/float, same semantic as Android’s mapZoom).
Tile pipelineSame algorithmic change as Android – dramatically fewer cancellations under fast pan/zoom.
OtherAdded isTapZoomInverted property (default = false).

Migration quick-check

// Replace
double scale = mapView.mapZoom; // 1.11.x

// With
double scale = mapView.mapScale; // 1.12.0

Thank you!

Big thanks to everyone who reported issues, tested pre-releases, and sent pull requests. Drop feedback to [email protected].

Release v1.11.0

· 2 min read
Evgen Bodunov
Evgen Bodunov
CEO @ Globus Software

Turn Lanes in Valhalla Response

We have added lane information to GLRouteManeuver:

/// Number of lanes
@property(readonly) NSUInteger lanesCount;

/// Returns possible turn directions for a specific lane.
/// @param index The index of the lane (starting from 0).
/// @return A mask indicating all valid turn directions for the lane.
- (GLRouteTurnLaneMask)turnDirectionsAtLine:(NSUInteger)index;

/// Returns valid turn directions for a lane that can be used to follow the route initially.
/// Valid turns indicate that the lane is suitable for the maneuver but may require further lane changes later.
/// @param index The index of the lane (starting from 0).
/// @return A mask indicating valid turns for the lane.
- (GLRouteTurnLaneMask)validTurnAtLine:(NSUInteger)index;

/// Returns active turn directions for a lane that should be used to follow the route without requiring additional lane changes.
/// Active turns indicate the optimal lane for continuing along the route as intended.
/// @param index The index of the lane (starting from 0).
/// @return A mask indicating active turns for the lane.
- (GLRouteTurnLaneMask)activeTurnAtLine:(NSUInteger)index;

Create GLRoute from JSON

If you have received a Valhalla response in JSON format, you can use it to create a GLRoute and then use GLRouteTracker for navigation along that route.

Creating a GLRoute from JSON is a logical extension of the method +[GLRouteRequest offlineAction:(NSString *)action request:(NSString *)request config:(NSString *)config startPoint:(GLMapGeoPoint)startPoint error:(NSError **)error], which accepts a request and returns the JSON response.

GLRouteTracker Works with Alternative Maneuvers

A route in GLRoute can include both the main route and alternative routes. To accurately determine when the user has passed a junction or switched to an alternative route, new methods have been added to GLRouteTracker.

/// Checks if the user has passed the specified route.
/// @param routeIndex The index of the route.
/// @return YES if the user has passed the route, NO otherwise.
- (BOOL)didPassRoute:(NSInteger)routeIndex;

/// Current route index. Can be changed when the tracker detects that the user moves along another route.
@property(assign) uint8_t currentRoute;

Breaking changes

GLMapTapGestureBlock gesture handler block shouldn't return BOOL anymore. It's required only for GLMapPanGestureBlock to handle pan gestures correctly. Sorry for troubles.

Release v1.10.0

· One min read
Evgen Bodunov
Evgen Bodunov
CEO @ Globus Software

Map Pitch

You can set the map’s pitch in degrees in GLMapView using the setMapPitch method.

When following directions, a tilted map perspective can be more intuitive than the traditional overhead view. This perspective simulates what a traveler sees when looking at the road ahead, making navigation more user-friendly and realistic.

Breaking Changes

The type of GLMapGestureBlock has been changed to: typedef BOOL (^GLMapGestureBlock)(PlatformGestureRecognizer *gestureRecognizer);

To receive the location of a tap, call [gestureRecognizer locationInView:view]. Additionally, you should return YES if the tap is handled and NO otherwise.