30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
"""앱용 지형 격자: 교각 주변을 일정 간격으로 샘플한 지반고 (ground_model.json의 terrain_grid, schema 2)."""
|
|
from __future__ import annotations
|
|
|
|
import math
|
|
|
|
import numpy as np
|
|
|
|
from .dtm import DTM
|
|
|
|
|
|
def terrain_grid(dtm: DTM, pier_xy: list[tuple[float, float]], step: float = 5.0, margin: float = 50.0) -> dict:
|
|
"""교각 중심을 모두 감싸는 사각형을 margin 만큼 넓혀 step 간격으로 샘플한다.
|
|
|
|
좌표는 측량 X(북) · Y(동), m. z 는 행 우선 (Y 방향으로 행, X 방향으로 열) 한 줄이며 자료가 없는 점은 null.
|
|
"""
|
|
xs = [p[0] for p in pier_xy]
|
|
ys = [p[1] for p in pier_xy]
|
|
x0, y0 = min(xs) - margin, min(ys) - margin
|
|
nx = math.ceil((max(xs) + margin - x0) / step) + 1
|
|
ny = math.ceil((max(ys) + margin - y0) / step) + 1
|
|
gx, gy = np.meshgrid(x0 + step * np.arange(nx), y0 + step * np.arange(ny))
|
|
z = dtm.z_many(np.column_stack([gx.ravel(), gy.ravel()]))
|
|
return {
|
|
"origin": [round(x0, 3), round(y0, 3)],
|
|
"step": step,
|
|
"nx": int(nx),
|
|
"ny": int(ny),
|
|
"z": [None if math.isnan(v) else round(float(v), 3) for v in z],
|
|
}
|