@things-factory/integration-data-go-kr 10.0.0-beta.62 → 10.0.0-beta.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -16
- package/ROADMAP.md +25 -14
- package/dist-server/engine/connector/data-go-kr-client.d.ts +1 -1
- package/dist-server/engine/connector/data-go-kr-client.js +25 -2
- package/dist-server/engine/connector/data-go-kr-client.js.map +1 -1
- package/dist-server/engine/connector/data-go-kr-connector.d.ts +5 -11
- package/dist-server/engine/connector/data-go-kr-connector.js +3 -9
- package/dist-server/engine/connector/data-go-kr-connector.js.map +1 -1
- package/dist-server/engine/spec/building-ledger/hub.d.ts +12 -0
- package/dist-server/engine/spec/{building-ledger.js → building-ledger/hub.js} +13 -10
- package/dist-server/engine/spec/building-ledger/hub.js.map +1 -0
- package/dist-server/engine/spec/building-ledger/index.d.ts +7 -0
- package/dist-server/engine/spec/building-ledger/index.js +12 -0
- package/dist-server/engine/spec/building-ledger/index.js.map +1 -0
- package/dist-server/engine/spec/index.d.ts +2 -1
- package/dist-server/engine/spec/index.js +22 -5
- package/dist-server/engine/spec/index.js.map +1 -1
- package/dist-server/engine/spec/types.d.ts +3 -3
- package/dist-server/engine/spec/types.js +1 -1
- package/dist-server/engine/spec/types.js.map +1 -1
- package/dist-server/engine/spec/weather/asos.d.ts +2 -0
- package/dist-server/engine/spec/weather/asos.js +33 -0
- package/dist-server/engine/spec/weather/asos.js.map +1 -0
- package/dist-server/engine/spec/weather/aws.d.ts +2 -0
- package/dist-server/engine/spec/weather/aws.js +28 -0
- package/dist-server/engine/spec/weather/aws.js.map +1 -0
- package/dist-server/engine/spec/weather/index.d.ts +14 -0
- package/dist-server/engine/spec/weather/index.js +23 -0
- package/dist-server/engine/spec/weather/index.js.map +1 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.d.ts +2 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.js +56 -0
- package/dist-server/engine/spec/weather/mid-term-forecast.js.map +1 -0
- package/dist-server/engine/spec/weather/short-term-forecast.d.ts +2 -0
- package/dist-server/engine/spec/weather/short-term-forecast.js +71 -0
- package/dist-server/engine/spec/weather/short-term-forecast.js.map +1 -0
- package/dist-server/engine/spec/weather/warning.d.ts +2 -0
- package/dist-server/engine/spec/weather/warning.js +34 -0
- package/dist-server/engine/spec/weather/warning.js.map +1 -0
- package/dist-server/engine/task/building-ledger/general.js +1 -1
- package/dist-server/engine/task/building-ledger/general.js.map +1 -1
- package/dist-server/engine/task/call.d.ts +10 -3
- package/dist-server/engine/task/call.js +20 -4
- package/dist-server/engine/task/call.js.map +1 -1
- package/dist-server/engine/task/index.d.ts +1 -0
- package/dist-server/engine/task/index.js +1 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/engine/task/weather/grid-converter.d.ts +24 -0
- package/dist-server/engine/task/weather/grid-converter.js +69 -0
- package/dist-server/engine/task/weather/grid-converter.js.map +1 -0
- package/dist-server/engine/task/weather/index.d.ts +13 -0
- package/dist-server/engine/task/weather/index.js +18 -0
- package/dist-server/engine/task/weather/index.js.map +1 -0
- package/dist-server/engine/task/weather/short-term-forecast.d.ts +38 -0
- package/dist-server/engine/task/weather/short-term-forecast.js +99 -0
- package/dist-server/engine/task/weather/short-term-forecast.js.map +1 -0
- package/dist-server/index.d.ts +2 -0
- package/dist-server/index.js +4 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/connector/data-go-kr-connector.md +6 -7
- package/helps/integration/services/building-ledger.md +6 -5
- package/helps/integration/services/weather.md +82 -0
- package/helps/integration/task/building-ledger.md +25 -1
- package/helps/integration/task/data-go-kr-call.md +31 -4
- package/helps/integration/task/weather-short-term-forecast.md +96 -0
- package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +15 -0
- package/logs/connections-2026-04-25-09.log +0 -0
- package/package.json +2 -2
- package/server/engine/connector/data-go-kr-client.ts +26 -2
- package/server/engine/connector/data-go-kr-connector.ts +8 -11
- package/server/engine/spec/{building-ledger.ts → building-ledger/hub.ts} +12 -9
- package/server/engine/spec/building-ledger/index.ts +7 -0
- package/server/engine/spec/index.ts +24 -3
- package/server/engine/spec/types.ts +3 -3
- package/server/engine/spec/weather/asos.ts +32 -0
- package/server/engine/spec/weather/aws.ts +27 -0
- package/server/engine/spec/weather/index.ts +14 -0
- package/server/engine/spec/weather/mid-term-forecast.ts +56 -0
- package/server/engine/spec/weather/short-term-forecast.ts +73 -0
- package/server/engine/spec/weather/warning.ts +33 -0
- package/server/engine/task/building-ledger/general.ts +2 -2
- package/server/engine/task/call.ts +24 -4
- package/server/engine/task/index.ts +1 -0
- package/server/engine/task/weather/grid-converter.ts +79 -0
- package/server/engine/task/weather/index.ts +14 -0
- package/server/engine/task/weather/short-term-forecast.ts +110 -0
- package/server/index.ts +2 -0
- package/translations/en.json +9 -2
- package/translations/ja.json +9 -2
- package/translations/ko.json +9 -2
- package/translations/ms.json +9 -2
- package/translations/zh.json +9 -2
- package/dist-server/engine/spec/building-ledger.d.ts +0 -9
- package/dist-server/engine/spec/building-ledger.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaAsosHourlyService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청_종관기상관측 시간자료 (ASOS) (data.go.kr 데이터셋 15057210).
|
|
6
|
+
*
|
|
7
|
+
* 지상 종관기상관측 (Automated Surface Observing System) 의 시간단위 관측 자료.
|
|
8
|
+
* 전국 약 100개 지점에서 표준화된 정밀 관측. 기온·강수량·풍향풍속·습도·기압 등.
|
|
9
|
+
*/
|
|
10
|
+
const params = [
|
|
11
|
+
{ name: 'dataCd', required: true, description: "자료 코드. 'ASOS' 고정.", example: 'ASOS' },
|
|
12
|
+
{ name: 'dateCd', required: true, description: "자료 단위. 시간자료='HR'.", example: 'HR' },
|
|
13
|
+
{ name: 'startDt', required: true, length: 8, description: '검색 시작일 YYYYMMDD', example: '20260420' },
|
|
14
|
+
{ name: 'startHh', required: true, length: 2, description: '검색 시작시 HH', example: '00' },
|
|
15
|
+
{ name: 'endDt', required: true, length: 8, description: '검색 종료일 YYYYMMDD', example: '20260425' },
|
|
16
|
+
{ name: 'endHh', required: true, length: 2, description: '검색 종료시 HH', example: '23' },
|
|
17
|
+
{ name: 'stnIds', required: true, description: 'KMA ASOS 지점 코드. 서울=108, 부산=159 등.', example: '108' }
|
|
18
|
+
];
|
|
19
|
+
exports.KmaAsosHourlyService = {
|
|
20
|
+
serviceId: '1360000/AsosHourlyInfoService',
|
|
21
|
+
label: '기상청_종관기상관측 시간자료 (ASOS)',
|
|
22
|
+
description: '지상 종관기상관측(ASOS) 의 시간단위 관측 자료.',
|
|
23
|
+
homepage: 'https://www.data.go.kr/data/15057210/openapi.do',
|
|
24
|
+
operations: {
|
|
25
|
+
getWthrDataList: {
|
|
26
|
+
operationId: 'getWthrDataList',
|
|
27
|
+
label: '시간자료 조회',
|
|
28
|
+
description: '특정 지점·기간의 시간단위 관측 데이터.',
|
|
29
|
+
params
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=asos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asos.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/asos.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,MAAM,GAAyB;IACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;IACnF,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;IACnG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;IACjG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,OAAO,EAAE,KAAK,EAAE;CACrG,CAAA;AAEY,QAAA,oBAAoB,GAAgB;IAC/C,SAAS,EAAE,+BAA+B;IAC1C,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EAAE,+BAA+B;IAC5C,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,eAAe,EAAE;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,wBAAwB;YACrC,MAAM;SACP;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_종관기상관측 시간자료 (ASOS) (data.go.kr 데이터셋 15057210).\n *\n * 지상 종관기상관측 (Automated Surface Observing System) 의 시간단위 관측 자료.\n * 전국 약 100개 지점에서 표준화된 정밀 관측. 기온·강수량·풍향풍속·습도·기압 등.\n */\nconst params: OperationParamSpec[] = [\n { name: 'dataCd', required: true, description: \"자료 코드. 'ASOS' 고정.\", example: 'ASOS' },\n { name: 'dateCd', required: true, description: \"자료 단위. 시간자료='HR'.\", example: 'HR' },\n { name: 'startDt', required: true, length: 8, description: '검색 시작일 YYYYMMDD', example: '20260420' },\n { name: 'startHh', required: true, length: 2, description: '검색 시작시 HH', example: '00' },\n { name: 'endDt', required: true, length: 8, description: '검색 종료일 YYYYMMDD', example: '20260425' },\n { name: 'endHh', required: true, length: 2, description: '검색 종료시 HH', example: '23' },\n { name: 'stnIds', required: true, description: 'KMA ASOS 지점 코드. 서울=108, 부산=159 등.', example: '108' }\n]\n\nexport const KmaAsosHourlyService: ServiceSpec = {\n serviceId: '1360000/AsosHourlyInfoService',\n label: '기상청_종관기상관측 시간자료 (ASOS)',\n description: '지상 종관기상관측(ASOS) 의 시간단위 관측 자료.',\n homepage: 'https://www.data.go.kr/data/15057210/openapi.do',\n operations: {\n getWthrDataList: {\n operationId: 'getWthrDataList',\n label: '시간자료 조회',\n description: '특정 지점·기간의 시간단위 관측 데이터.',\n params\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaAwsHourlyService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청_방재기상관측 시간자료 (AWS) (data.go.kr 데이터셋 15059093).
|
|
6
|
+
*
|
|
7
|
+
* 자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 보다 조밀한 격자 (전국 500+ 지점).
|
|
8
|
+
* 강수·기온·풍향풍속·습도 등을 시간 단위로 제공.
|
|
9
|
+
*/
|
|
10
|
+
const params = [
|
|
11
|
+
{ name: 'tm', required: true, length: 12, description: '관측 시각 YYYYMMDDHHMM', example: '202604251200' },
|
|
12
|
+
{ name: 'stn', description: '지점 번호 (생략 시 전국).', example: '108' }
|
|
13
|
+
];
|
|
14
|
+
exports.KmaAwsHourlyService = {
|
|
15
|
+
serviceId: '1360000/AwsHrInfoService',
|
|
16
|
+
label: '기상청_방재기상관측 시간자료 (AWS)',
|
|
17
|
+
description: '자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 대비 조밀한 격자.',
|
|
18
|
+
homepage: 'https://www.data.go.kr/data/15059093/openapi.do',
|
|
19
|
+
operations: {
|
|
20
|
+
getAwsRltmList: {
|
|
21
|
+
operationId: 'getAwsRltmList',
|
|
22
|
+
label: 'AWS 시간자료 조회',
|
|
23
|
+
description: 'AWS 지점의 시간단위 관측 자료. 강수·기온·풍향풍속·습도 등.',
|
|
24
|
+
params
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=aws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/aws.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,MAAM,GAAyB;IACnC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE;IACtG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;CACjE,CAAA;AAEY,QAAA,mBAAmB,GAAgB;IAC9C,SAAS,EAAE,0BAA0B;IACrC,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,cAAc,EAAE;YACd,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,sCAAsC;YACnD,MAAM;SACP;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_방재기상관측 시간자료 (AWS) (data.go.kr 데이터셋 15059093).\n *\n * 자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 보다 조밀한 격자 (전국 500+ 지점).\n * 강수·기온·풍향풍속·습도 등을 시간 단위로 제공.\n */\nconst params: OperationParamSpec[] = [\n { name: 'tm', required: true, length: 12, description: '관측 시각 YYYYMMDDHHMM', example: '202604251200' },\n { name: 'stn', description: '지점 번호 (생략 시 전국).', example: '108' }\n]\n\nexport const KmaAwsHourlyService: ServiceSpec = {\n serviceId: '1360000/AwsHrInfoService',\n label: '기상청_방재기상관측 시간자료 (AWS)',\n description: '자동기상관측장비(AWS) 의 시간단위 관측 자료. ASOS 대비 조밀한 격자.',\n homepage: 'https://www.data.go.kr/data/15059093/openapi.do',\n operations: {\n getAwsRltmList: {\n operationId: 'getAwsRltmList',\n label: 'AWS 시간자료 조회',\n description: 'AWS 지점의 시간단위 관측 자료. 강수·기온·풍향풍속·습도 등.',\n params\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 기상청(KMA) 도메인 서비스 스펙 묶음.
|
|
3
|
+
*
|
|
4
|
+
* 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:
|
|
5
|
+
* 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export
|
|
6
|
+
* 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가
|
|
7
|
+
*
|
|
8
|
+
* 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.
|
|
9
|
+
*/
|
|
10
|
+
export { KmaShortTermForecastService } from './short-term-forecast';
|
|
11
|
+
export { KmaMidTermForecastService } from './mid-term-forecast';
|
|
12
|
+
export { KmaWeatherWarningService } from './warning';
|
|
13
|
+
export { KmaAsosHourlyService } from './asos';
|
|
14
|
+
export { KmaAwsHourlyService } from './aws';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaAwsHourlyService = exports.KmaAsosHourlyService = exports.KmaWeatherWarningService = exports.KmaMidTermForecastService = exports.KmaShortTermForecastService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청(KMA) 도메인 서비스 스펙 묶음.
|
|
6
|
+
*
|
|
7
|
+
* 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:
|
|
8
|
+
* 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export
|
|
9
|
+
* 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가
|
|
10
|
+
*
|
|
11
|
+
* 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.
|
|
12
|
+
*/
|
|
13
|
+
var short_term_forecast_1 = require("./short-term-forecast");
|
|
14
|
+
Object.defineProperty(exports, "KmaShortTermForecastService", { enumerable: true, get: function () { return short_term_forecast_1.KmaShortTermForecastService; } });
|
|
15
|
+
var mid_term_forecast_1 = require("./mid-term-forecast");
|
|
16
|
+
Object.defineProperty(exports, "KmaMidTermForecastService", { enumerable: true, get: function () { return mid_term_forecast_1.KmaMidTermForecastService; } });
|
|
17
|
+
var warning_1 = require("./warning");
|
|
18
|
+
Object.defineProperty(exports, "KmaWeatherWarningService", { enumerable: true, get: function () { return warning_1.KmaWeatherWarningService; } });
|
|
19
|
+
var asos_1 = require("./asos");
|
|
20
|
+
Object.defineProperty(exports, "KmaAsosHourlyService", { enumerable: true, get: function () { return asos_1.KmaAsosHourlyService; } });
|
|
21
|
+
var aws_1 = require("./aws");
|
|
22
|
+
Object.defineProperty(exports, "KmaAwsHourlyService", { enumerable: true, get: function () { return aws_1.KmaAwsHourlyService; } });
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,6DAAmE;AAA1D,kIAAA,2BAA2B,OAAA;AACpC,yDAA+D;AAAtD,8HAAA,yBAAyB,OAAA;AAClC,qCAAoD;AAA3C,mHAAA,wBAAwB,OAAA;AACjC,+BAA6C;AAApC,4GAAA,oBAAoB,OAAA;AAC7B,6BAA2C;AAAlC,0GAAA,mBAAmB,OAAA","sourcesContent":["/**\n * 기상청(KMA) 도메인 서비스 스펙 묶음.\n *\n * 새 KMA 서비스(예: 황사·자외선·미세먼지·해양 등) 추가 시:\n * 1. 본 폴더에 `<service-slug>.ts` 파일을 만들어 ServiceSpec export\n * 2. 본 index 의 export 와 (필요 시) 외부 SpecRegistry 등록만 추가\n *\n * 한 파일에 여러 서비스를 합치지 말 것 — 확장성 보호.\n */\nexport { KmaShortTermForecastService } from './short-term-forecast'\nexport { KmaMidTermForecastService } from './mid-term-forecast'\nexport { KmaWeatherWarningService } from './warning'\nexport { KmaAsosHourlyService } from './asos'\nexport { KmaAwsHourlyService } from './aws'\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaMidTermForecastService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청_중기예보 조회서비스 (data.go.kr 데이터셋 15059468).
|
|
6
|
+
*
|
|
7
|
+
* 3~10일 전망. 광역 권역(regId) 단위로 06·18시 발표.
|
|
8
|
+
*/
|
|
9
|
+
const sharedParams = [
|
|
10
|
+
{
|
|
11
|
+
name: 'regId',
|
|
12
|
+
required: true,
|
|
13
|
+
description: '광역 권역 코드. 육상은 `11B00000`(서울/인천/경기) 등, 기온은 `11B10101`(서울) 등 더 세분화. KMA 권역 코드 표 참조.',
|
|
14
|
+
example: '11B00000'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'tmFc',
|
|
18
|
+
required: true,
|
|
19
|
+
length: 12,
|
|
20
|
+
description: '발표시각 YYYYMMDDHHMM. 중기예보는 06·18시 발표.',
|
|
21
|
+
example: '202604250600'
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
exports.KmaMidTermForecastService = {
|
|
25
|
+
serviceId: '1360000/MidFcstInfoService',
|
|
26
|
+
label: '기상청_중기예보 조회서비스',
|
|
27
|
+
description: '3~10일 중기예보. 육상·기온·해상 별 오퍼레이션.',
|
|
28
|
+
homepage: 'https://www.data.go.kr/data/15059468/openapi.do',
|
|
29
|
+
operations: {
|
|
30
|
+
getMidFcst: {
|
|
31
|
+
operationId: 'getMidFcst',
|
|
32
|
+
label: '중기예보 종합',
|
|
33
|
+
description: '중기 전망 텍스트 (해석본).',
|
|
34
|
+
params: sharedParams
|
|
35
|
+
},
|
|
36
|
+
getMidLandFcst: {
|
|
37
|
+
operationId: 'getMidLandFcst',
|
|
38
|
+
label: '육상 중기예보',
|
|
39
|
+
description: '육상 권역의 강수확률·하늘상태 (3~10일).',
|
|
40
|
+
params: sharedParams
|
|
41
|
+
},
|
|
42
|
+
getMidTa: {
|
|
43
|
+
operationId: 'getMidTa',
|
|
44
|
+
label: '중기 기온예보',
|
|
45
|
+
description: '아침 최저·낮 최고 기온 (3~10일).',
|
|
46
|
+
params: sharedParams
|
|
47
|
+
},
|
|
48
|
+
getMidSeaFcst: {
|
|
49
|
+
operationId: 'getMidSeaFcst',
|
|
50
|
+
label: '해상 중기예보',
|
|
51
|
+
description: '해상 권역의 풍향·풍속·파고.',
|
|
52
|
+
params: sharedParams
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=mid-term-forecast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mid-term-forecast.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/mid-term-forecast.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAM,YAAY,GAAyB;IACzC;QACE,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,mFAAmF;QACrF,OAAO,EAAE,UAAU;KACpB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,cAAc;KACxB;CACF,CAAA;AAEY,QAAA,yBAAyB,GAAgB;IACpD,SAAS,EAAE,4BAA4B;IACvC,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,+BAA+B;IAC5C,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,UAAU,EAAE;YACV,WAAW,EAAE,YAAY;YACzB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,kBAAkB;YAC/B,MAAM,EAAE,YAAY;SACrB;QACD,cAAc,EAAE;YACd,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,2BAA2B;YACxC,MAAM,EAAE,YAAY;SACrB;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,wBAAwB;YACrC,MAAM,EAAE,YAAY;SACrB;QACD,aAAa,EAAE;YACb,WAAW,EAAE,eAAe;YAC5B,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,kBAAkB;YAC/B,MAAM,EAAE,YAAY;SACrB;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_중기예보 조회서비스 (data.go.kr 데이터셋 15059468).\n *\n * 3~10일 전망. 광역 권역(regId) 단위로 06·18시 발표.\n */\nconst sharedParams: OperationParamSpec[] = [\n {\n name: 'regId',\n required: true,\n description:\n '광역 권역 코드. 육상은 `11B00000`(서울/인천/경기) 등, 기온은 `11B10101`(서울) 등 더 세분화. KMA 권역 코드 표 참조.',\n example: '11B00000'\n },\n {\n name: 'tmFc',\n required: true,\n length: 12,\n description: '발표시각 YYYYMMDDHHMM. 중기예보는 06·18시 발표.',\n example: '202604250600'\n }\n]\n\nexport const KmaMidTermForecastService: ServiceSpec = {\n serviceId: '1360000/MidFcstInfoService',\n label: '기상청_중기예보 조회서비스',\n description: '3~10일 중기예보. 육상·기온·해상 별 오퍼레이션.',\n homepage: 'https://www.data.go.kr/data/15059468/openapi.do',\n operations: {\n getMidFcst: {\n operationId: 'getMidFcst',\n label: '중기예보 종합',\n description: '중기 전망 텍스트 (해석본).',\n params: sharedParams\n },\n getMidLandFcst: {\n operationId: 'getMidLandFcst',\n label: '육상 중기예보',\n description: '육상 권역의 강수확률·하늘상태 (3~10일).',\n params: sharedParams\n },\n getMidTa: {\n operationId: 'getMidTa',\n label: '중기 기온예보',\n description: '아침 최저·낮 최고 기온 (3~10일).',\n params: sharedParams\n },\n getMidSeaFcst: {\n operationId: 'getMidSeaFcst',\n label: '해상 중기예보',\n description: '해상 권역의 풍향·풍속·파고.',\n params: sharedParams\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaShortTermForecastService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청_단기예보 조회서비스 v2 (data.go.kr 데이터셋 15084084).
|
|
6
|
+
*
|
|
7
|
+
* 동네예보 + 초단기예보 + 초단기실황. 모두 KMA 5km 격자좌표(nx, ny) 기준.
|
|
8
|
+
*/
|
|
9
|
+
const sharedParams = [
|
|
10
|
+
{
|
|
11
|
+
name: 'base_date',
|
|
12
|
+
label: 'label.base-date',
|
|
13
|
+
required: true,
|
|
14
|
+
length: 8,
|
|
15
|
+
description: '발표일자 YYYYMMDD',
|
|
16
|
+
example: '20260425'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'base_time',
|
|
20
|
+
label: 'label.base-time',
|
|
21
|
+
required: true,
|
|
22
|
+
length: 4,
|
|
23
|
+
description: '발표시각 HHMM. 단기예보는 0200·0500·0800·1100·1400·1700·2000·2300, 초단기 시리즈는 매시각 정시.',
|
|
24
|
+
example: '1100'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'nx',
|
|
28
|
+
label: 'label.nx',
|
|
29
|
+
required: true,
|
|
30
|
+
description: 'KMA 5km 격자 X좌표 (위경도 → 격자 변환은 task/weather/grid-converter 헬퍼).',
|
|
31
|
+
example: '60'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'ny',
|
|
35
|
+
label: 'label.ny',
|
|
36
|
+
required: true,
|
|
37
|
+
description: 'KMA 5km 격자 Y좌표.',
|
|
38
|
+
example: '127'
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
exports.KmaShortTermForecastService = {
|
|
42
|
+
serviceId: '1360000/VilageFcstInfoService_2.0',
|
|
43
|
+
label: '기상청_단기예보 조회서비스',
|
|
44
|
+
description: '동네예보(3일치)·초단기예보(6시간)·초단기실황 3개 오퍼레이션. KMA 5km 격자좌표 기준.',
|
|
45
|
+
homepage: 'https://www.data.go.kr/data/15084084/openapi.do',
|
|
46
|
+
operations: {
|
|
47
|
+
getVilageFcst: {
|
|
48
|
+
operationId: 'getVilageFcst',
|
|
49
|
+
label: '단기예보 조회',
|
|
50
|
+
description: '동네예보. 02·05·08·11·14·17·20·23시 (각 +10분 후 제공) 발표, 3일치 3시간 간격 카테고리 (POP·PCP·SKY·REH·T1H·UUU·VVV·VEC·WSD·TMN·TMX 등).',
|
|
51
|
+
params: sharedParams,
|
|
52
|
+
responseNotes: 'items.item 이 (카테고리×시점) 조합으로 매우 많이 반환됨 (3일치 약 800+건). numOfRows 를 충분히 크게 (1000+) 잡거나 페이징.',
|
|
53
|
+
externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'
|
|
54
|
+
},
|
|
55
|
+
getUltraSrtFcst: {
|
|
56
|
+
operationId: 'getUltraSrtFcst',
|
|
57
|
+
label: '초단기예보 조회',
|
|
58
|
+
description: '발표시각 +45분 후 제공. 매시각 발표. 향후 6시간 예보 (1시간 단위).',
|
|
59
|
+
params: sharedParams,
|
|
60
|
+
externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'
|
|
61
|
+
},
|
|
62
|
+
getUltraSrtNcst: {
|
|
63
|
+
operationId: 'getUltraSrtNcst',
|
|
64
|
+
label: '초단기실황 조회',
|
|
65
|
+
description: '발표시각 +10분 후 제공. 매시각 발표. 현재 관측값 (T1H·RN1·UUU·VVV·REH·PTY·VEC·WSD).',
|
|
66
|
+
params: sharedParams,
|
|
67
|
+
externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=short-term-forecast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"short-term-forecast.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/short-term-forecast.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAM,YAAY,GAAyB;IACzC;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,UAAU;KACpB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC;QACT,WAAW,EACT,4EAA4E;QAC9E,OAAO,EAAE,MAAM;KAChB;IACD;QACE,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,+DAA+D;QAC5E,OAAO,EAAE,IAAI;KACd;IACD;QACE,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,KAAK;KACf;CACF,CAAA;AAEY,QAAA,2BAA2B,GAAgB;IACtD,SAAS,EAAE,mCAAmC;IAC9C,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,uDAAuD;IACpE,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,aAAa,EAAE;YACb,WAAW,EAAE,eAAe;YAC5B,KAAK,EAAE,SAAS;YAChB,WAAW,EACT,mHAAmH;YACrH,MAAM,EAAE,YAAY;YACpB,aAAa,EACX,0FAA0F;YAC5F,eAAe,EAAE,iDAAiD;SACnE;QACD,eAAe,EAAE;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,6CAA6C;YAC1D,MAAM,EAAE,YAAY;YACpB,eAAe,EAAE,iDAAiD;SACnE;QACD,eAAe,EAAE;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,mEAAmE;YAChF,MAAM,EAAE,YAAY;YACpB,eAAe,EAAE,iDAAiD;SACnE;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_단기예보 조회서비스 v2 (data.go.kr 데이터셋 15084084).\n *\n * 동네예보 + 초단기예보 + 초단기실황. 모두 KMA 5km 격자좌표(nx, ny) 기준.\n */\nconst sharedParams: OperationParamSpec[] = [\n {\n name: 'base_date',\n label: 'label.base-date',\n required: true,\n length: 8,\n description: '발표일자 YYYYMMDD',\n example: '20260425'\n },\n {\n name: 'base_time',\n label: 'label.base-time',\n required: true,\n length: 4,\n description:\n '발표시각 HHMM. 단기예보는 0200·0500·0800·1100·1400·1700·2000·2300, 초단기 시리즈는 매시각 정시.',\n example: '1100'\n },\n {\n name: 'nx',\n label: 'label.nx',\n required: true,\n description: 'KMA 5km 격자 X좌표 (위경도 → 격자 변환은 task/weather/grid-converter 헬퍼).',\n example: '60'\n },\n {\n name: 'ny',\n label: 'label.ny',\n required: true,\n description: 'KMA 5km 격자 Y좌표.',\n example: '127'\n }\n]\n\nexport const KmaShortTermForecastService: ServiceSpec = {\n serviceId: '1360000/VilageFcstInfoService_2.0',\n label: '기상청_단기예보 조회서비스',\n description: '동네예보(3일치)·초단기예보(6시간)·초단기실황 3개 오퍼레이션. KMA 5km 격자좌표 기준.',\n homepage: 'https://www.data.go.kr/data/15084084/openapi.do',\n operations: {\n getVilageFcst: {\n operationId: 'getVilageFcst',\n label: '단기예보 조회',\n description:\n '동네예보. 02·05·08·11·14·17·20·23시 (각 +10분 후 제공) 발표, 3일치 3시간 간격 카테고리 (POP·PCP·SKY·REH·T1H·UUU·VVV·VEC·WSD·TMN·TMX 등).',\n params: sharedParams,\n responseNotes:\n 'items.item 이 (카테고리×시점) 조합으로 매우 많이 반환됨 (3일치 약 800+건). numOfRows 를 충분히 크게 (1000+) 잡거나 페이징.',\n externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'\n },\n getUltraSrtFcst: {\n operationId: 'getUltraSrtFcst',\n label: '초단기예보 조회',\n description: '발표시각 +45분 후 제공. 매시각 발표. 향후 6시간 예보 (1시간 단위).',\n params: sharedParams,\n externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'\n },\n getUltraSrtNcst: {\n operationId: 'getUltraSrtNcst',\n label: '초단기실황 조회',\n description: '발표시각 +10분 후 제공. 매시각 발표. 현재 관측값 (T1H·RN1·UUU·VVV·REH·PTY·VEC·WSD).',\n params: sharedParams,\n externalDocsUrl: 'https://www.data.go.kr/data/15084084/openapi.do'\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KmaWeatherWarningService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 기상청_기상특보 조회서비스 (data.go.kr 데이터셋 15059092).
|
|
6
|
+
*
|
|
7
|
+
* 호우·태풍·강풍·풍랑·대설 등 특보의 발효 현황 및 상세 내용.
|
|
8
|
+
*/
|
|
9
|
+
const sharedParams = [
|
|
10
|
+
{ name: 'stnId', required: true, description: '발표 관할 지점 ID. 전국=108. KMA 지점 코드 표 참조.', example: '108' },
|
|
11
|
+
{ name: 'fromTmFc', required: true, length: 8, description: '검색시작일 YYYYMMDD', example: '20260425' },
|
|
12
|
+
{ name: 'toTmFc', required: true, length: 8, description: '검색종료일 YYYYMMDD', example: '20260425' }
|
|
13
|
+
];
|
|
14
|
+
exports.KmaWeatherWarningService = {
|
|
15
|
+
serviceId: '1360000/WthrWrnInfoService',
|
|
16
|
+
label: '기상청_기상특보 조회서비스',
|
|
17
|
+
description: '기상특보(호우·태풍·강풍·풍랑·대설 등) 발효 현황 및 상세 내용 조회.',
|
|
18
|
+
homepage: 'https://www.data.go.kr/data/15059092/openapi.do',
|
|
19
|
+
operations: {
|
|
20
|
+
getWthrWrnList: {
|
|
21
|
+
operationId: 'getWthrWrnList',
|
|
22
|
+
label: '특보 목록 조회',
|
|
23
|
+
description: '발표 시각 범위 내의 특보 목록.',
|
|
24
|
+
params: sharedParams
|
|
25
|
+
},
|
|
26
|
+
getWthrWrnInfo: {
|
|
27
|
+
operationId: 'getWthrWrnInfo',
|
|
28
|
+
label: '특보 상세 조회',
|
|
29
|
+
description: '발효 중인 특정 특보의 상세 발표문.',
|
|
30
|
+
params: sharedParams
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warning.js","sourceRoot":"","sources":["../../../../server/engine/spec/weather/warning.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAM,YAAY,GAAyB;IACzC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sCAAsC,EAAE,OAAO,EAAE,KAAK,EAAE;IACtG,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE;IACnG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE;CAClG,CAAA;AAEY,QAAA,wBAAwB,GAAgB;IACnD,SAAS,EAAE,4BAA4B;IACvC,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,0CAA0C;IACvD,QAAQ,EAAE,iDAAiD;IAC3D,UAAU,EAAE;QACV,cAAc,EAAE;YACd,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,oBAAoB;YACjC,MAAM,EAAE,YAAY;SACrB;QACD,cAAc,EAAE;YACd,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,sBAAsB;YACnC,MAAM,EAAE,YAAY;SACrB;KACF;CACF,CAAA","sourcesContent":["import { OperationParamSpec, ServiceSpec } from '../types'\n\n/**\n * 기상청_기상특보 조회서비스 (data.go.kr 데이터셋 15059092).\n *\n * 호우·태풍·강풍·풍랑·대설 등 특보의 발효 현황 및 상세 내용.\n */\nconst sharedParams: OperationParamSpec[] = [\n { name: 'stnId', required: true, description: '발표 관할 지점 ID. 전국=108. KMA 지점 코드 표 참조.', example: '108' },\n { name: 'fromTmFc', required: true, length: 8, description: '검색시작일 YYYYMMDD', example: '20260425' },\n { name: 'toTmFc', required: true, length: 8, description: '검색종료일 YYYYMMDD', example: '20260425' }\n]\n\nexport const KmaWeatherWarningService: ServiceSpec = {\n serviceId: '1360000/WthrWrnInfoService',\n label: '기상청_기상특보 조회서비스',\n description: '기상특보(호우·태풍·강풍·풍랑·대설 등) 발효 현황 및 상세 내용 조회.',\n homepage: 'https://www.data.go.kr/data/15059092/openapi.do',\n operations: {\n getWthrWrnList: {\n operationId: 'getWthrWrnList',\n label: '특보 목록 조회',\n description: '발표 시각 범위 내의 특보 목록.',\n params: sharedParams\n },\n getWthrWrnInfo: {\n operationId: 'getWthrWrnInfo',\n label: '특보 상세 조회',\n description: '발효 중인 특정 특보의 상세 발표문.',\n params: sharedParams\n }\n }\n}\n"]}
|
|
@@ -43,7 +43,7 @@ async function BuildingLedgerTask(step, context) {
|
|
|
43
43
|
throw new Error('data-go-kr-building-ledger: bjdongCd is required');
|
|
44
44
|
if (!bun)
|
|
45
45
|
throw new Error('data-go-kr-building-ledger: bun is required');
|
|
46
|
-
const servicePath = `${building_ledger_1.
|
|
46
|
+
const servicePath = `${building_ledger_1.BldRgstHubService.serviceId}/getBrTitleInfo`;
|
|
47
47
|
const normalizedParams = {
|
|
48
48
|
sigunguCd,
|
|
49
49
|
bjdongCd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../../server/engine/task/building-ledger/general.ts"],"names":[],"mappings":";;AAAA,uEAA6G;AAG7G,
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../../server/engine/task/building-ledger/general.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConnectionManager, Context, TaskRegistry, evaluateTemplate } from '@things-factory/integration-base'\n\nimport { DataGoKrConnectionInstance } from '../../connector/data-go-kr-connector'\nimport { BldRgstHubService } from '../../spec/building-ledger'\nimport { BrTitleItem, BuildingLedgerResult } from '../../types'\n\n/**\n * 건축물대장 표제부(`getBrTitleInfo`) 조회 태스크.\n *\n * 순수 fetch 만 수행 — 응답 items 를 그대로 반환한다. 다동 필지 집계·단위 변환\n * 같은 도메인 가공은 소비자 측 후속 스텝(data-mapper / jsonata / 자체 태스크) 에서\n * 처리하도록 책임을 분리.\n *\n * 왜 전용 태스크인가:\n * - 범용 `data-go-kr-call` 로도 호출 가능하지만, 필요한 operationRef 와 PNU 5요소\n * 파라미터를 매번 입력하는 대신 파라미터 폼을 명시적으로 제공해 운영/시나리오\n * 작성 부담을 줄인다.\n * - 건축물대장은 dssp/dkpi·건산연·공인중개·자산관리 등 자주 쓰이는 도메인이므로\n * 범용보다 한 단계 전용화된 표면을 둘 가치가 충분.\n */\nasync function BuildingLedgerTask(step, context: Context): Promise<{ data: BuildingLedgerResult }> {\n const { connection: connectionName, params } = step\n const { domain, user, data, variables, lng, logger } = context\n\n const instance: DataGoKrConnectionInstance = await ConnectionManager.getConnectionInstanceByName(\n domain,\n connectionName\n )\n if (!instance?.client) {\n throw new Error(`data-go-kr connection '${connectionName}' is not established.`)\n }\n\n const scope = { domain, user, lng, data, variables, console }\n const evalString = (value: string | undefined) => {\n if (value === undefined || value === null || value === '') return undefined\n try {\n return evaluateTemplate(String(value), scope)\n } catch (err) {\n throw new Error(`data-go-kr-building-ledger: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n\n const sigunguCd = evalString(params.sigunguCd)\n const bjdongCd = evalString(params.bjdongCd)\n const bun = evalString(params.bun)\n\n if (!sigunguCd) throw new Error('data-go-kr-building-ledger: sigunguCd is required')\n if (!bjdongCd) throw new Error('data-go-kr-building-ledger: bjdongCd is required')\n if (!bun) throw new Error('data-go-kr-building-ledger: bun is required')\n\n const servicePath = `${BldRgstHubService.serviceId}/getBrTitleInfo`\n\n const normalizedParams = {\n sigunguCd,\n bjdongCd,\n platGbCd: evalString(params.platGbCd) || '0',\n bun: zpad(bun, 4),\n ji: zpad(evalString(params.ji) || '0', 4),\n numOfRows: 100,\n pageNo: 1\n }\n\n logger?.info?.(`[data-go-kr] ${servicePath} params=${JSON.stringify(normalizedParams)}`)\n\n const items: BrTitleItem[] = await instance.client.getItems(servicePath, normalizedParams)\n\n if (items.length === 0) {\n throw new Error(\n `data-go-kr-building-ledger: no 표제부 records for PNU ` +\n `${normalizedParams.sigunguCd}-${normalizedParams.bjdongCd}-${normalizedParams.platGbCd}-` +\n `${normalizedParams.bun}-${normalizedParams.ji}. ` +\n `Possible causes: PNU is wrong, building is pre-approval, or the lot has no registered building.`\n )\n }\n\n logger?.info?.(`[data-go-kr] items=${items.length} first.bldNm='${items[0].bldNm || ''}'`)\n\n return { data: { items } }\n}\n\nfunction zpad(value: string, width: number): string {\n const s = String(value)\n return s.length >= width ? s : '0'.repeat(width - s.length) + s\n}\n\nBuildingLedgerTask.parameterSpec = [\n { type: 'string', name: 'sigunguCd', label: 'label.sigungu-cd', placeholder: '예) 11680' },\n { type: 'string', name: 'bjdongCd', label: 'label.bjdong-cd', placeholder: '예) 10300' },\n {\n type: 'select',\n name: 'platGbCd',\n label: 'label.plat-gb-cd',\n property: {\n options: [\n { value: '0', display: '대지 / Plot' },\n { value: '1', display: '산 / Mountain' },\n { value: '2', display: '블록 / Block' }\n ]\n }\n },\n { type: 'string', name: 'bun', label: 'label.bun', placeholder: '예) 223' },\n { type: 'string', name: 'ji', label: 'label.ji', placeholder: '예) 0' }\n]\n\nBuildingLedgerTask.help = 'integration/task/building-ledger'\n\nTaskRegistry.registerTaskHandler('data-go-kr-building-ledger', BuildingLedgerTask)\n\nexport default BuildingLedgerTask\n"]}
|
|
@@ -7,7 +7,7 @@ import { DataGoKrResponse } from '../types';
|
|
|
7
7
|
* 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.
|
|
8
8
|
*
|
|
9
9
|
* 입력:
|
|
10
|
-
* - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/
|
|
10
|
+
* - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/BldRgstHubService.getBrTitleInfo"`)
|
|
11
11
|
* - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용
|
|
12
12
|
*
|
|
13
13
|
* 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가
|
|
@@ -21,12 +21,19 @@ declare namespace DataGoKrCall {
|
|
|
21
21
|
type: string;
|
|
22
22
|
name: string;
|
|
23
23
|
label: string;
|
|
24
|
-
|
|
24
|
+
property: {
|
|
25
|
+
options: {
|
|
26
|
+
value: string;
|
|
27
|
+
display: string;
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
placeholder?: undefined;
|
|
25
31
|
} | {
|
|
26
32
|
type: string;
|
|
27
33
|
name: string;
|
|
28
34
|
label: string;
|
|
29
|
-
placeholder
|
|
35
|
+
placeholder: string;
|
|
36
|
+
property?: undefined;
|
|
30
37
|
})[];
|
|
31
38
|
var help: string;
|
|
32
39
|
}
|
|
@@ -9,7 +9,7 @@ const spec_1 = require("../spec");
|
|
|
9
9
|
* 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.
|
|
10
10
|
*
|
|
11
11
|
* 입력:
|
|
12
|
-
* - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/
|
|
12
|
+
* - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/BldRgstHubService.getBrTitleInfo"`)
|
|
13
13
|
* - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용
|
|
14
14
|
*
|
|
15
15
|
* 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가
|
|
@@ -109,17 +109,33 @@ function normalizeAndValidateParams(operation, input) {
|
|
|
109
109
|
}
|
|
110
110
|
return output;
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* SpecRegistry 에 등록된 모든 오퍼레이션을 (operationRef → display) 옵션으로 펼친다.
|
|
114
|
+
* 모듈 로딩 시 한 번 평가되며, 이후 register() 로 추가된 spec 은 반영되지 않음
|
|
115
|
+
* (드문 케이스라 수용 — 향후 동적 parameterSpec 도입 시 해결).
|
|
116
|
+
*/
|
|
117
|
+
function buildOperationRefOptions() {
|
|
118
|
+
return spec_1.SpecRegistry.listServices()
|
|
119
|
+
.flatMap(svc => Object.values(svc.operations).map(op => ({
|
|
120
|
+
value: `${svc.serviceId}.${op.operationId}`,
|
|
121
|
+
display: `[${svc.label}] ${op.label}`
|
|
122
|
+
})))
|
|
123
|
+
.sort((a, b) => a.display.localeCompare(b.display, 'ko'));
|
|
124
|
+
}
|
|
112
125
|
DataGoKrCall.parameterSpec = [
|
|
113
126
|
{
|
|
114
|
-
type: '
|
|
127
|
+
type: 'select',
|
|
115
128
|
name: 'operationRef',
|
|
116
129
|
label: 'label.operation-ref',
|
|
117
|
-
|
|
130
|
+
property: {
|
|
131
|
+
options: buildOperationRefOptions()
|
|
132
|
+
}
|
|
118
133
|
},
|
|
119
134
|
{
|
|
120
135
|
type: 'scenario-step-input',
|
|
121
136
|
name: 'params',
|
|
122
|
-
label: 'label.operation-params'
|
|
137
|
+
label: 'label.operation-params',
|
|
138
|
+
placeholder: '오퍼레이션 파라미터를 JSON 객체로. 예) 건축물대장: {"sigunguCd":"11680","bjdongCd":"10300","bun":"223"} · 단기예보: {"base_date":"20260425","base_time":"1100","nx":"60","ny":"127"}. 정확한 키는 helps/integration/services/<domain>.md 참고.'
|
|
123
139
|
}
|
|
124
140
|
];
|
|
125
141
|
DataGoKrCall.help = 'integration/task/data-go-kr-call';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../server/engine/task/call.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConnectionManager, Context, TaskRegistry, evaluateTemplate } from '@things-factory/integration-base'\n\nimport { DataGoKrConnectionInstance } from '../connector/data-go-kr-connector'\nimport { DataGoKrResponse } from '../types'\nimport { OperationSpec, SpecRegistry } from '../spec'\n\n/**\n * 범용 공공데이터포털 호출 태스크.\n *\n * 하나의 태스크가 등록된 레지스트리의 **모든 오퍼레이션** 을 커버한다. TaskRegistry 가\n * 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.\n *\n * 입력:\n * - `operationRef` : `\"<serviceId>.<operationId>\"` 형식 (예: `\"1613000/BldRgstService_v2.getBrTitleInfo\"`)\n * - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용\n *\n * 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가\n * 등장해도 스펙 추가 전까지 범용 호출로 즉시 사용 가능하다는 장점.\n */\nasync function DataGoKrCall(step, context: Context): Promise<{ data: DataGoKrResponse<any> }> {\n const { connection: connectionName, params: stepParams } = step\n const { domain, user, data, variables, lng, logger } = context\n\n const instance: DataGoKrConnectionInstance = await ConnectionManager.getConnectionInstanceByName(\n domain,\n connectionName\n )\n if (!instance?.client) {\n throw new Error(`data-go-kr connection '${connectionName}' is not established.`)\n }\n\n const operationRef = stepParams?.operationRef\n if (!operationRef || typeof operationRef !== 'string') {\n throw new Error('data-go-kr-call: operationRef is required (format: \"<serviceId>.<operationId>\")')\n }\n\n const resolved = SpecRegistry.resolve(operationRef)\n const rawParams = stepParams?.params || {}\n\n const scope = { domain, user, lng, data, variables, console }\n const evalValue = (value: any) => {\n if (value === undefined || value === null) return value\n if (typeof value !== 'string') return value\n try {\n return evaluateTemplate(value, scope)\n } catch (err) {\n throw new Error(`data-go-kr-call: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n\n const evaluatedParams: Record<string, any> = {}\n for (const [k, v] of Object.entries(rawParams)) {\n evaluatedParams[k] = evalValue(v)\n }\n\n const { service, operation } = resolved || { service: null, operation: null }\n const finalParams = operation\n ? normalizeAndValidateParams(operation, evaluatedParams)\n : evaluatedParams\n\n const servicePath = resolved\n ? `${service!.serviceId}/${operation!.operationId}`\n : operationRef.replace('.', '/')\n\n logger?.info?.(`[data-go-kr] call ${servicePath} params=${JSON.stringify(finalParams)}`)\n\n const response = await instance.client.get(servicePath, finalParams)\n return { data: response }\n}\n\n/**\n * 스펙 기반 파라미터 정규화·검증.\n *\n * 1. required 필수값 체크\n * 2. default 기본값 주입\n * 3. pad zero-padding (예: bun=6 → \"0006\")\n * 4. length 정확 길이 검증\n * 5. enum 허용 값 검증\n */\nfunction normalizeAndValidateParams(operation: OperationSpec, input: Record<string, any>): Record<string, any> {\n const output: Record<string, any> = {}\n const errors: string[] = []\n\n for (const p of operation.params) {\n let value = input[p.name]\n\n if (value === undefined || value === null || value === '') {\n if (p.default !== undefined) {\n value = p.default\n } else if (p.required) {\n errors.push(`'${p.name}' is required (${p.description})`)\n continue\n } else {\n continue\n }\n }\n\n value = String(value)\n\n if (p.pad && value.length < p.pad) {\n value = '0'.repeat(p.pad - value.length) + value\n }\n\n if (p.length !== undefined && value.length !== p.length) {\n errors.push(\n `'${p.name}' must be exactly ${p.length} characters (got \"${value}\", length ${value.length})`\n )\n continue\n }\n\n if (p.enum && !p.enum.some(e => e.value === value)) {\n errors.push(\n `'${p.name}' must be one of [${p.enum.map(e => e.value).join(', ')}] (got \"${value}\")`\n )\n continue\n }\n\n output[p.name] = value\n }\n\n /* 스펙에 없는 파라미터도 pass-through (미등록 필드 허용) */\n for (const [k, v] of Object.entries(input)) {\n if (!(k in output) && !operation.params.find(p => p.name === k)) {\n if (v !== undefined && v !== null && v !== '') {\n output[k] = v\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `data-go-kr-call parameter validation failed for ${operation.operationId}:\\n - ${errors.join('\\n - ')}`\n )\n }\n\n return output\n}\n\nDataGoKrCall.parameterSpec = [\n {\n type: 'string',\n name: 'operationRef',\n label: 'label.operation-ref',\n placeholder: '<serviceId>.<operationId> (예: 1613000/BldRgstService_v2.getBrTitleInfo)'\n },\n {\n type: 'scenario-step-input',\n name: 'params',\n label: 'label.operation-params'\n }\n]\n\nDataGoKrCall.help = 'integration/task/data-go-kr-call'\n\nTaskRegistry.registerTaskHandler('data-go-kr-call', DataGoKrCall)\n\nexport default DataGoKrCall\n"]}
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../server/engine/task/call.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConnectionManager, Context, TaskRegistry, evaluateTemplate } from '@things-factory/integration-base'\n\nimport { DataGoKrConnectionInstance } from '../connector/data-go-kr-connector'\nimport { DataGoKrResponse } from '../types'\nimport { OperationSpec, SpecRegistry } from '../spec'\n\n/**\n * 범용 공공데이터포털 호출 태스크.\n *\n * 하나의 태스크가 등록된 레지스트리의 **모든 오퍼레이션** 을 커버한다. TaskRegistry 가\n * 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.\n *\n * 입력:\n * - `operationRef` : `\"<serviceId>.<operationId>\"` 형식 (예: `\"1613000/BldRgstHubService.getBrTitleInfo\"`)\n * - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용\n *\n * 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가\n * 등장해도 스펙 추가 전까지 범용 호출로 즉시 사용 가능하다는 장점.\n */\nasync function DataGoKrCall(step, context: Context): Promise<{ data: DataGoKrResponse<any> }> {\n const { connection: connectionName, params: stepParams } = step\n const { domain, user, data, variables, lng, logger } = context\n\n const instance: DataGoKrConnectionInstance = await ConnectionManager.getConnectionInstanceByName(\n domain,\n connectionName\n )\n if (!instance?.client) {\n throw new Error(`data-go-kr connection '${connectionName}' is not established.`)\n }\n\n const operationRef = stepParams?.operationRef\n if (!operationRef || typeof operationRef !== 'string') {\n throw new Error('data-go-kr-call: operationRef is required (format: \"<serviceId>.<operationId>\")')\n }\n\n const resolved = SpecRegistry.resolve(operationRef)\n const rawParams = stepParams?.params || {}\n\n const scope = { domain, user, lng, data, variables, console }\n const evalValue = (value: any) => {\n if (value === undefined || value === null) return value\n if (typeof value !== 'string') return value\n try {\n return evaluateTemplate(value, scope)\n } catch (err) {\n throw new Error(`data-go-kr-call: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n\n const evaluatedParams: Record<string, any> = {}\n for (const [k, v] of Object.entries(rawParams)) {\n evaluatedParams[k] = evalValue(v)\n }\n\n const { service, operation } = resolved || { service: null, operation: null }\n const finalParams = operation\n ? normalizeAndValidateParams(operation, evaluatedParams)\n : evaluatedParams\n\n const servicePath = resolved\n ? `${service!.serviceId}/${operation!.operationId}`\n : operationRef.replace('.', '/')\n\n logger?.info?.(`[data-go-kr] call ${servicePath} params=${JSON.stringify(finalParams)}`)\n\n const response = await instance.client.get(servicePath, finalParams)\n return { data: response }\n}\n\n/**\n * 스펙 기반 파라미터 정규화·검증.\n *\n * 1. required 필수값 체크\n * 2. default 기본값 주입\n * 3. pad zero-padding (예: bun=6 → \"0006\")\n * 4. length 정확 길이 검증\n * 5. enum 허용 값 검증\n */\nfunction normalizeAndValidateParams(operation: OperationSpec, input: Record<string, any>): Record<string, any> {\n const output: Record<string, any> = {}\n const errors: string[] = []\n\n for (const p of operation.params) {\n let value = input[p.name]\n\n if (value === undefined || value === null || value === '') {\n if (p.default !== undefined) {\n value = p.default\n } else if (p.required) {\n errors.push(`'${p.name}' is required (${p.description})`)\n continue\n } else {\n continue\n }\n }\n\n value = String(value)\n\n if (p.pad && value.length < p.pad) {\n value = '0'.repeat(p.pad - value.length) + value\n }\n\n if (p.length !== undefined && value.length !== p.length) {\n errors.push(\n `'${p.name}' must be exactly ${p.length} characters (got \"${value}\", length ${value.length})`\n )\n continue\n }\n\n if (p.enum && !p.enum.some(e => e.value === value)) {\n errors.push(\n `'${p.name}' must be one of [${p.enum.map(e => e.value).join(', ')}] (got \"${value}\")`\n )\n continue\n }\n\n output[p.name] = value\n }\n\n /* 스펙에 없는 파라미터도 pass-through (미등록 필드 허용) */\n for (const [k, v] of Object.entries(input)) {\n if (!(k in output) && !operation.params.find(p => p.name === k)) {\n if (v !== undefined && v !== null && v !== '') {\n output[k] = v\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `data-go-kr-call parameter validation failed for ${operation.operationId}:\\n - ${errors.join('\\n - ')}`\n )\n }\n\n return output\n}\n\n/**\n * SpecRegistry 에 등록된 모든 오퍼레이션을 (operationRef → display) 옵션으로 펼친다.\n * 모듈 로딩 시 한 번 평가되며, 이후 register() 로 추가된 spec 은 반영되지 않음\n * (드문 케이스라 수용 — 향후 동적 parameterSpec 도입 시 해결).\n */\nfunction buildOperationRefOptions(): Array<{ value: string; display: string }> {\n return SpecRegistry.listServices()\n .flatMap(svc =>\n Object.values(svc.operations).map(op => ({\n value: `${svc.serviceId}.${op.operationId}`,\n display: `[${svc.label}] ${op.label}`\n }))\n )\n .sort((a, b) => a.display.localeCompare(b.display, 'ko'))\n}\n\nDataGoKrCall.parameterSpec = [\n {\n type: 'select',\n name: 'operationRef',\n label: 'label.operation-ref',\n property: {\n options: buildOperationRefOptions()\n }\n },\n {\n type: 'scenario-step-input',\n name: 'params',\n label: 'label.operation-params',\n placeholder:\n '오퍼레이션 파라미터를 JSON 객체로. 예) 건축물대장: {\"sigunguCd\":\"11680\",\"bjdongCd\":\"10300\",\"bun\":\"223\"} · 단기예보: {\"base_date\":\"20260425\",\"base_time\":\"1100\",\"nx\":\"60\",\"ny\":\"127\"}. 정확한 키는 helps/integration/services/<domain>.md 참고.'\n }\n]\n\nDataGoKrCall.help = 'integration/task/data-go-kr-call'\n\nTaskRegistry.registerTaskHandler('data-go-kr-call', DataGoKrCall)\n\nexport default DataGoKrCall\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,kBAAe;AACf,6BAA0B","sourcesContent":["/**\n * 태스크 배럴.\n *\n * 구성 규약:\n * - 범용 태스크 (여러 서비스에 공통 적용) 는 이 폴더 **최상단** 에 파일로 배치\n * 예) call.ts → data-go-kr-call\n *\n * - 특정 도메인/서비스의 전용 태스크는 **도메인 이름 폴더** 아래 배치\n * 예) building-ledger/ , (향후) property-trade/ , address/ ...\n *\n * 새 서비스 지원 우선순위:\n * 1) 먼저 SpecRegistry 에 서비스 스펙을 등록 → `data-go-kr-call` 로 즉시 호출 가능\n * 2) 그래도 불충분한 경우(입력 폼 필요, 응답 구조가 비표준, 도메인 가공 필수 등)만\n * 도메인 폴더를 새로 만들고 전용 태스크 작성\n *\n * 즉 이 폴더에 새 파일/폴더가 추가되는 것은 \"공통 경로로 풀 수 없는 예외\" 뿐이다.\n */\nimport './call'\nimport './building-ledger'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,kBAAe;AACf,6BAA0B;AAC1B,qBAAkB","sourcesContent":["/**\n * 태스크 배럴.\n *\n * 구성 규약:\n * - 범용 태스크 (여러 서비스에 공통 적용) 는 이 폴더 **최상단** 에 파일로 배치\n * 예) call.ts → data-go-kr-call\n *\n * - 특정 도메인/서비스의 전용 태스크는 **도메인 이름 폴더** 아래 배치\n * 예) building-ledger/ , (향후) property-trade/ , address/ ...\n *\n * 새 서비스 지원 우선순위:\n * 1) 먼저 SpecRegistry 에 서비스 스펙을 등록 → `data-go-kr-call` 로 즉시 호출 가능\n * 2) 그래도 불충분한 경우(입력 폼 필요, 응답 구조가 비표준, 도메인 가공 필수 등)만\n * 도메인 폴더를 새로 만들고 전용 태스크 작성\n *\n * 즉 이 폴더에 새 파일/폴더가 추가되는 것은 \"공통 경로로 풀 수 없는 예외\" 뿐이다.\n */\nimport './call'\nimport './building-ledger'\nimport './weather'\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KMA(기상청) 5km 격자좌표 ↔ 위경도 변환.
|
|
3
|
+
*
|
|
4
|
+
* 동네예보·초단기 시리즈는 위경도가 아닌 KMA 자체 격자(nx, ny) 로 호출하므로,
|
|
5
|
+
* 일반적으로 알고 있는 위경도 좌표를 격자로 바꿔주는 헬퍼가 필요하다.
|
|
6
|
+
*
|
|
7
|
+
* 변환식 출처: 기상청 공식 동네예보 격자 변환 문서 (Lambert Conformal Conic).
|
|
8
|
+
*/
|
|
9
|
+
export interface LatLon {
|
|
10
|
+
/** 위도 (degree). */
|
|
11
|
+
latitude: number;
|
|
12
|
+
/** 경도 (degree). */
|
|
13
|
+
longitude: number;
|
|
14
|
+
}
|
|
15
|
+
export interface KmaGrid {
|
|
16
|
+
/** 격자 X. */
|
|
17
|
+
nx: number;
|
|
18
|
+
/** 격자 Y. */
|
|
19
|
+
ny: number;
|
|
20
|
+
}
|
|
21
|
+
/** 위경도 → KMA 5km 격자좌표 (nx, ny). */
|
|
22
|
+
export declare function latLonToGrid(input: LatLon): KmaGrid;
|
|
23
|
+
/** KMA 5km 격자좌표 → 위경도 (격자 중심점). */
|
|
24
|
+
export declare function gridToLatLon(input: KmaGrid): LatLon;
|