Fast, streaming AIXM 5.1/5.1.1/5.2 reader with deep geometry and relations insight.
A multiplatform library for parsing, indexing, and accessing AIXM 5.1/5.1.1/5.2 data. It turns raw AIXM messages into rich, queryable structures: feature metadata, time‑slice timelines, relation graphs, and fully computed geometries (points, lines, polygons, airspaces) – with explicit reporting of any issues encountered along the way.
FeatureMeta (type, UUID, designator) and TimesliceMeta (validity, interpretation, sequence/correction)aixm:designator, aixm:name)xlink:href (e.g., RunwayDirection → Runway)#uuid.*, urn:uuid:*, urn.uuid.*)xlink:href relations between featuresPoint/ElevatedPoint: gml:pos, gml:pointProperty
Curve/ElevatedCurve (geometryType: linestring):
gml:GeodesicString (great‑circle segments)gml:LineStringSegment (densified rhumb‑line segments)gml:ArcByCenterPoint and gml:CircleByCenterPointSurface/ElevatedSurface (geometryType: surface):
gml:PolygonPatch / gml:exterior / gml:Ringgml:curveMember inline curves or xlink:href to GeoBorderComputes horizontal projections from:
aixm:horizontalProjection)contributorAirspace dependenciesMulti‑component operations:
repeating_element + variants config allows RunwayMarking, VerticalStructure, etc., to expose mixed point/line/polygon geometries per partEvery failed or partial geometry is recorded as a GeometryIssue:
val dataset = indexWithReader(
fileSize = fileLength,
readRange = { start, end -> readBytesFromFile(start, end) },
computeDescriptors = true,
descriptorConfig = defaultDescriptorConfig(),
strategy = DescriptorStrategy.Topological,
featureFilter = null,
indexTimeslices = true,
indexRelations = true,
computeGeometries = true,
geometryConfig = defaultGeometryConfig(),
progress = { update ->
println("Phase=${update.phase}, done=${update.done}/${update.total}")
}
)
// Query geometries for a specific feature UUID
val geometryApi = DatasetGeometryLookup(dataset.timesliceGeometries)
val geometries = geometryApi.findGeometries("8C4199C9-2D93-4C5D-A673-368292013551")
@JsExport
suspend fun loadAndIndexAixm(xml: String): IndexedDataset {
return indexWithReader(
fileSize = xml.length.toLong(),
readRange = { start, end ->
xml.substring(start.toInt(), end.toInt()).encodeToByteArray()
},
computeDescriptors = false,
descriptorConfig = emptyMap(),
strategy = DescriptorStrategy.Topological,
featureFilter = null,
indexTimeslices = true,
indexRelations = false,
computeGeometries = true,
geometryConfig = defaultGeometryConfig(),
progress = null
)
}
for (rel in dataset.relations) {
println("${rel.sourceFeatureType} ${rel.sourceFeatureUuid} " +
"--${rel.relation}--> ${rel.targetFeatureUuid}")
}
Developed by: Annea s.r.o.
Lead Developers: Michal Kadlec
Contributors: Branislav Klčo
Developed with AI assistance.
Annea s.r.o.