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, 3 이 아닌 srsDimension, 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 이 깨짐, 해당 부위가 0 건,

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])

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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