Files
Pier_v1/pierzainer_ground/pierzainer_ground/grid.py
T

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],
}