Mappedin Offline Navigation Issue Using MVF2/V3 ZIP

Offline Routing Issue with Mappedin SDK using hydrateMapData()
Hi Team,

We are implementing offline indoor navigation using Mappedin in an Angular application.

Current setup:

Angular frontend
Offline MVF ZIP loading
Using hydrateMapData()
No cloud APIs during runtime
ZIP loaded locally from /assets/MVF2.zip or MappedInV3.zip
Map rendering works correctly offline:

Floors render
Labels render
Floor switching works
Connections/markers are visible
However, routing/directions are not working properly.

We are using:

const directions = await venue.getDirections(
startTarget,
destinationTarget,
{ accessible: false }
);

Current observations:

getDirections() returns empty coordinates OR no route
Rendering works offline
We confirmed map assets load successfully using hydrateMapData()
Internet is fully disconnected during testing
Questions:

Does offline routing require additional navigation graph exports?
Are space objects the correct entities to pass into getDirections()?
Can point-of-interest or connection objects be used as route endpoints?
Is there any difference between MVF2 and V3 exports for offline navigation support?
Does offline routing require specific export settings from Mappedin CMS?
We also noticed:

connection entities exist
node entities exist
walkable data exists in the V3 export
But routing still fails.

Any guidance on:

required offline export structure
correct route endpoint entities
offline routing compatibility
would be very helpful.
Thank you.

Directions are calculated locally in Mappedin JS, the user doesn’t need to be online. It should work when loading an MVF directly.

How are you obtaining the MVF file? The option to download it from within Mappedin Maker does not include the node graph required for navigation. These take some time to generate and are not in the “preview” MVF files downloaded this way. To access a complete MVF file, use the steps here: Getting Started with MVF v3 I know you did mention Mappedin CMS, so this may not be applicable to you but I wanted to point it out to be sure.

You can navigate to/from any NavigationTarget, which does include Spaces. However, note that the origin and destination must be routable between one another. For example if one is a located inside a room with no doors, getting directions would fail.

Are you seeing problems getting directions between specific targets or is it failing for all? If all, can you share your map ID (sending that as a direct message is fine).

Hi msohm,

We have implemented hybrid online + offline support using Mappedin JS in our Angular application.

Current implementation:

  • First we try loading venue data online using getMapData()

  • If online loading fails, we fallback to offline ZIP using hydrateMapData()

  • Offline ZIP is stored locally and loaded through Angular assets

  • browser local storage used for kiosk configuration values

Example flow:

try {
  this.venue = await getMapData({
    mapId,
    key,
    secret
  });

  console.log('Venue loaded from ONLINE source');

} catch (err) {

  const zipBuffer = new Uint8Array(res);

  this.venue = await hydrateMapData({
    type: 'binary',
    main: zipBuffer
  });

  console.log('Venue loaded from OFFLINE source');
}

Map rendering works correctly in both online and offline modes.

However, we observed several differences between online and offline hydrated data:

  • Floor IDs differ (f_ vs m_)

  • Some location/floor references behave differently

  • setFloor() sometimes throws:
    [MappedinJS] Invalid floor passed to setFloor

  • Routing works correctly with MVF_JWT.zip

  • Routing does not work with another exported ZIP (MVF.zip)

We noticed:

  • MVF_JWT.zip contains nodes, connections, entrances, floor-stacks, and routing graph data

  • MVF.zip appears to render geometry correctly but routing fails

We also observed that using actual runtime floor objects works more reliably than passing raw floor IDs into setFloor().

Questions:

  1. What is the recommended export format for full offline routing support?

  2. Is MVF_JWT.zip the correct production format for offline navigation?

  3. Are floor/location IDs expected to differ between online and offline hydrated venues?

  4. Is it recommended to use runtime floor objects instead of raw floor IDs for setFloor()?

  5. What is the recommended stable identifier for syncing online/offline entities?

Additionally, we would like guidance on future venue updates and offline synchronization.

Example scenario:

  • Existing offline package already deployed

  • Later, new floors are added in Mappedin CMS

  • Existing spaces/POIs are updated

  • Routing graph changes

  • New kiosks/locations are added

Questions regarding updates:

  1. What is the recommended strategy to update offline venue data in production?

  2. Do we need to regenerate and redeploy the entire offline ZIP every time floor/layout data changes?

  3. Is incremental floor update supported, or only full venue export?

  4. How should we handle runtime syncing between:

    • existing cached offline data

    • newly downloaded venue package

  5. Are floor/location IDs guaranteed stable across exports?

  6. What is the recommended stable identifier for syncing local cached data?

  7. Is there a best practice for versioning offline venue packages?

  8. How should we safely refresh routing graph data when new floors are added?

  9. This approch is work in a Windows desktop application (.exe) production environment?

Current stack:

  • Angular frontend

  • Spring Boot backend

  • Offline ZIP stored locally

  • Hybrid online/offline loading

Would appreciate guidance on best practices for production offline navigation support and future offline venue updates.

Thanks.

Hi amit,

Thank you for all the detail you’ve provided. It helps a lot to understand what you’re building. I’ve numbered my answers to match your questions.

First set:

  1. The MVF format does contain full offline routing support, but not every MVF will include this. The MVF you download using our REST APIs does. The MVF you download from the Mappedin Maker user interface does not. The one downloaded from the UI contains geometry only.
  2. The MVF file you download from the Mappedin REST APIs will support offline navigation.
  3. The .id values should be consider ephemeral. They can be used during runtime, but can and will change as map edits are made. Constant identifiers can be populated as external IDs and accessed using the .externalId fields. Think of these like a foreign key that holds an identifier in your system. These won’t change unless a person manually edits them on the map.
  4. Yes, most APIs require the full floor object and not just the id.
  5. The externalId field is a stable identifier that can remain constant through reloads. See #3 for more detail.

Second set of answers for the update questions. A few of these duplicate concepts described above, so some answers reference those in the first set.

  1. To update your offline venue data, download and replace the MVF file using Mappedin’s REST APIs.
  2. Yes.
  3. Incremental updates are not supported. You’ll need to download the MVF zip file again.
  4. As described in the first section, make use of externalId fields to hold constant values that are keys to your own data.
  5. No, see #3 in the first set of questions.
  6. externalId
  7. The Mappedin REST API that you query to get the MVF file contains a last updated date and time. You can use this for versioning. Mappedin does not apply any version number to maps.
  8. Since you need to download the entire MVF file to get the update all updates will be included.
  9. This same approach can be followed using any of Mappedin SDKs (Mappedin JS, Mappedin React SDK, Mappedin SDK for React Native, Mappedin SDK for Android & Mappedin SDK for iOS). They all use a similar architecture and API design.

Let me know if you’d like more information on any of these concepts

Hi msohm, We are developing applications for Windows (.exe), Android, and Web platforms. We would like to integrate the Mappedin SDK for map rendering and navigation.

What is the best approach for supporting all platforms? Can a similar implementation pattern be followed across Mappedin JS, React SDK, Android SDK, and iOS SDK?

Our SDKs follow a similar architecture and API naming, allowing for the same apps to be created using any of them.

The choice of which SDK to use really comes down to where the app will be hosted (website, vs local app) and what language you want to use to create it.

Hello Team,

I am trying to download the MVF_JWT data for a venue using the Mappedin API.

I am able to successfully generate a JWT token using my API key and secret. However, when I try to download the MVF data for the venue, I receive the following error:

{
  "error": "Unauthorized",
  "message": "Missing read-venue-api access to venue: <VENUE_ID>",
  "statusCode": 401
}

I have verified that:

  • JWT token generation is successful.

  • The API request is using the generated token.

  • The venue ID is correct.

Could you please help me understand:

  1. How can I verify whether my API key has read-venue-api permission for this venue?

  2. Is there any additional permission or configuration required to download MVF_JWT data?

  3. If the venue belongs to a different workspace or organization, how can access be granted?

Thank you for your assistance.

The API key used to create the token must be from the same workspace as the map you are requesting the MVF for. Keys are granted access to a single workspace.

The map you are requesting must also be upgraded to a Pro or Enterprise map in order to access it Mappedin SDKs and APIs.