Map Query
The three VPS query endpoints that return a 6-DoF pose, JSON body, form data and multi image, plus every optional query parameter.
The Map Query API returns a device's 6-DoF pose inside a map you have already scanned. Three endpoints do this, and they share the same response shape and the same optional parameters.
POST /vps/map/query
JSON
1, base64 encoded
The standard single-frame query, around 1 second
POST /vps/map/query-form
multipart form-data
1, as a file part
The same query when uploading a file is easier than encoding one
POST /vps/map/multi-image-query
multipart form-data
4 to 6, as file parts
A more robust pose in repetitive or difficult scenes
The endpoints come first below, then the parameters that apply across all of them.
VPS Query API
Query your map to get the device position with respect to Map local origin. The query API takes query image (encoded as base64 string) and other image metadata.
Code to identify the VPS map (required if mapSetCode is not provided)
MAP-X2P23E7Q35VDCode to identify the map set (required if mapCode is not provided)
MAPSET-ABC123Localization engine for this query. "vps-1" (default) is the fast standard engine (~2s). "vps-2" is a deep-search engine with up to 15% higher recall and improved accuracy, at higher latency (~3-4s). Ideal for offline or challenging scenes. Also supported on the multi-image query endpoint.
vps-1Example: vps-2Possible values: List of map codes for spatial hints (only valid with mapSetCode)
["MAP-X2P23E7Q35VD","MAP-Y3Q34F8R46WE"]Position hint [x, y, z] for spatial filtering. Must be in the map's left-handed (LHS / Unity) coordinate system, the same frame as the position field in a successful localization response (isRightHanded=false).
[2.5,0.1,8]Localize without naming a map. [latitude, longitude] in WGS 84 degrees. The nearest map whose geo-fence lies within geoSearchRadius (default 25m) is resolved and queried; if that map belongs to a map set, the whole set is queried. Distance is measured to the fence edge, so a point inside a fence is 0m. Only active maps with geoFenceReady=true are considered, and 404 is returned when nothing is in range. Mutually exclusive with mapId, mapCode, mapSetId and mapSetCode. It also doubles as geoHint when neither geoHint nor hintPosition is supplied, in which case hintRadius defaults to 100m rather than 25m, because a GPS fix is far less precise than a hint you supplied.
[37.794853,-122.394573]Overrides the geo-fence search radius in metres for this request only. Applies only when geoLocation is supplied, and is ignored otherwise. Falls back to 25m.
50Geographic hint [latitude, longitude, altitude], converted to a local hintPosition. WGS 84 degrees for latitude and longitude. Altitude is an ELLIPSOIDAL height in metres (height above the WGS 84 ellipsoid), not mean sea level. Enable use2DFiltering to ignore altitude.
[37.7749,-122.4194,10]Search radius in meters for spatial filtering (default 25m). Only applies when geoHint or hintPosition is provided. Range 5-100.
25When true, skip altitude (Y-axis) in geoHint spatial filtering, using only horizontal distance (X and Z axes). Only applies when geoHint is provided.
falseExample: falseFloor height band [y_min, y_max] in map-local coordinates. Search run within this vertical range. Works for both single Map and MapSet (positions are in global/MapSet coordinate space). Order does not matter, so [-3, -1] and [-1, -3] both select y ∈ [-3, -1].
[1.5,4.5]Convert result to geographic coordinates (adds GeoPose to response)
falseFlag to indicate if response pose is in right-handed coordinate system
falseBase64 encoded image data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAALQCAIAAADQFY7jAAAgAElEQVR4AaS9+5NdR5Lfh34BjW4AxJMgOTN8zCw5OzHriV2vvFrZDjtCVki2Xt5VaKVdybLClsL+3xz23+DQr9ZPlmO16xmvhQuery successful
Indicates if the pose was successfully found
trueConfidence score of the pose estimation
0.46875Array of matched map IDs
["67e12d4bff7ecf561f2f8a0c"]Array of matched map codes
["MAP_RJFKKWQ1787J"]Response time in milliseconds
2572Bad request
Unauthorized
POST /v1/vps/map/query HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 710
{
"mapCode": "MAP-X2P23E7Q35VD",
"mapSetCode": "MAPSET-ABC123",
"queryMode": "vps-2",
"hintMapCodes": [
"MAP-X2P23E7Q35VD",
"MAP-Y3Q34F8R46WE"
],
"hintPosition": [
2.5,
0.1,
8
],
"geoLocation": [
37.794853,
-122.394573
],
"geoSearchRadius": 50,
"geoHint": [
37.7749,
-122.4194,
10
],
"hintRadius": 25,
"use2DFiltering": false,
"hintFloorHeight": [
1.5,
4.5
],
"convertToGeoCoordinates": false,
"cameraIntrinsics": {
"fx": 664.3856201171875,
"fy": 664.3856201171875,
"px": 478.9782409667969,
"py": 364.9932861328125
},
"isRightHanded": false,
"resolution": {
"width": 960,
"height": 720
},
"queryImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAALQCAIAAADQFY7jAAAgAElEQVR4AaS9+5NdR5Lfh34BjW4AxJMgOTN8zCw5OzHriV2vvFrZDjtCVki2Xt5VaKVdybLClsL+3xz23+DQr9ZPlmO16xmvh"
}{
"poseFound": true,
"position": {
"x": -5.89516855615433,
"y": 1.225031596452081,
"z": 2.2112895596804227
},
"rotation": {
"x": -0.007873432249486393,
"y": 0.8212519784928444,
"z": 0.03204363652415735,
"w": 0.5696107462509017
},
"confidence": 0.46875,
"mapIds": [
"67e12d4bff7ecf561f2f8a0c"
],
"mapCodes": [
"MAP_RJFKKWQ1787J"
],
"responseTime": 2572
}Sample Response (JSON Body)
The map code for the map to query (required if mapSetCode is not provided)
The map set code for the map set to query (required if mapCode is not provided)
Localization engine for this query. "vps-1" (default) is the fast standard engine (~2s). "vps-2" is a deep-search engine with up to 15% higher recall and improved accuracy, at higher latency (~3-4s). Ideal for offline or challenging scenes. Also supported on the multi-image query endpoint.
vps-1Example: vps-2Possible values: Projection of the uploaded queryImage. "pinhole" (default) is a standard perspective photo, and fx, fy, px, py, width and height are required with it. "equirect" is a full 360 equirectangular panorama: camera intrinsics are not required and are ignored if sent, and the returned pose describes the forward-looking view, meaning the direction the centre column of the image faces. Works with both queryMode values.
pinholeExample: equirectPossible values: truePossible values: Focal length in x, in pixels. Required when imageType is pinhole, ignored when it is equirect.
669.535888671875Focal length in y, in pixels. Required when imageType is pinhole, ignored when it is equirect.
669.535888671875Principal point x, in pixels. Required when imageType is pinhole, ignored when it is equirect.
478.8777160644531Principal point y, in pixels. Required when imageType is pinhole, ignored when it is equirect.
364.9244079589844Image width in pixels. Required when imageType is pinhole, ignored when it is equirect.
960Image height in pixels. Required when imageType is pinhole, ignored when it is equirect.
720Image file for multipart requests. JPEG or PNG, 30 MB or smaller. For pinhole, resolution must not exceed 1280x1280. For equirect, width must be 2048 to 16384 px with an aspect ratio of at least 1.9:1 (a 2:1 panorama).
Convert result to geographic coordinates
falsePossible values: List of map codes for hints (only valid with mapSetCode)
["MAP-X2P23E7Q35VD","MAP-Y3Q34F8R46WE"]Position hint "x,y,z" (comma-separated string). Must be in the map's left-handed (LHS / Unity) coordinate system, the same frame as the position field in a successful localization response (isRightHanded=false).
2.5,0.1,8.0Localize without naming a map. "latitude,longitude" in WGS 84 degrees. The nearest map whose geo-fence lies within geoSearchRadius (default 25m) is resolved and queried; if that map belongs to a map set, the whole set is queried. Distance is measured to the fence edge, so a point inside a fence is 0m. Only active maps with geoFenceReady=true are considered, and 404 is returned when nothing is in range. Mutually exclusive with mapId, mapCode, mapSetId and mapSetCode. It also doubles as geoHint when neither geoHint nor hintPosition is supplied, in which case hintRadius defaults to 100m rather than 25m, because a GPS fix is far less precise than a hint you supplied.
37.794853,-122.394573Overrides the geo-fence search radius in metres for this request only. Applies only when geoLocation is supplied, and is ignored otherwise. Falls back to 25m.
50Geographic hint "latitude,longitude,altitude" (comma-separated). WGS 84 degrees for latitude and longitude. Altitude is an ELLIPSOIDAL height in metres (height above the WGS 84 ellipsoid), not mean sea level. Enable use2DFiltering to ignore altitude.
37.7749,-122.4194,10.0Search radius in meters for spatial filtering (default 25m). Only applies when geoHint or hintPosition is provided. Range 5-100.
25When true, skip altitude (Y-axis) in geoHint spatial filtering. Only applies when geoHint is provided.
falsePossible values: JSON-encoded floor height band "[y_min, y_max]" in map-local coordinates. Search run within this vertical range. Order does not matter.
[1.5, 4.5]Query successful
Indicates if the pose was successfully found
Bad request. Missing required fields (including fx, fy, px, py, width and height when imageType is pinhole), a pinhole image over 1280x1280, an equirect image outside 2048 to 16384 px width or below a 1.9:1 aspect ratio, an unreadable JPEG or PNG, or a file field not named queryImage.
Unauthorized
Payload too large. queryImage exceeds 30 MB.
POST /v1/vps/map/query-form HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: multipart/form-data
Accept: */*
Content-Length: 541
{
"mapCode": "text",
"mapSetCode": "text",
"queryMode": "vps-2",
"imageType": "equirect",
"isRightHanded": "true",
"fx": "669.535888671875",
"fy": "669.535888671875",
"px": "478.8777160644531",
"py": "364.9244079589844",
"width": "960",
"height": "720",
"queryImage": "binary",
"convertToGeoCoordinates": "false",
"hintMapCodes": [
"MAP-X2P23E7Q35VD",
"MAP-Y3Q34F8R46WE"
],
"hintPosition": "2.5,0.1,8.0",
"geoLocation": "37.794853,-122.394573",
"geoSearchRadius": "50",
"geoHint": "37.7749,-122.4194,10.0",
"hintRadius": "25",
"use2DFiltering": "false",
"hintFloorHeight": "[1.5, 4.5]"
}{
"poseFound": true,
"position": {
"x": -2.8765866867008025,
"y": 1.4018881843419664,
"z": 7.677072632098843
},
"rotation": {
"x": -0.0033476528966347096,
"y": 0.6750939967230872,
"z": -0.00310829178339555,
"w": 0.7377175796541121
},
"confidence": 0.9175769612711023,
"mapIds": [
"67e12d4bff7ecf561f2f8a0c"
],
"mapCodes": [
"MAP_RJFKKWQ1787J"
],
"responseTime": 2669
}Sample Response (Form Data)
Code Example (Python)
VPS Multi Image Query API
Multi-image query API requires a minimum of 4 images in each request. Up to 6 images can be passed. Higher image counts increase localization robustness and accuracy but may compromise latency.
Tracking poses are optional
The imageN_data parts are optional, which lets the multi-image query be used outside a SLAM session, for example from a set of stills or a camera rig with no tracking. Optional does not mean unnecessary: send them whenever you have them. A live ARKit or ARCore session already produces a pose per frame, and passing it gives the most accurate result.
Two rules:
Send a pose for every image, or for none. Without poses the images are matched against each other instead, so they must visually overlap. A partial set is not rejected, but it is treated exactly as if you had sent none, so it is worth making the choice explicit in your client.
A pose that you do send must be complete. All seven fields (
x,y,z,qx,qy,qz,qw) must be present together, and the value must be valid JSON. Either problem fails with400.
The trackingPose in the response is your input echoed back, so it is absent whenever the poses were not used.
Performs a query using several uploaded images, along with camera intrinsics and a map or map-set identifier. Requires a minimum of 4 images and accepts a maximum of 6 in a single request.
The request is multipart/form-data. The image binaries are sent as file parts named image1 to image6, and every other field, including each imageN_data tracking pose, is sent as a plain text part. The imageN_data parts are optional, but send them whenever you have them: they give the most accurate result. Send a tracking pose for every image, or for none of them. A pose sent for only some images is accepted but then not used, and the images must visually overlap each other, exactly as if you had sent none. A pose you do send must carry all seven fields and be valid JSON, or the request fails with 400.
Specifies whether the coordinate system is right-handed. Because this is form-data, it's sent as a string ("true" or "false").
truePossible values: The width (in pixels) of the input image(s).
960The height (in pixels) of the input image(s).
720The principal point x-coordinate.
478.838623046875The principal point y-coordinate.
365.346618652343The focal length along x-axis.
670.4620971679688The focal length along y-axis.
670.4620971679688Code to identify the map (required if mapSetCode is not provided).
A code to identify the map set.
Convert result to geographic coordinates
falsePossible values: List of map codes for hints (only valid with mapSetCode)
["MAP-X2P23E7Q35VD","MAP-Y3Q34F8R46WE"]Position hint "x,y,z" (comma-separated string). Must be in the map's left-handed (LHS / Unity) coordinate system — the same frame as the position field in a successful localization response (isRightHanded=false).
2.5,0.1,8.0Geographic hint "latitude,longitude,altitude" (comma-separated). WGS 84 degrees for latitude and longitude. Altitude is an ELLIPSOIDAL height in metres (height above the WGS 84 ellipsoid), not mean sea level. Enable use2DFiltering to ignore altitude.
37.7749,-122.4194,10.0Search radius in meters for spatial filtering (default 25m). Only applies when geoHint or hintPosition is provided. Range 5-100.
25When true, skip altitude (Y-axis) in geoHint spatial filtering. Only applies when geoHint is provided.
falsePossible values: JSON-encoded floor height band "[y_min, y_max]" in map-local coordinates. Search run within this vertical range. Order does not matter.
[1.5, 4.5]Localization engine. "vps-1" (default) is the standard engine. "vps-2" is the deep-search engine, slower but more accurate.
vps-1Example: vps-1Possible values: Widens how far the query searches inside a map, from 1 (default) to 5. Raise it on large maps. Higher values are slower.
1Example: 1The first image file to be uploaded.
Optional JSON-encoded tracking pose for image1: position x, y, z and rotation qx, qy, qz, qw.
{"x":-5.1772,"y":0.2936,"z":-2.6439,"qx":-0.0185,"qy":0.9949,"qz":-0.0691,"qw":0.0703}The second image file to be uploaded.
Optional JSON-encoded tracking pose for image2: position x, y, z and rotation qx, qy, qz, qw.
{"x":-3.12,"y":1.01,"z":2.56,"qx":0.0,"qy":0.707,"qz":0.0,"qw":0.707}The third image file to be uploaded.
Optional JSON-encoded tracking pose for image3: position x, y, z and rotation qx, qy, qz, qw.
{"x":1.23,"y":-0.56,"z":5.0,"qx":-0.0185,"qy":0.9949,"qz":-0.0691,"qw":0.0703}The fourth image file to be uploaded.
Optional JSON-encoded tracking pose for image4: position x, y, z and rotation qx, qy, qz, qw.
{"x":10.0,"y":-2.0,"z":0.0,"qx":0.0,"qy":1.0,"qz":0.0,"qw":0.0}Query successful
Bad request. Missing required fields, an image over 1280x1280, an unreadable JPEG or PNG, or an imageN_data tracking pose that is incomplete or not valid JSON.
Unauthorized - Missing or invalid token
Map/MapSet not found (if applicable)
Internal server error
POST /v1/vps/map/multi-image-query HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: multipart/form-data
Accept: */*
Content-Length: 929
{
"isRightHanded": "true",
"width": "960",
"height": "720",
"px": "478.838623046875",
"py": "365.346618652343",
"fx": "670.4620971679688",
"fy": "670.4620971679688",
"mapCode": "",
"mapSetCode": "",
"convertToGeoCoordinates": "false",
"hintMapCodes": [
"MAP-X2P23E7Q35VD",
"MAP-Y3Q34F8R46WE"
],
"hintPosition": "2.5,0.1,8.0",
"geoHint": "37.7749,-122.4194,10.0",
"hintRadius": "25",
"use2DFiltering": "false",
"hintFloorHeight": "[1.5, 4.5]",
"queryMode": "vps-1",
"depth": 1,
"image1": "binary",
"image1_data": "{\"x\":-5.1772,\"y\":0.2936,\"z\":-2.6439,\"qx\":-0.0185,\"qy\":0.9949,\"qz\":-0.0691,\"qw\":0.0703}",
"image2": "binary",
"image2_data": "{\"x\":-3.12,\"y\":1.01,\"z\":2.56,\"qx\":0.0,\"qy\":0.707,\"qz\":0.0,\"qw\":0.707}",
"image3": "binary",
"image3_data": "{\"x\":1.23,\"y\":-0.56,\"z\":5.0,\"qx\":-0.0185,\"qy\":0.9949,\"qz\":-0.0691,\"qw\":0.0703}",
"image4": "binary",
"image4_data": "{\"x\":10.0,\"y\":-2.0,\"z\":0.0,\"qx\":0.0,\"qy\":1.0,\"qz\":0.0,\"qw\":0.0}"
}{
"poseFound": true,
"estimatedPose": {
"position": {
"x": 3.9023228363353613,
"y": 2.2199969114542415,
"z": 7.684019738005462
},
"rotation": {
"x": 0.0008889080606250241,
"y": 0.7454695784085924,
"z": -0.022682644709609446,
"w": 0.6661529967948453
}
},
"trackingPose": {
"position": {
"x": 0.0022450201213359833,
"y": 2.471872329711914,
"z": -10.018059730529785
},
"rotation": {
"x": 0.030655404552817345,
"y": 0.14812710881233215,
"z": -0.00305502163246274,
"w": -0.9884883761405945
}
},
"imageId": "image4",
"mapIds": [
"67e12d4bff7ecf561f2f8a0c"
],
"confidence": 0.34274043817304123,
"frames": [
{
"imageId": "image1",
"poseFound": true,
"position": {
"x": 3.840479122718551,
"y": 2.235871409437739,
"z": 7.531184729001473
},
"rotation": {
"x": 0.0104227310558921,
"y": 0.7218904471209736,
"z": -0.0248105549134402,
"w": 0.6914338805274115
},
"confidence": 0.2988120487183476
},
{
"imageId": "image2",
"poseFound": true,
"position": {
"x": 3.8697402118840367,
"y": 2.228145503710395,
"z": 7.601552884101918
},
"rotation": {
"x": 0.0061140925713855,
"y": 0.7331886201553348,
"z": -0.0235510983247741,
"w": 0.6795726114402537
},
"confidence": 0.31204558839107516
},
{
"imageId": "image3",
"poseFound": false
},
{
"imageId": "image4",
"poseFound": true,
"position": {
"x": 3.9023228363353613,
"y": 2.2199969114542415,
"z": 7.684019738005462
},
"rotation": {
"x": 0.0008889080606250241,
"y": 0.7454695784085924,
"z": -0.022682644709609446,
"w": 0.6661529967948453
},
"confidence": 0.34274043817304123
}
],
"mapCodes": [
"MAP_RJFKKWQ1787J"
],
"responseTime": 4919
}Sample Response (Multi Image)
Per-image poses (frames)
Alongside the single estimatedPose, the response carries a frames array with one entry per image you sent, in the order the images were numbered. Each entry reports whether that individual image localized on its own, and if it did, the 6-DoF pose computed from it.
imageId
string
Which image this entry describes (image1 to image6), matching the file part you uploaded.
poseFound
boolean
Whether this individual image produced a pose.
position
object
x, y, z in map-local coordinates. Present only when poseFound is true.
rotation
object
Quaternion x, y, z, w. Present only when poseFound is true.
confidence
number
Confidence score for this image alone. May be absent on a frame that did not localize.
How frames relates to the top-level pose:
estimatedPoseremains the answer to use. It is the consensus pose across all images and is more robust than any single frame.The top-level
imageIdnames the winning frame, so the entry with thatimageIdcarries the sameposition,rotation, andconfidenceasestimatedPose.Every pose in
framesis in the same coordinate frame asestimatedPose: it follows theisRightHandedvalue you sent, and on a versioned map it is expressed in the base map's frame.Individual frames can fail while the overall query succeeds. A frame with
"poseFound": falsehas nopositionorrotation, which is normal when one image in the set is blurred, occluded, or pointed at a featureless surface.framesis informational. It is useful for diagnosing capture quality, spotting outlier viewpoints, and understanding which frames drove the result, but you do not need it for standard localization.
Code Example (Python)
Split the request in two parts: the image binaries go in files, and every other field, including each imageN_data tracking pose, goes in data as a string.
Query Parameters
Every parameter below is optional, and all of them apply to the query endpoints above. Omit them and the query still runs.
For the remaining localization parameters, geoHint, hintRadius, use2DFiltering and hintMapCodes, see Localization.
Spatial Hint: hintPosition
The hintPosition parameter restricts the localization search to a radius around a given point in the map, speeding up the query and improving accuracy in visually repetitive scenes.
hintPosition
[x, y, z]
Hint point in the map's left-handed (LHS / Unity) coordinate system
hintRadius
number
Search radius in meters (default 25, range 5–100)
On form-data endpoints, pass hintPosition as a JSON-encoded string, e.g. "[2.5, 0.1, 8.0]". See Pose Prior : HintPosition for the full guide.
Floor-Level Search: hintFloorHeight
The hintFloorHeight parameter limits the search to a specific vertical band, enabling floor-level localization in multi-floor buildings.
hintFloorHeight
[y_min, y_max]
Vertical band in map-local Y coordinates
Rules:
Both values are in map-local coordinates (or global MapSet coordinates for MapSet queries)
Order does not matter:
[-3, -1]and[-1, -3]both select images with y ∈ [-3, -1]Can be combined with
hintPosition: spatial filter runs first, height filter applies on the result
Examples:
Query Mode: queryMode
The queryMode parameter selects which localization engine runs your query, letting you trade latency for accuracy. The request and response format stay exactly the same on both engines.
vps-1
Standard (default)
The fast standard localization engine, roughly 1 second for a single-frame query and 2 to 4 seconds for a multi-image query. Best for real-time, interactive localization.
vps-2
Deep Search
A deep-search engine with up to 15% higher recall and improved accuracy, at higher latency (around 2 seconds for a single-frame query, around 5 seconds for a multi-image query). Best for offline or background workflows and challenging, visually repetitive scenes.
Rules:
Optional. When omitted, the query runs on
vps-1, so existing integrations are unaffected.Supported on the single-image endpoints,
/vps/map/query(JSON) and/vps/map/query-form(form-data), includingimageType=equirect, and on the multi-image endpoint,/vps/map/multi-image-query.Can be combined with all localization parameters (
hintPosition,hintRadius,hintFloorHeight,geoHint,hintMapCodes).Works with Maps, MapSets, and versioned maps.
Examples:
Search Depth: depth
depth widens how far the query searches inside a map before it settles on a pose. Raise it on large maps and wide open spaces, where the right part of the space is harder to find.
1
Default. Suits most maps.
2 to 5
Progressively wider. Useful on large venues.
Rules:
Optional. An integer from
1to5, defaulting to1, so existing integrations are unaffected.Supported on the single-image endpoints,
/vps/map/query(JSON) and/vps/map/query-form(form-data), and on the multi-image endpoint,/vps/map/multi-image-query.Applies to both
pinholeandequirectqueries, and to bothqueryModevalues.A wider search takes longer, so raise it only as far as you need.
Works with Maps, MapSets, and versioned maps, and combines with the other localization parameters.
Example:
Localize by Coordinate: geoLocation
geoLocation localizes without naming a map. Send a position and the nearest map whose geo-fence is in range is resolved and queried for you.
geoLocation
[latitude, longitude] in WGS 84 degrees. Mutually exclusive with mapId, mapCode, mapSetId and mapSetCode.
geoSearchRadius
Overrides the search radius in metres for this request only. Ignored unless geoLocation is supplied. Defaults to 25 m.
Rules:
Only active maps in your account with
geoFenceReady: trueare considered.Distance is measured to the fence edge, so a point inside a fence is
0m away.If the resolved map belongs to a MapSet, the whole set is queried, which is what you want indoors.
When nothing is in range the request returns
404.
A successful response carries resolvedFrom, naming the map the coordinates landed on:
Image Type: imageType
imageType tells the query which projection your image uses. It applies to /vps/map/query-form only.
pinhole
A standard perspective photo (default)
Required. Send fx, fy, px, py, width, height.
equirect
A full 360° equirectangular panorama
Not required. Send them and they are ignored.
A pinhole query needs intrinsics before a pixel can become a direction. An equirectangular image carries that already, so there is nothing to send. You get back one pose: the pose of the forward-looking view, meaning the direction the centre column of the image faces.
Rules:
Optional. When omitted the query runs as
pinhole, so existing integrations are unaffected.Works with both
queryModevalues.queryMode=vps-2runs the panorama on the deep-search engine.queryImagemust be 2048 to 16384 px wide with an aspect ratio of at least 1.9:1, and 30 MB or smaller. Outside that, the request fails with400, or413if it is only the file size.Works with Maps, MapSets, and versioned maps, and with all localization parameters.
REST only. The Unity, Quest, iOS and Android SDKs capture perspective frames and do not expose
imageType.
Example:
The response has the same shape as a pinhole query: poseFound, position, rotation, confidence, and the matched mapIds and mapCodes. The rotation describes the forward-looking view, so orient your panorama with its centre column along your direction of travel if you want the returned heading to mean that. See Equirect Query.
Last updated
Was this helpful?

