纯 MoonBit 的 KML/KMZ 读写库:文档模型、XML 解析、点/线/面几何与样式
moon add cp15695540483/moonkmlimport {
"cp15695540483/moonkml" @kml,
}| 能力 | 状态 |
|---|---|
| KML 解析(XML 子集:元素、属性、文本、CDATA、注释、PI、实体引用) | ✅ |
| 几何:Point / LineString / Polygon(外环 + 内环)/ MultiGeometry / gx:Track | ✅ |
| Placemark name / description / styleUrl / Folder 路径 / TimeStamp·TimeSpan | ✅ |
| Style(LineStyle / PolyStyle / IconStyle / LabelStyle)与 StyleMap | ✅ |
| ExtendedData(Data name/value) | ✅ |
| KML 序列化(模型 → KML 文本) | ✅ |
| KMZ 读写(ZIP + DEFLATE + CRC32);多条目/资源提取 | ✅ |
| GeoJSON 导入与导出(RFC 7946)、GPX 1.1 导入与导出 | ✅ |
| 数据校验(坐标越界、环闭合、样式悬空、gx:Track 一致性) | ✅ |
| 命令行:摘要 / GeoJSON / GPX 输出 / 校验 | ✅ |
| Camera / LookAt / NetworkLink / 三维模型与叠置图层 | 未实现(明确不做,见覆盖矩阵) |
let doc = try! @kml.parse(kml_text)
println(doc.name)
for pm in doc.placemarks {
match pm.geometry {
Some(@kml.Geometry::Point(p)) => println(pm.name + ": " + p.lon.to_string() + ", " + p.lat.to_string())
Some(@kml.Geometry::LineString(ls)) => println(pm.name + ": " + ls.point_count().to_string() + " vertices")
Some(@kml.Geometry::Polygon(poly)) => println(pm.name + ": " + poly.inner_count().to_string() + " holes")
Some(@kml.Geometry::MultiGeometry(gs)) => println(pm.name + ": " + gs.length().to_string() + " parts")
Some(@kml.Geometry::GxTrack(t)) => println(pm.name + ": " + t.point_count().to_string() + " track points")
None => println(pm.name + ": no geometry")
}
}let doc = try! @kml.kmz_parse(kmz_bytes) // 支持 DEFLATE 压缩的标准 KMZ
let bytes = @kml.kmz_pack(doc) // 打包为 KMZlet geojson = @kml.to_geojson(doc)
let gpx = @kml.to_gpx(doc)
let kml_text = @kml.serialize(doc)moon run cmd/main -- examples/sample.kml --summary
moon run cmd/main -- examples/sample.kml --geojson
moon run cmd/main -- examples/sample.kml --gpx
moon run cmd/main -- examples/sample.kml --validate| 用例 | 平均耗时 |
|---|---|
| 解析 1000 个点 Placemark | 5.15 ms |
| 序列化 1000 个点 Placemark | 1.24 ms |
| KMZ 打包(200 点) | 2.28 ms |
| KMZ 解包(200 点) | 1.04 ms |
moon check --target wasm-gc --deny-warn
moon test --target wasm-gc
moon test --target js
moon fmt --checkpub(all) suberror KmlError {
XmlSyntax(String, Int)
XmlMismatch(String, String, Int)
XmlUnexpectedEnd(String, Int)
XmlUnclosed(String, Int)
XmlMissingRoot
XmlMultipleRoots(Int)
MissingCoordinates
BadCoordinates(String)
BadGeoJson(String)
BadGpx(String)
HostIo(String)
}pub(all) enum Geometry {
Point(KmlPoint)
LineString(KmlLineString)
Polygon(KmlPolygon)
MultiGeometry(Array[Geometry])
GxTrack(KmlGxTrack)
}pub(all) struct KmlPoint {
lon : Double
lat : Double
alt : Double?
}pub(all) struct KmlStyle {
id : String
line_color : String?
line_width : Double?
fill_color : String?
icon_href : String?
icon_scale : Double?
label_color : String?
label_scale : Double?
}pub(all) struct KmlStyleMap {
id : String
normal : String
highlight : String
}pub(all) struct KmlTime {
when : String
begin : String
end : String
}pub(all) struct ValidationIssue {
placemark : String
message : String
}