Files
Aislo/resources/tester/helper_586_tm_frame.cjs
T
eomsangdonandClaude Opus 5.5 08864a1108 fix(D03): 노선분석 TM 겹을 경위도 바탕에 맞춤 — 그은 선 · 재기 · 급경사 · 음영 그림 자리 (PLAN 586-0 · 요구 445 B0)
- 까닭: 위성 · 도엽 겹(경위도)과 TM 겹을 같은 직사각형으로 폄 → 자오선 수렴각만큼 어긋남
  (검증_sub2_D 화면 실측: 위성 귀퉁이 58.9 px · 63.6 m · 급경사 그림 귀퉁이 17.7~21.1 px · 19~23 m)
- 고침: TM ↔ 경위도 TS(GRS80 TM 5185~5188 · 5179 · pyproj 짝) + 화면 가운데 1차 맞춤 틀
  → 그은 선 · 재기 · 누름 = 경위도 바탕 자리 · 그림 겹 = 세 귀퉁이로 놓음(돌아 있는 TM 격자)
- 고친 뒤: 급경사 귀퉁이 0.07 px · 위성 가운데 0.02 px · 위성 귀퉁이(화면 밖) 0.6 px
- 모르는 좌표계 · 가짜 도엽 = 옛 꼴 그대로 · 검증 창구 screenOfLonLat 덧
- 시험: test_586_tm_frame(TM 거울 1 mm · 틀 0.5 px · 되돌림 1 mm · 옛 꼴 어긋남)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 18:44:10 +09:00

42 lines
1.8 KiB
JavaScript

/* 586 TM ↔ 경위도 · 화면 TM 틀 헬퍼 — `D03_PlanAnalysis_Tm.ts` 를 stdin 점 목록으로 돌려 JSON 으로 냄.
* 입력 { points: [[epsg, x, y]], lonlat: [[epsg, lon, lat]], frames: [{ epsg, box, view, probes }] }
*/
const path = require("path");
const { makeLoader } = require("./helper_ts_stub_loader.cjs");
const ROOT = path.join(__dirname, "..", "..");
const { load } = makeLoader({ root: ROOT });
const tm = load("D03_PlanAnalysis", "logic", "D03_PlanAnalysis_Tm.ts");
const input = JSON.parse(require("fs").readFileSync(0, "utf-8"));
const out = {
unknown: tm.tmParams(5174),
toLonLat: input.points.map(([epsg, x, y]) => tm.tmToLonLat(tm.tmParams(epsg), x, y)),
toTm: input.lonlat.map(([epsg, lon, lat]) => tm.lonLatToTm(tm.tmParams(epsg), lon, lat)),
frames: input.frames.map(({ epsg, box, view, probes }) => {
// 경위도 상자를 화면 직사각형에 펴는 바탕(캔버스 지금 꼴) · 가운데 = (cx, cy)
const [lonMin, latMin, lonMax, latMax] = box;
const [w, h, x0, y0, sx, sy] = view;
const project = (lon, lat) => [
x0 + ((lon - lonMin) / (lonMax - lonMin)) * sx,
y0 + ((latMax - lat) / (latMax - latMin)) * sy,
];
const unproject = (px, py) => [
lonMin + ((px - x0) / sx) * (lonMax - lonMin),
latMax - ((py - y0) / sy) * (latMax - latMin),
];
const p = tm.tmParams(epsg);
const frame = tm.localTmFrame(p, project, unproject, w / 2, h / 2);
return {
pxPerMeter: frame.pxPerMeter,
probes: probes.map(([x, y]) => {
const exact = project(...tm.tmToLonLat(p, x, y));
const got = frame.toScreen(x, y);
const back = frame.toMetric(...got);
return { exact, got, back };
}),
};
}),
};
process.stdout.write(JSON.stringify(out));