plateau_lod2_mesh — DRIVE japan op

• 数据种类:any → table

• 调用: import fullseye as fs; fs.ledger.plateau_lod2_mesh(source: 'str | Path | bytes', *, origin: 'tuple[float, float, float] | None' = None, ids: 'Iterable[str] | None' = None, bbox_latlon: 'tuple[float, float, float, float] | None' = None, on_bad_polygon: 'str' = 'raise') -> 'dict[str, Any]'(要直接调用实现,import driveplateau; driveplateau.plateau_lod2_mesh(source: 'str | Path | bytes', *, origin: 'tuple[float, float, float] | None' = None, ids: 'Iterable[str] | None' = None, bbox_latlon: 'tuple[float, float, float, float] | None' = None, on_bad_polygon: 'str' = 'raise') -> 'dict[str, Any]';从台账取用则 opsdrive.get("plateau_lod2_mesh"))

• GPU:无(仅 CPU 参考实现)

用法

从 PLATEAU 的 CityGML 读取 LOD2 建筑,返回局部米制坐标的三角网格 (V, F) 以及每栋建筑的属性。

用 iterparse 流式读取 bldg:Building,把建筑主体和每个 bldg:BuildingPart 各作为一个部位(unit)。面取自主题面(GroundSurface / WallSurface / RoofSurface / OuterCeilingSurface / OuterFloorSurface / ClosureSurface)的 lod2MultiSurface,面的种类保存在 face_kind。确认 lod2Solid 通过 xlink:href 引用的面全部存在。孔(gml:interior)以桥接到外环后用耳切法三角化,三角形保持原环的方向(外法线)。

坐标从 EPSG:6697(JGD2011 的纬度、经度、高程)经 GRS80 地心直角坐标严格转换到原点切平面的 ENU(x 东、y 北、z 上,米)。默认原点是地面的重心:GroundSurface 顶点经纬度的平均及其最低高程(没有地面时用全部顶点)。

fail-closed:6697 以外的 srsName、srsDimension 不是 3、LOD2 几何中未知的 gml 元素(Triangle、OrientableSurface、pos 点列等)、表中没有的主题面、找不到的 xlink、单位不是 m 的 measuredHeight,都不跳过,而是报 ValueError。

Args:

source: CityGML 字符串(以 < 开头)、bytes 或文件路径(str/Path)。

origin: 局部坐标原点 (lat0 [deg], lon0 [deg], h0 [m])。None 时为地面的重心。

ids: 要读取的建筑的 gml:id(bldg:Building 的 id)。None 时全部。

bbox_latlon: (lat_min, lon_min, lat_max, lon_max)。只保留顶点平均落在此框内的部位。

on_bad_polygon: 无法三角化的 Polygon(面积 0、自相交)的处理。"raise"(默认)或

"skip"(计数并记入 n_bad_polygons)。

Returns:

{"V": (n,3) float64 [m], "F": (m,3) int64, "face_unit": (m,) int64, "face_kind": (m,) int8, "kinds": LOD2_KINDS, "units": [...], "origin": (lat0, lon0, h0), "crs": str, "n_buildings": int, "n_no_lod2": int, "n_bad_polygons": int, "max_nonplanarity_m": float}。

units[i] 为 {"building_id", "part", "gml_id", "measured_height", "attrs", "z_min", "z_max", "ground_z", "height_mesh", "extent_xy", "lat", "lon", "n_faces"}。height_mesh 是

z_max − ground_z(与 measuredHeight 比较的值),extent_xy 是 ENU 的 (x 宽, y 宽) [m]。

Raises:

ValueError: 上述 fail-closed 条件、source 为空或不正确、XML 损坏、没有符合的部位、

on_bad_polygon 未知、origin / bbox_latlon 不正确。

Examples:

>>> import driveplateau as PL

>>> m = PL.plateau_lod2_mesh(PL._citygml_lod2_example())

>>> [round(u["height_mesh"], 3) for u in m["units"]]

[12.0, 4.0]

>>> m["V"].shape[1], m["F"].shape[1], sorted(set(m["face_kind"].tolist()))

(3, 3, [0, 1, 2])

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

• 算法的正典(作者、年份)与用途见上面的族使用指南。

可运行的示例(实际调用该算子并已验证的样例)

• poc_plateau_venue_lod2 — py -3.11 examples/poc_plateau_venue_lod2.py

类型可衔接的下一个算子(可接受 table 作为输入)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

同类别(japan)

osm_synthetic · osm_parse · osm_road_graph · osm_road_mask · osm_road_loops · osm_route · japan_world · japan_stats


*Provenance: driveplateau.py — DRIVE 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.