Skip to main content

Changelog

All notable, developer-facing changes to the Wemap SDK. The SDK follows semantic versioning: breaking changes only land on a major version, new features on a minor, fixes on a patch.

14.7.0

✨ New features

  • Waypoints in directions. Router.directions() accepts intermediate waypoints between origin and destination, plus optimizeWaypoints to reorder them for the shortest route (@wemap/routing).
  • No-build <script> integration. Every package now ships a UMD bundle you can drop in with a <script> tag — no bundler required. Globals live under the Wemap namespace. The @wemap/map bundle is self-contained (maplibre-gl and its worker are inlined).

🐛 Fixes

  • Turn-by-turn steps no longer overwrite the street name with the motorway exit number (@wemap/routing).

14.6.1

🐛 Fixes

  • Coordinates now uses the WGS84 ellipsoid instead of a sphere (@wemap/geo, @wemap/map). Distances, ECEF conversions, local frames and the accuracy ring are more accurate; returned values change.
  • GeoRef.heading now rotates around the local vertical, in radians clockwise from north.

14.6.0

This release introduces @wemap/map — a new, dedicated package for rendering Wemap livemaps on top of maplibre-gl — alongside a modular package layout (@wemap/core, @wemap/geo, @wemap/map, @wemap/positioning, @wemap/routing, @wemap/camera). You now install only the packages you need.

✨ New features

Map rendering (@wemap/map)

  • Livemap-aware map wrapper. Construct a WemapMap after core.init() and your livemap's style, bounds, zoom range, pitch, bearing and indoor settings apply automatically. Override any of them — plus all maplibre options — in the constructor. The raw maplibre instance stays available as map.maplibre as an escape hatch.
  • Camera and events. First-class helpers for setCenter, setZoom, flyTo, easeTo, fitBounds, and typed on / once / off event subscription.
  • LatLngLike inputs everywhere. Position inputs accept a Coordinates, a { lat, lng, level? } object, or a [lat, lng, level?] tuple — all latitude-first. Malformed positions are validated and rejected early.
  • whenReady() and autoResize. Await a race-free "map is ready" signal, and let the map resize itself with the container automatically.
  • POIs & content search. Click, highlight, select and filter livemap pinpoints; run content search; and read viewport pinpoints with a loading signal to know when results settle.
  • Markers & clustering (DomMarkerLayer). Add runtime markers with a custom element, icon, color, anchor and offset; update them in batches with setMarkers; and opt into supercluster clustering.
  • Shapes (ShapeLayer). Draw GeoJSON lines and polygons with simplestyle-spec styling, plus hover and click.
  • Itineraries (ItineraryLayer). Render multilevel routes on the map.
  • User location (UserLocationLayer). Show the user from a positioning stream, including a geographic accuracy ring.
  • Indoor & levels. Automatic building selection, pose-driven level sync, a LevelControl floor switcher, and level-aware custom layers.
  • Theming. Brand the map through design tokens set at core.init({ theme }) and a public set of CSS variables and classes for finer control.

Geocoding (@wemap/core)

  • Forward and reverse geocoding via a new GeocodingService — turn an address into coordinates and back.

Routing (@wemap/routing)

  • itineraryRules options for finer control over computed routes.
  • Strict map-matching (useStrict) to snap tightly to an itinerary, and orientation-aware matching.

Positioning (@wemap/positioning)

  • Location state reporting and a more resilient background VPS scan.

🐛 Fixes

  • Multilevel itineraries no longer bleed across floors.
  • Indoor level filtering now applies correctly while GeoJSON sources are still loading.
  • More reliable indoor routing across mixed-level graphs, with more accurate turn directions at route-leg junctions and corrected wheelchair handling for elevators and moving walkways.
  • Faster indoor graph routing.

For full API details, see the package API reference and the feature guides.