2022.06.29 ~ 2022.07.01
Open API를 활용하여 공공데이터 수집 및 가공, 데이터 전달하는 REST API 개발
- Node.js를 이용하여 REST API 개발
- 서울시 `하수관로 수위 현황`과 `강우량` 정보 json 방식으로 전달받아 데이터 결합
- 결합된 데이터 출력
방법1) 공통된 시간대의 하수관로 수위와 강우량을 동시에 확인 할 수 있게 데이터 결합
방법2) 받아온 모든 데이터를 누락없이 제공할 수 있도록 union 처리
✔️ cityId=01
를 변경해가면서 테스트 가능합니다
✔️ cityId의 범위는 01~25
까지 가능합니다
- 하수관로 현황 데이터를 데이터 프레임으로 생성
let dfPipe = new df.DataFrame(drainPipeArr.row); // 데이터프레임 생성
dfPipe = dfPipe.cast("MEA_YMD", String); // 형변환
dfPipe = dfPipe.map((row) => row.set("MEA_YMD", row.get("MEA_YMD").substr(0, 16))); // 날짜 형식 강우량과 맞추기 (년-월-일 시:분)
dfPipe = dfPipe.groupBy("MEA_YMD").aggregate((group) => group.stat.mean("MEA_WAL")); // 날짜로 그룹화하여 MEA_WAL 칼럼 평균
dfPipe = dfPipe.renameAll(["date", "waterLevel"]); // 칼럼명 변경
- 강우량 현황 데이터를 데이터 프레임으로 생성
let dfRain = new df.DataFrame(rainFallArr.row);
dfRain = dfRain.groupBy("RECEIVE_TIME").aggregate((group) => group.stat.mean("RAINFALL10")); // 날짜로 그룹화하여 rainFall 칼럼 평균
dfRain = dfRain.renameAll(["date", "rainFall"]);
- 두 데이터 innerjoin으로 결합 후 형식에 맞게 출력
dfRain = dfRain.cast("date", String); // inner join을 위한 형변환
dfPipe = dfPipe.innerJoin(dfRain, "date"); // innerjoin으로 공통된 시간인 10분 단위로 값 출력
dfPipe = dfPipe.cast("waterLevel", String);
dfPipe = dfPipe.map((row) => row.set("waterLevel", row.get("waterLevel").substr(0, 5))); // 소수점 자르기
dfPipe = dfPipe.withColumn("localname", () => area); // localname 칼럼 추가
dfPipe = dfPipe.restructure(["localname", "date", "waterLevel", "rainFall"]); // 칼럼 순서 변경
console.log(dfPipe.toCollection());
if (drainPipeArr.RESULT.MESSAGE === "정상 처리되었습니다") {
let res = {
CODE: 200,
GUBN: area,
GUBN_NUM: code,
DRAINPIPE: drainPipeArr.row,
RAINFALL: rainFallArr.row,
};
console.log(JSON.stringify(res, undefined, 2));
return JSON.stringify(res);
}
METHOD | URL | |
---|---|---|
방법1 | GET | api/seoul-rainfall-drainpipe-data1?cityId=? |
방법2 | GET | api/seoul-rainfall-drainpipe-data1?cityId=? |