Have you ever tried to save or send a position on the map with your addon? You might have noticed that this is not as easy as it sounds.
Have you ever tried to save or send a position on the map with your addon? You might have noticed that this is not as easy as it sounds.
This library efficiently converts a position on any map into a global position that you can save or share. This is made possible by measuring maps once when they are encountered for the first time during a play session and only doing simple calculations afterwards.
Dependencies
Make sure to install the following required libraries in order to use LibGPS.
Quick Start
Add the necessary statements in your addon manifest to load the files:
NOTE: The >=30 tells the game to require AddOnVersion 30 or greater, which happens to be the first version with the 3.0 API and has nothing to do with the semantic version. It is simply a build number provided by the build script used to package the library.
In order to use the library you have to get an instance from the global variable:
Next you can convert a position on the currently active map into a global position on the Tamriel map by calling LocalToGlobal.
For example you can convert the local player position into a global position with the following line of code:
The resulting x and y can be saved, sent or whatever else you want to do with it.
NOTE: For some locations the global coordinates can be outside the bounds for normalized coordinates, for example Coldharbour has negative x coordinates as it is to the left of Tamriel in the global coordinate space.
After you have loaded or received a global position you just need to call GlobalToLocal to get the position on the current map.
Migrating from LibGPS2
LibGPS3 offers full backwards compatibility to LibGPS2 (see compatibility.lua), but it's still highly recommended to migrate to the new API.
In order to use the new API, simply access the library via the "LibGPS3" global variable instead of "LibGPS2" or LibStub.
Most functions stayed the same between v2 and v3, but there are a few breaking changes. The following list shows how to migrate those cases.
Renamed functions
Some function names have been changed to better reflect the return value.
Measurement object
GetCurrentMapMeasurement now returns an object with some convenience methods instead of a plain table. See the description below in the API reference for details on what it can do.
LocalToGlobal
The mapIndex return value has been removed as our understanding of what a map is has changed and it was deemed unnecessary for most use cases.
If you still need it, you can use GetCurrentMapMeasurement() to fetch the measurement object and retrieve it from there.
ZoneToGlobal
This method was used a long time ago to offer a way to migrate LibGPS1 coordinates. Since then it has become effectivly unnecessary and only causes confusion. As such it has been removed without replacement.
PanToMapPosition
This has become easily possible via ingame functionality since the time it was initially added to the library. Simply use "ZO_WorldMap_GetPanAndZoom():PanToNormalizedPosition(x, y)" instead.
OnLibGPS2MeasurementChanged callback
There is now a constant LIB_EVENT_STATE_CHANGED for the callback name, which should be used instead of the plain string.
API Reference
Here is a complete list of the functionality that is provided by LibGPS:
IsReady
Returns true as long as the player exists.
IsMeasuring
Returns true if the library is currently doing any measurements.
ClearMapMeasurements
Removes all cached measurement values.
ClearCurrentMapMeasurement
Removes the cached measurement for the map that is currently active.
GetCurrentMapMeasurement
Returns a measurement object for the active map or nil if the measurement could not be calculated for some reason.
See the description of the Measurement object for details.
GetMapMeasurementByMapId
Returns a measurement object for the requested map id or nil if the measurement could not be calculated for some reason.
See the description of the Measurement object for details.
GetCurrentMapParentZoneIndices
Returns the mapIndex, zoneIndex and zoneId of the parent zone for the currently set map.
CalculateMapMeasurement
Calculates the measurement for the current map and all parent maps.
This method does nothing if there is already a cached measurement for the active map.
Returns a boolean to indicate if the measurement was successful and a SetMapResultCode indicating if the map has changed independently of the actual result of the measurement.
LocalToGlobal
Converts the given map coordinates on the current map into coordinates on the Tamriel map.
Returns x and y on the world map or nil if the measurements of the active map are not available.
GlobalToLocal
Converts the given global coordinates into a position on the active map.
Returns x and y on the current map or nil if the measurements of the active map are not available.
SetPlayerChoseCurrentMap
This function sets the current map as player chosen so it won't snap back to the previous map.
SetMapToRootMap
Sets the best matching root map on the given global position: Tamriel, Cold Harbour or Clockwork City and what ever will come.
Returns SET_MAP_RESULT_FAILED, SET_MAP_RESULT_MAP_CHANGED depending on the result of the API calls.
MapZoomInMax
Repeatedly calls ProcessMapClick on the given global position starting on the root map (using the function above) until nothing more would happen.
Returns SET_MAP_RESULT_FAILED, SET_MAP_RESULT_MAP_CHANGED or SET_MAP_RESULT_CURRENT_MAP_UNCHANGED depending on the result of the API calls.
PushCurrentMap
This function stores information about how to return to the current map on a stack.
PopCurrentMap
Switches to the last map that was put on the stack.
Returns SET_MAP_RESULT_FAILED, SET_MAP_RESULT_MAP_CHANGED or SET_MAP_RESULT_CURRENT_MAP_UNCHANGED depending on the result of the API calls.
GetCurrentWorldSize
Returns the current size of Tamriel in world-units.
GetLocalDistanceInMeters
Returns the distance in meters of given local coords.
GetGlobalDistanceInMeters
Returns the distance in meters of given global coords.
GetWorldGlobalRatio
Returns how much greater the level is compared to its size on the map.
GetGlobalWorldRatio
Returns how much smaller global scaled values must be to fit the current level.
lib.LIB_EVENT_STATE_CHANGED
This callback is fired on the global CALLBACK_MANAGER when a map measurement begins or ends and passes the same value as lib:IsMeasuring().
If you have a custom handler for player waypoints in EVENT_MAP_PING you may want to ignore these events while a measurement is active.
Measurement
This object returned by GetCurrentMapMeasurement() contains all the data about a map measurement and offers some convenience functions to interact with them.
GetId
Returns a unique id for the measurement which is used to store it in the saved variables. Details are implementation specific and may change between versions.
GetMapIndex
Returns the mapIndex or nil if the measured map doesn't have one.
GetZoneId
Returns the zoneId for the measurement. Keep in mind that a map can have multiple zoneIds within its borders and a zoneId can also span multiple maps.
GetScale
Returns the scale in the global coordinate space for the current map.
GetOffset
Returns the offset in the global coordinate space for the current map.
IsValid
Returns true if the measurement contains valid data.
ToGlobal
Converts and returns global coordinates for a given local coordinate pair. Used by LocalToGlobal.
ToLocal
Converts and returns local coordinates for a given global coordinate pair. Used by GlobalToLocal.
GetCenter
Returns the center of the measured map as global coordinates.
Contains
Returns true if the given global coordinates are inside the measured map.
ABOUT THIS LISTING
This page describes LibGPS by sirinsidiator. The description and screenshots are the author's own, imported from their listing on ESOUI on 31 August 2026: https://www.esoui.com/downloads/info601-LibGPS.html
Mythiq.net hosts no files for it. The download button goes straight to the release file on cdn.esoui.com, so you are downloading from the author's own host, not from a copy of ours.
The download count, rating and comments on this page start at zero and count Mythiq.net only. The source's own figures are not copied here — they measure a different site, and a number that cannot be checked against our own ledger is not worth printing.
Requirements
Game versions
11.0.0
10.3.5
API VERSION
Built for ESO API version 11.0.0, 10.3.5. After a patch the game marks add-ons built for the previous API as out of date; the "Allow out of date add-ons" checkbox in the add-on menu loads them anyway, and most work.
LIBRARIES
Many ESO add-ons depend on a shared library — LibAddonMenu-2.0 above all — which is installed separately, exactly like an add-on. A dependency that is missing shows as the add-on simply not appearing in the list.
CONSOLE
Add-ons are PC and Mac only. There is no way to load them on console.
Installation
1. Download the archive with the button on this page and unzip it.
2. Move the unzipped folder into your add-ons directory:
Windows — Documents\Elder Scrolls Online\live\AddOns
3. Start the game, and at the character select screen click Add-Ons.
4. Tick the add-on. If it is greyed out and marked out of date, tick "Allow out of date add-ons" at the top of the same panel.
5. Log in. Most add-ons need a /reloadui after they are first enabled.
UPDATING
Delete the old folder first. ESO loads everything it finds, and two copies of one add-on is the usual cause of "an add-on has produced an error" on login.
This release downloads from cdn.esoui.com, not from us, so
there is no checksum to compare against. Scan the archive before you unpack it.
Version history
v3.3.3Latest
2 May 2025 · 16 KB via cdn.esoui.com · 0 downloads Download
version 3.3.3 - sirinsidiator
- Added compatibility for console
- Fixed world size calculation
- Updated license information
- Updated API version in manifest
version 3.3.2 - votan
- API bump for U40.
- Handle ingame missing map bug in GetLocalDistanceInMeters().
version 3.3.1 - votan
- Fixed typo. Thanks to @M-ree.
- Fixed missing parameter. Thanks to @HansK.
- Better "sub-zone without own map" handling.
version 3.3.0 - votan
Update for Necrom:
- New extra dimension: Aphocrypha.
- Better world size calculation.
- Replaced GetPlayerPosition with GetNormalizedPositionFromWorld where possible to get around the "frozen" positions.
- No need to persist world size measurements. One variable file less to load and save.
- Fixed sub-zones without own map, but different world scale.
- Removed unused code: WaypointManager.
version 3.2.0 - sirinsidiator
- Added new api to GetMeasurementByMapId (#17, thanks Thal-J!)
- Updated API version in manifest
version 3.1.0 - votan
- Update to API 101032.
- Use GetUniversallyNormalizedMapInfo.
- New root maps: Fargrave and Deathlands.
version 3.0.3 - sirinsidiator & votan
- Fixed nil error in some locations
- Fixed incorrect world size in some locations
version 3.0.2 - sirinsidiator & votan
- Added hook for SetMapToMapId
- Fixed some problems regarding Blackreach
- Simplified some internal code utilizing new API functions
- Updated API version in manifest
version 3.0.1 - sirinsidiator
- Added hook for SetMapToDigSitePosition (#10, thanks Shinni!)
- Fixed compatibility assertion when LibStub is not loaded
version 3.0.0 - sirinsidiator & votan
- Updated code structure and split it into multiple files
- Changed saved variable format to be more compact
- Switched to semantic versioning
- Switched to LibDebugLogger and LibChatMessage for debug and chat output respectively
- NOTE: Make sure you have them installed separately!
- Introduced a new API v3 and added compatibility layer for LibGPS2 ->
- NOTE: Check the migration guide on the description tab to see what has changed and how to switch to the new API
- Added experimental support for calculating distances in world space
- NOTE: Let us know if you find any problems
- Fixed some bugs and introduced new ones
- Updated API version in manifest
version 2.0 r21 - sirinsidiator
- Reverted a change that would cause measurements to be incorrect in combination with mini map addons
- NOTE: Persisted measurements will be wiped automatically
version 2.0 r20 - sirinsidiator
- Fixed error when LibStub is not loaded
version 2.0 r19 - sirinsidiator
- Fixed version updates for persistent measurements not working correctly in some cases
- Fixed ClearMapMeasurements not removing persistent data
- Fixed map measurements producing illegal values when the player pin is near the world origin for some reason, which could result in inaccurate measurements or even errors on load.
- NOTE: The error will still show up on the first load after updating the library, but should be gone after that
version 2.0 r18 - votan
- Persist measurements. Do not do them on every (re-)load again.
- API version update.
- Hook SetMapToAutoMapNavigationTargetPosition, too.
- LibMapPing not bundled anymore.
version 2.0 r17 - votan
- Update to API 100027 "Elsweyr".
version 2.0 r16 - sirinsidiator
- fixed error due to renamed methods in Murkmire
version 2.0 r15 - votan
- Handling the new zone "Artaeum".
version 2.0 r14 - votan
- Fixed MapZoomInMax. Now working for Cold Harbour and Clockwork City aswell.
- New function SetMapToRootMap(x, y) using global coordinates to choose the right root map.
- LibMapPing rev 6
- Fixed map ping events can cause wrong waypoint/rally pins in combination with addons changing the current map.
version 2.0 r13 - votan
- Fixed issue with missing waypoint pin, if addons use different revisions. Thanks to @babylon.
- Fully compatible with Morrowind+, now.
- Restore pan & zoom after measurement as well.
version 2.0 r12 - votan
Off-site on cdn.esoui.com —
no checksum, because we never held this file.
Link checked by our review team on 31 Aug 2026.
Tell us if something is wrong — a file that will not work, content taken from
someone else, or anything that looks unsafe. Reports go to our review team, not
to the author.
We use cookies to ensure that we give you the best experience on our website and improve your experience. By continuing to use this site you consent to such use of cookies.