纯 MoonBit 的 KML/KMZ 读写库:文档模型、XML 解析、点/线/面几何与样式
moon add cp15695540483/moonkmlimport {
"cp15695540483/moonkml" @kml,
}| 能力 | 状态 |
|---|---|
| KML 解析(XML 子集:元素、属性、文本、CDATA、注释、PI、实体引用) | ✅ |
| 几何:Point / LineString / Polygon(外环 + 内环)/ MultiGeometry | ✅ |
| Placemark name / description / styleUrl | ✅ |
| Style(LineStyle 颜色与宽度、PolyStyle 颜色) | ✅ |
| ExtendedData(Data name/value) | ✅ |
| KML 序列化(模型 → KML 文本) | ✅ |
| KMZ 读写(ZIP + DEFLATE 解压 + CRC32 校验) | ✅ |
| 导出 GeoJSON(RFC 7946)与 GPX 1.1 | ✅ |
| 命令行:摘要 / GeoJSON / GPX 输出 | ✅ |
| Camera / LookAt / 时间戳 / 网络链接 | 未实现(明确不做) |
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")
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 --gpxmoon 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)
HostIo(String)
}pub(all) enum Geometry {
Point(KmlPoint)
LineString(KmlLineString)
Polygon(KmlPolygon)
MultiGeometry(Array[Geometry])
}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?
}