Merging Maps by Georeference
Merge scans that never see each other by using the survey frame they were captured in, instead of running a visual overlap job.
Overview
Most MapSets are built by finding visual overlap between scans. That needs the scans to actually see each other, which fails on a large site: a conveyor corridor and a tank farm a kilometre apart share no imagery at all.
If those scans were captured in the same survey frame, the frame already tells you where each one sits. POST /v1/vps/map-set/from-georeference builds a MapSet from that instead.
Because the survey frame already fixes where each scan sits, the placement is exact rather than estimated, and no imagery has to be matched between them.
Requirements
Every map in the request must:
have been processed as a geo-referenced E57,
be in the same source frame as the others, meaning the same declared Helmert (one plant grid) or the same projected EPSG code,
be of the same generation, and not already belong to a MapSet.
A request that breaks any of these is rejected before anything is created:
400
A map is not geo-referenced, the maps are in different frames (the message names each map and its frame), or generations are mixed.
409
A map already belongs to a MapSet.
Creating the set
Builds a MapSet from the survey frame the scans were captured in, rather than from a visual overlap job, so sections of a site that never see each other can still be merged.
Every map must be a geo-referenced E57 in the same source frame: the same
declared Helmert (one plant grid), or the same projected EPSG code. Use
/map-set/overlap when the maps were not geo-referenced.
The origin is the map flagged origin: true, or a central one chosen for you.
frame decides where the set's coordinates are rooted.
Rejected with 400 when a map is not geo-referenced, when the maps are in
different frames, or when generations are mixed; 409 when a map already
belongs to a MapSet.
North plantWhere the set's coordinates are rooted: the origin map (the default), or the source grid's (0,0,0), which is available for Helmert-placed maps only.
origin-mapPossible values: MapSet created; every member is active immediately.
MSET-a1b2c3MAP_7QK2M9XR4TLDA map has no georeference origin, the maps are in different source frames, or generations are mixed
Unauthorized
A map was not found
A map is already part of a MapSet
POST /v1/vps/map-set/from-georeference HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 138
{
"name": "North plant",
"maps": [
{
"mapCode": "MAP_7QK2M9XR4TLD",
"origin": true
},
{
"mapCode": "MAP_3HN8P1WY6VZQ"
},
{
"mapCode": "MAP_5BD4R7KT2MFJ"
}
]
}{
"message": "text",
"mapSetCode": "MSET-a1b2c3",
"mapSetId": "text",
"originMapCode": "MAP_7QK2M9XR4TLD",
"frame": {
"kind": "helmert",
"description": "local grid -> WGS 84 via declared 7-parameter Helmert",
"rootedAt": "origin-map"
},
"georeference": {
"coordinates": {
"latitude": 41.42066483,
"longitude": -88.19195008,
"altitude": 134.068
},
"heading": 179.0607,
"frame": "origin-map"
},
"warnings": [
"text"
],
"maps": [
{
"mapCode": "text",
"order": 1,
"relativePose": {
"position": {
"x": -468,
"y": 2,
"z": -564
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
}
}
]
}Every member is active immediately, with no overlap job to wait on.
Choosing the origin
The order: 0 origin is the map you flag with origin: true. If you flag none, a central map is chosen for you, which keeps accuracy as even as possible across a large site.
Flag an origin deliberately when one part of the site is the natural reference for the people using it. Let it default when the set is large and evenly spread.
Choosing the frame
frame decides where the set's coordinates are rooted, and it is the one choice worth thinking about before you create the set.
origin-map
(default)
Rooted at the origin map
The default. Nothing changes for existing consumers.
local
Rooted at the source grid's (0,0,0), so set coordinates are that grid's coordinates
Helmert-placed maps only, when you want to work in the customer's plant grid directly
The set's own geo anchor
A set built this way carries a georeference of its own, returned by GET /v1/vps/map-set/{id}. Set queries use it for geo conversion in preference to the origin map's location.
With the default frame: "origin-map" the anchor is a copy of the origin map's location and heading, so nothing changes for anything already reading the set. With frame: "local" the anchor is the Helmert at the grid origin.
Adding maps later
A set built this way can be extended from the same survey frame, without an overlap job.
Adds one or more maps to a MapSet that was built from a shared survey frame. The maps are usable immediately, with no overlap job to wait on.
Every new map must be geo-referenced and in the same source frame as the set.
Maps already in the set never move, and the request is all or nothing: if any
map fails a check, none are added. Use PUT /map-set/overlap/{mapSetId} when
the map being added was not geo-referenced.
MapSet MongoDB ID or mapSetCode
Maps added, with the pose each was given
Maps added to the MapSet from their shared georeferenceMSET_9XQ2T7KD4MRV68c1f0a2b4d5e60011aa22b0The order 0 map the new poses were measured against
MAP_1AB2C3D4E5FGPresent only when something is worth checking before you rely on the result.
The set was not built from a survey frame, or a map is not geo-referenced, is in a different frame, or is of a different generation
Unauthorized
A map is not active
The MapSet, its order 0 map, or a map was not found
A map is already part of a MapSet
PUT /v1/vps/map-set/{mapSetId}/from-georeference HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 41
{
"maps": [
{
"mapCode": "MAP_7QK2M9XR4TLD"
}
]
}{
"message": "Maps added to the MapSet from their shared georeference",
"mapSetCode": "MSET_9XQ2T7KD4MRV",
"mapSetId": "68c1f0a2b4d5e60011aa22b0",
"frame": {
"rootedAt": "origin-map",
"description": "EPSG:25832"
},
"originMapCode": "MAP_1AB2C3D4E5FG",
"maps": [
{
"mapCode": "MAP_7QK2M9XR4TLD",
"relativePose": {
"position": {
"x": -468,
"y": 2,
"z": -564
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
}
}
],
"warnings": [
"text"
]
}Each entry carries either mapCode or mapId, not both. Pass a single-entry array to add one map.
Two guarantees worth relying on:
Maps already in the set never move. Poses your customer has already worked against stay exactly where they were.
The request is all or nothing. If any map fails a check, none are added.
Each new map must be in the same source frame the set was built in. The set already knows its own frame, so there is nothing to pass here.
Use PUT /v1/vps/map-set/overlap/{mapSetId} instead when the map being added was not geo-referenced.
Correcting the origin
Updates the coordinates and/or heading of a MapSet's origin. At least one of the two must be provided.
A set that carries its own geo anchor is updated there, and for a set on the
default origin-map frame the same values are also written to the order-0 map
so both stay consistent (mirroredToOriginMap: true). An older set without an
anchor updates the order-0 map instead.
applyTo overrides that choice, and the response's updated says what was
written.
MapSet _id or mapSetCode.
672d2d3186b28d5376433370At least one of coordinates or heading is required.
45MapSet origin updated successfully.
MapSet origin updated successfully672d2d3186b28d5376433370The _id of the origin map (order=0) that was updated.
67292e01be60965ad653bb65Invalid request, bad mapSetId, or body missing both coordinates and heading.
Unauthorized, MapSet does not belong to the caller's account.
MapSet not found, or no origin map (order=0) exists inside it.
Internal server error.
PUT /v1/vps/map-set/{mapSetId}/origin HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 86
{
"coordinates": {
"latitude": 12.9716,
"longitude": 77.5946,
"altitude": 920.4
},
"heading": 45
}{
"message": "MapSet origin updated successfully",
"mapSetId": "672d2d3186b28d5376433370",
"mapId": "67292e01be60965ad653bb65"
}Updates the coordinates and heading of the set's origin, mirroring the equivalent portion of PUT /v1/vps/map/{mapId}. At least one of coordinates or heading is required.
Which record is written depends on the set:
Has its own anchor, frame: origin-map
The set anchor, and the same values are mirrored onto the order-0 map (mirroredToOriginMap: true) so readers of either stay consistent
Has its own anchor, frame: local
The set anchor only. The map is left alone
Has no anchor (any set created before this endpoint existed)
The map holding order: 0, which is the original behaviour
applyTo overrides that choice: "mapset" creates or updates the set anchor (both coordinates and heading are required the first time), "origin-map" writes the map. The response's updated field says which happened.
Related
Coordinate Reference System, for declaring the Helmert or EPSG grid that makes this possible.
Merging Maps with Overlap, the visual route.
Geo-fence, which is rebuilt when an origin moves.
Last updated
Was this helpful?

