EasyAR Mega Annotation-Format 0.5
Dieses Dokument definiert die Formatspezifikation von EMA 0.5.
Vorbereitung
- Lesen Sie die Einführung in das EasyAR Mega Annotation-Format, um die Nutzung und Einsatzszenarien von EMA kennenzulernen.
In diesem Dokument bezeichnet "Producer" ein Programm, das EMA-Daten erzeugt, und "Consumer" ein Programm, das EMA-Daten liest.
Formatkonventionen
- EMA-Dateien verwenden UTF-8-Codierung und folgen der durch RFC 8259 definierten JSON-Syntax.
- Feldnamen innerhalb desselben Objekts dürfen nicht doppelt vorkommen.
- Feldnamen unterscheiden Groß- und Kleinschreibung. Die in diesem Dokument definierten Feldnamen müssen die Formen aus Tabellen und Beispielen verwenden.
- Erforderliche Felder müssen vorhanden sein und die in den Tabellen definierten Typen verwenden. Optionale Felder können ohne Wert ausgelassen werden.
- UUIDs werden als Zeichenfolgen mit Bindestrichen geschrieben, zum Beispiel
123e4567-e89b-12d3-a456-426614174000. - Zeitstempel verwenden UTC-Datum-Uhrzeit-Zeichenfolgen im Format
YYYY-MM-DDThh:mm:ssZmit Sekundengenauigkeit. Zum Beispiel2026-08-12T00:00:00Z. Dieses Format folgt der durch W3C Date and Time Formats definierten UTC-Darstellung. - Koordinatentransformationen verwenden ein rechtshändiges OpenGL-Koordinatensystem: +X nach rechts, +Y nach oben, +Z nach hinten.
Dokumentstruktur
Das Root-Objekt eines EMA-Dokuments enthält Formatversion, Generator, Erweiterungsdeklarationen, Mega-Block-Liste und Annotationsliste.
Beispiel für die Struktur des EMA-Root-Objekts:
{
"version": "0.5.0",
"generatedBy": "EasyAR Mega Support 2.14.0",
"blocks": [],
"annotations": [],
"extensions": []
}
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
version |
string | Ja | EMA-Formatversion. Ein 0.5-Dokument wird als 0.5.0 geschrieben. |
generatedBy |
string | Ja | Informationen über das Werkzeug oder Subjekt, das das Dokument erzeugt hat, üblicherweise mit Produktname und Version. |
blocks |
array<Block> | Ja | Vom Dokument referenzierte Mega Blocks. Dies kann ein leeres Array sein. |
annotations |
array<Annotation> | Ja | Annotationsobjekte. Dies kann ein leeres Array sein. |
extensions |
array<string> | Nein | Vom Dokument verwendete Erweiterungsdeklarationen. Siehe Erweiterungen. |
Block
Block stellt einen von einem EMA-Dokument referenzierten Mega Block und dessen Koordinateninformationen dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id |
UUID string | Ja | Eindeutige Kennung des Mega Blocks. Es muss der vom EasyAR Mega-Dienst zurückgegebene Wert verwendet werden. |
timestamp |
date-time string | Ja | Letzte Änderungszeit des Mega Blocks. Es muss der vom EasyAR Mega-Dienst zurückgegebene Wert verwendet werden. Siehe Formatkonventionen. |
location |
Location | Nein | Geografische WGS-84-Position des Mega-Block-Ursprungs. |
transform |
Transform | Ja | Transformation des Mega Blocks relativ zum Root-Koordinatensystem der EMA-Szene. |
keepTransform |
boolean | Ja | Gibt an, ob das im Dokument aufgezeichnete transform beibehalten und angewendet wird. true bedeutet, die manuell angepasste Transformation beizubehalten. |
Mega-Block-Beispiel:
{
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z",
"location": {
"latitude": 31.2304,
"longitude": 121.4737,
"altitude": 5.5
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
},
"keepTransform": true
}
Annotation
Annotation stellt eine Annotation in einem EMA-Dokument dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type |
string | Ja | Annotationstyp. Der Wert ist node oder relationship. |
id |
UUID string | Ja | Eindeutige Kennung der Annotation. IDs in annotations sollten eindeutig sein. |
timestamp |
date-time string | Ja | Letzte Änderungszeit der Annotation. Siehe Formatkonventionen. |
featureType |
string | Nein | Feature-Typ, zu dem die Annotation gehört. |
properties |
object | Nein | Annotationseigenschaften und Erweiterungsdaten. |
Node
Node stellt eine Annotation mit räumlicher Position dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type |
string | Ja | Fest auf node. |
geometry |
string | Ja | Geometrietyp. Der Wert ist point oder cube. |
parent |
Parent | Ja | Referenzkoordinatensystem der node-Annotation. Es kann auf einen Mega Block oder eine geografische WGS-84-Position verweisen; zur Produktunterstützung für Letzteres siehe WorldParent. |
transform |
Transform | Ja | Transformation der node-Annotation relativ zum Referenzkoordinatensystem. Die enthaltenen Felder werden durch geometry bestimmt. |
Wenn geometry den Wert point hat, stellt es einen Positionspunkt dar. Bei cube stellt es einen quaderförmigen Bereich mit Ursprung als Zentrum dar. Anforderungen an transform finden Sie unter Transform.
Beispiel einer Punktannotation:
{
"type": "node",
"id": "b62fd4b5-66aa-4418-a603-69ae6faedbe6",
"timestamp": "2026-08-12T00:00:01Z",
"geometry": "point",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 1.0, "y": 2.0, "z": 3.0 }
},
"properties": {
"name": "Entrance"
}
}
Beispiel einer Quaderbereich-Annotation:
{
"type": "node",
"id": "76c0e24a-a01a-4a50-9246-e7d827c96b38",
"timestamp": "2026-08-12T00:00:02Z",
"geometry": "cube",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 0.5, "y": 1.75, "z": 0.5 }
}
}
Relationship
Relationship stellt eine Beziehung zwischen Annotationen dar und kann mehrere Annotationen zu einer Sammlung organisieren.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type |
string | Ja | Fest auf relationship. |
members |
array<UUID string> | Ja | Zeichnet die IDs der Mitgliedsannotationen der Reihe nach auf. Mitglieder können auf node- oder relationship-Annotationen verweisen. |
Beispiel einer Beziehungsannotation:
{
"type": "relationship",
"id": "b7cf28e4-041e-460e-81cf-a0591c09faee",
"timestamp": "2026-08-12T00:00:03Z",
"members": [
"b62fd4b5-66aa-4418-a603-69ae6faedbe6",
"76c0e24a-a01a-4a50-9246-e7d827c96b38"
],
"properties": {
"name": "Annotation Group",
"isDirected": false
}
}
Parent
Parent stellt das Referenzkoordinatensystem dar, an dem ein Node hängt, und bestimmt die Interpretationsbasis seiner räumlichen Transformation.
BlockParent
BlockParent stellt ein auf einem Mega Block basierendes Referenzkoordinatensystem dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type |
string | Ja | Fest auf block. |
id |
UUID string | Ja | ID des referenzierten Mega Blocks. Diese ID sollte in blocks des Root-Objekts vorhanden sein. |
timestamp |
date-time string | Ja | Änderungszeit des Mega Blocks, auf den bei Erstellung oder Aktualisierung der Annotation verwiesen wurde. Siehe Formatkonventionen. |
WorldParent
WorldParent stellt ein Welt-Referenzkoordinatensystem dar, dessen Ursprung eine WGS-84-Position ist.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type |
string | Ja | Fest auf world. |
location |
Location | Ja | Geografische WGS-84-Position des Ursprungs des Referenzkoordinatensystems der node-Annotation. |
Warnung
EMA 0.5 definiert die Struktur, in der parent.type den Wert world hat, aber EasyAR Mega Studio 2.13 und Versionen nach EasyAR Sense Unity Plugin 4003 haben die zugehörigen Funktionen entfernt. Die Formatdefinition bedeutet nicht, dass diese Produktversionen die Verwendung von WorldParent unterstützen.
Koordinaten und Basistypen
Location
Location stellt eine geografische WGS-84-Position dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
latitude |
number | Ja | Breitengrad, eine 64-Bit-Gleitkommazahl in Dezimalgrad. |
longitude |
number | Ja | Längengrad, eine 64-Bit-Gleitkommazahl in Dezimalgrad. |
altitude |
number | Ja | Höhe, eine 64-Bit-Gleitkommazahl in Metern. |
Transform
Transform stellt die räumliche Transformation eines Objekts relativ zu einem Referenzkoordinatensystem dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
position |
Vector3F | Ja | Position relativ zum Referenzkoordinatensystem. |
rotation |
Vector4F | Bedingt | Rotation relativ zum Referenzkoordinatensystem. |
scale |
Vector3F | Bedingt | Skalierung relativ zum Referenzkoordinatensystem. |
Die Anforderungen für jedes Feld in verschiedenen Anwendungsfällen lauten wie folgt:
| Anwendungsfall | position |
rotation |
scale |
|---|---|---|---|
| Mega Block | Erforderlich | Erforderlich | Erforderlich |
Annotation, deren geometry point ist |
Erforderlich | Ausgelassen | Ausgelassen |
Annotation, deren geometry cube ist |
Erforderlich | Erforderlich | Erforderlich |
Vector3F
Vector3F stellt einen dreidimensionalen Vektor für Position und Skalierung dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
x |
number | Ja | x-Achsen-Komponente, eine 32-Bit-Gleitkommazahl. |
y |
number | Ja | y-Achsen-Komponente, eine 32-Bit-Gleitkommazahl. |
z |
number | Ja | z-Achsen-Komponente, eine 32-Bit-Gleitkommazahl. |
Vector4F
Vector4F stellt ein Quaternion zur Aufzeichnung von Rotation dar.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
x |
number | Ja | x-Komponente des Quaternions, eine 32-Bit-Gleitkommazahl. |
y |
number | Ja | y-Komponente des Quaternions, eine 32-Bit-Gleitkommazahl. |
z |
number | Ja | z-Komponente des Quaternions, eine 32-Bit-Gleitkommazahl. |
w |
number | Ja | w-Komponente des Quaternions, eine 32-Bit-Gleitkommazahl. |
Eigenschaften
properties speichert allgemeine Eigenschaften, Feature-Eigenschaften und Erweiterungsdaten von Annotationen. Dieses Feld ist ein Schlüssel-Wert-Objekt, dessen Wert jeder JSON-Wert sein kann.
EMA 0.5 definiert die folgenden allgemeinen Eigenschaften:
| Eigenschaft | Gültiges Objekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name |
node, relationship |
string | Nein | Anzeigename der Annotation. |
isDirected |
relationship |
boolean | Nein | Gibt an, ob die Beziehung gerichtet ist. Wenn nicht angegeben, ist der Wert true. |
category |
relationship |
string | Nein | Beziehungskategorie. |
Feature-Typen
featureType gibt den Feature-Typ an, an dem die Annotation teilnimmt. Jeder Feature-Typ definiert Struktur, Beziehung und spezielle Eigenschaften der zugehörigen Annotationen.
Navigationspunktgraph
Ein Navigationspunktgraph stellt Navigationspunkte im Raum, Routen zwischen Navigationspunkten und das daraus bestehende Netzwerk dar. Er kann Routen und Konnektivitätsbeziehungen ausdrücken. Alle Annotationen, die den Navigationspunktgraph bilden, setzen featureType auf navPointGraph.
Der Navigationspunktgraph besteht aus drei Annotationstypen:
| Objekt | Strukturanforderung |
|---|---|
| Navigationspunkt | type ist node, und geometry ist point. |
| Route | type ist relationship, und members verweist der Reihe nach auf zwei Navigationspunkte. |
| Netzwerk | type ist relationship, und members verweist auf Navigationspunkte und Routen, die im Netzwerk enthalten sind. |
Beziehungsannotationen in einem Navigationspunktgraph verwenden die folgenden properties-Eigenschaften:
| Eigenschaft | Gültiges Objekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
category |
Route, Netzwerk | string | Ja | Unterscheidet Beziehungstypen: Route ist route, Netzwerk ist network. |
isDirected |
Route | boolean | Nein | true bedeutet vom ersten Navigationspunkt in members zum zweiten; false bedeutet ungerichtet. |
weight |
Route | number | Nein | Routengewicht, eine 32-Bit-Gleitkommazahl. Die genaue Bedeutung wird von der Anwendung definiert, die den Navigationspunktgraph verwendet. |
Beispiel einer Navigationspunktgraph-Annotation:
[
{
"type": "node",
"id": "25634f2e-c42d-4163-84c4-86757e8f6e8f",
"timestamp": "2026-08-12T00:00:00Z",
"featureType": "navPointGraph",
"geometry": "point",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 }
}
},
{
"type": "node",
"id": "fa144e57-c388-4673-a940-9a3f904247c5",
"timestamp": "2026-08-12T00:00:01Z",
"featureType": "navPointGraph",
"geometry": "point",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 }
}
},
{
"type": "relationship",
"id": "455427a3-b68d-4237-a78f-22213de89dc8",
"timestamp": "2026-08-12T00:00:02Z",
"featureType": "navPointGraph",
"members": [
"25634f2e-c42d-4163-84c4-86757e8f6e8f",
"fa144e57-c388-4673-a940-9a3f904247c5"
],
"properties": {
"category": "route",
"isDirected": true,
"weight": 1.0
}
},
{
"type": "relationship",
"id": "b579c5fe-e574-410b-853f-77c985966d0f",
"timestamp": "2026-08-12T00:00:03Z",
"featureType": "navPointGraph",
"members": [
"25634f2e-c42d-4163-84c4-86757e8f6e8f",
"fa144e57-c388-4673-a940-9a3f904247c5",
"455427a3-b68d-4237-a78f-22213de89dc8"
],
"properties": {
"category": "network"
}
}
]
Erweiterungen
Erweiterungen fügen Annotationen benutzerdefinierte Daten hinzu, ohne die EMA-0.5-Kernstruktur zu ändern.
Das Array extensions des Root-Objekts deklariert die vom Dokument verwendeten Erweiterungen. Jeder Eintrag verwendet das folgende Format:
PROVIDER:NAME#MAJOR.MINOR.PATCH
PROVIDERist der Name des Erweiterungsanbieters.NAMEist der Name der Erweiterung.- Die Version besteht aus drei nicht negativen Ganzzahlen.
PROVIDERundNAMEdürfen weder:noch#enthalten.- Dasselbe
PROVIDER:NAMEwird inextensionsnur einmal deklariert.
Erweiterungsdaten werden in den properties der Annotation gespeichert, mit dem Eigenschaftsnamen PROVIDER:NAME und ohne Versionsnummer. Der Erweiterungswert kann jeder JSON-Wert sein. Ein JSON-Objekt wird empfohlen, damit später Felder hinzugefügt werden können.
Beispiel für Erweiterungsdeklaration und -daten:
{
"version": "0.5.0",
"generatedBy": "Sample Producer 1.0.0",
"extensions": [
"SampleCompany:SampleExtension#1.0.0"
],
"blocks": [],
"annotations": [
{
"type": "relationship",
"id": "15da6815-174a-4963-ac27-6dc97f324474",
"timestamp": "2026-08-12T00:00:04Z",
"members": [],
"properties": {
"SampleCompany:SampleExtension": {
"label": "sample",
"priority": 10
}
}
}
]
}
Konsistenzanforderungen
Producer sollten sicherstellen, dass:
- Mega-Block-IDs und Annotations-IDs sind in ihren jeweiligen Sammlungen eindeutig.
- Wenn
parent.typeblockist, verweistparent.idauf einen vorhandenen Mega Block inblocks. - Wenn
typerelationshipist, verweisen IDs inmembersauf vorhandene Annotationen inannotations. - In
propertiesverwendete Erweiterungseigenschaften haben entsprechende Deklarationen inextensions.
Consumer können unbekannte normale Felder ignorieren. Unbekannte Werte für type, parent.type oder geometry sind als nicht unterstützte Daten zu behandeln.
Vollständiges Beispiel
Beispiel eines vollständigen EMA-Dokuments mit Erweiterungsdaten:
{
"version": "0.5.0",
"generatedBy": "EasyAR Mega Support 2.14.0",
"extensions": [
"SampleCompany:SampleExtension#1.0.0"
],
"blocks": [
{
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z",
"location": {
"latitude": 31.2304,
"longitude": 121.4737,
"altitude": 5.5
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
},
"keepTransform": true
}
],
"annotations": [
{
"type": "node",
"id": "b62fd4b5-66aa-4418-a603-69ae6faedbe6",
"timestamp": "2026-08-12T00:00:01Z",
"geometry": "point",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 1.0, "y": 2.0, "z": 3.0 }
},
"properties": {
"name": "Entrance",
"SampleCompany:SampleExtension": {
"label": "sample",
"priority": 10
}
}
},
{
"type": "node",
"id": "76c0e24a-a01a-4a50-9246-e7d827c96b38",
"timestamp": "2026-08-12T00:00:02Z",
"geometry": "cube",
"parent": {
"type": "block",
"id": "37f11da4-84c0-4fd1-839f-0d86a43cce21",
"timestamp": "2026-08-12T00:00:00Z"
},
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 0.5, "y": 1.75, "z": 0.5 }
},
"properties": {
"name": "Display Area"
}
},
{
"type": "relationship",
"id": "b7cf28e4-041e-460e-81cf-a0591c09faee",
"timestamp": "2026-08-12T00:00:03Z",
"members": [
"b62fd4b5-66aa-4418-a603-69ae6faedbe6",
"76c0e24a-a01a-4a50-9246-e7d827c96b38"
],
"properties": {
"name": "Tour Area",
"isDirected": false
}
}
]
}