이제 법정동 코드도 구했으니 법정동 코드를 이용해 해당 토지에 대한 개별 공시지가를 구해 보겠습니다.
1. API 검색
먼저 해당 API를 검색해야 하는데,
오픈API에서 API레퍼런스를 누른 후 국가중점데이터API의 레퍼런스 버튼을 누릅니다.

그러면 개별공시가 다음에 WMS, WFS, 속성이 나오는데,

WMS는 맵 이미지를 조회하는 기능이고,
WFS는 도형 및 속성값을 포함한 피처 집합을 조회하는 기능이라는데, 결괏값을 보니 해당 토지의 경계점 좌표와 개별공시지가를 반환합니다.
그리고, 개별공시지가속성조회는 해당 토지에 대한 개별공시지가를 조회하는 기능이므로 이것을 이용하겠습니다.
2. 샘플 코드
위에서 개별공시지가속성조회를 누르면
맨 아래에 샘플코드가 JAVA, JavaScript, JSONP, PHP, Python으로 구분되어 있습니다.

먼저 JavaScript를 이용해 구현해 보겠습니다.
샘플 코드는 아래와 같습니다.
/* Javascript 샘플 코드 */
var xhr = new XMLHttpRequest();
var HttpUrl = "http://api.vworld.kr/ned/data/getIndvdLandPriceAttr"; /*URL*/
var parameter = "?" + encodeURIComponent("key") +"="+encodeURIComponent("인증키"); /*key*/
parameter += "&" + encodeURIComponent("domain") +"="+encodeURIComponent("도메인"); /*domain*/
parameter += "&" + encodeURIComponent("pnu") + "=" + encodeURIComponent("1111017700102110000"); /* 고유번호(8자리 이상) */
parameter += "&" + encodeURIComponent("stdrYear") + "=" + encodeURIComponent("2015"); /* 기준연도(YYYY: 4자리) */
parameter += "&" + encodeURIComponent("format") + "=" + encodeURIComponent("xml"); /* 응답결과 형식(xml 또는 json) */
parameter += "&" + encodeURIComponent("numOfRows") + "=" + encodeURIComponent("10"); /* 검색건수 (최대 1000) */
parameter += "&" + encodeURIComponent("pageNo") + "=" + encodeURIComponent("1"); /* 페이지 번호 */
xhr.open("GET", HttpUrl + parameter);
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
alert("Status: "+this.status+" Headers: "+JSON.stringify(this.getAllResponseHeaders())+" Body: "+this.responseText);
}
};
xhr.send("");
인수는 인증키, domain, 고유번호(8자리 이상), 기준연도, 응답결과 형식(xml 또는 json)입니다.
검색 건수와 페이지번호가 있지만, 굳이 입력하지 않아도 됩니다.
3. 고유번호(PNU) 만들기
고유번호는 법정동 코드 + 필지구분 + 본번 4자리 + 부번 4자리입니다.
고유번호에 대한 설명은 https://lsw3210.tistory.com/517를 참고 바랍니다.
국회의사당의 지번 주소인 여의도동 1번지를 대상으로 만들어보겠습니다.
여의도동에 해당하는 법정동 코드는 1156011000이며,
필지구분은 지번에 '산'이 들어가 있어 임야대장 대상인 경우는 2, 아닌 경우는 1이므로 1이 되고,
본번은 1인데 4자리이므로 0001이고, 부번은 없으므로 0000입니다.
따라서, 이것을 모두 연결하면 1156011000100010000(19자리 수)이 됩니다.
4. API결과 미리보기
샘플 코드 위로 올라가면 요청 변수가 있는데,
위에서 만든 고유번호를 입력하고, 연도는 2024, 응답 형식은 json, 발급받은 API Key를 입력하고 윗부분의 'API결과 미리보기' 버튼을 누르면

아래와 같이 JSON 형식의 결괏값이 반환됩니다.
2024년 기준 개별 공시지가는 18,360,000원입니다.

개별공시지가에 해당하는 키는 pblntfPclnd입니다.
경로를 보면 indvdLandPrices 아래 field의 0번째 배열에서 pblntfPclnd에 해당하는 값이므로
JavaScript 배열로 변환한 값을 기준으로 표현하면 .indvdLandPrices.field[0].pblntfPclnd입니다.
pblntfPclnd에서 l이 L인지 I인지 헷갈리는데, L소문자입니다.
5. 코드 1(실패)
샘플코드를 이용해서 여의도동 1번지에 대한 개별공시지가를 구하는 코드를 만들면 아래와 같습니다.
인증키와 도메인은 자신의 것으로 넣길 바랍니다.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, shrink-to-fit=no">
<title>개별공시지가 조회</title>
</head>
<body>
<div id="vmap">
<script type="text/javascript" src="https://map.vworld.kr/js/vworldMapInit.js.do?version=2.0&apiKey=CEB52025-E065-364C-9DBA-44880E3B02B8&domain=localhost:8080"></script>
<script type="text/javascript">
var xhr = new XMLHttpRequest();
var HttpUrl = "http://api.vworld.kr/ned/data/getIndvdLandPriceAttr"; /*URL*/
var parameter = "?" + encodeURIComponent("key") +"="+encodeURIComponent("인증키"); /*key*/
parameter += "&" + encodeURIComponent("domain") +"="+encodeURIComponent("도메인"); /*domain*/
parameter += "&" + encodeURIComponent("pnu") + "=" + encodeURIComponent("1156011000100010000"); /* 고유번호(8자리 이상) */
parameter += "&" + encodeURIComponent("stdrYear") + "=" + encodeURIComponent("2024"); /* 기준연도(YYYY: 4자리) */
parameter += "&" + encodeURIComponent("format") + "=" + encodeURIComponent("json"); /* 응답결과 형식(xml 또는 json) */
parameter += "&" + encodeURIComponent("numOfRows") + "=" + encodeURIComponent("10"); /* 검색건수 (최대 1000) */
parameter += "&" + encodeURIComponent("pageNo") + "=" + encodeURIComponent("1"); /* 페이지 번호 */
xhr.open("GET", HttpUrl + parameter);
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
alert("Status: "+this.status+" Headers: "+JSON.stringify(this.getAllResponseHeaders())+" Body: "+this.responseText);
}
};
xhr.send("");
</script>
</script>
</body>
</html>
그리고 실행하면
Status가 0이고, Headers가 공백이고, Body부분은 아무런 내용도 표시되지 않습니다.

그래서 확인 버튼을 누른 후 F12키를 눌러 검사 모드로 들어가서
Console 창을 확인해 보니

"This request has been blocked; the content must be served over HTTPS."라고 합니다.
따라서, http를 https로 바꾸고 다시 해봅니다.
이번에도 Body가 하나도 안 나오고, Console 창을 보니

에러 메시지가 "CORS 정책에 의해서 origin인 https://starsovermt.cloudaccess.host가가 차단됐다"라고 나옵니다.

그래서 x.com에서 그록 3으로 찾아보니 프록시 서버 설정하는 방법을 알려주는데

Node.js + Express 사용이라 잘 모르겠습니다.
그런데 다행인 것은
확인 버튼을 누르면 아래와 같이 결과가 한 줄 더 출력되는데,

이때 URL에서 마우스 오른쪽 버튼을 누른 후 'Open in new tab'을 클릭하면

아래와 같이 개별공시지가가 정상적으로 표시된다는 것입니다.
다시 말해 검색 URL 자체에는 문제가 없다는 것입니다.

그리고, JavaScript가 아니라 JSONP로 하면 되니
다음 편에서 JSONP를 이용하는 방법을 다뤄보겠습니다.
'Map(WEB)' 카테고리의 다른 글
vworld 지도 만들기(15) - 개별공시지가 표시하기(3) : PHP(1) (0) | 2025.03.05 |
---|---|
vworld 지도 만들기(14) - 개별공시지가 표시하기(2) : JSONP (0) | 2025.03.04 |
오픈 API를 이용한 법정동 코드 조회(5) - PHP(2) (0) | 2025.02.28 |
오픈 API를 이용한 법정동 코드 조회(4) - PHP(1) (0) | 2025.02.27 |
오픈 API를 이용한 법정동 코드 조회(3) - JavaScript(2) (0) | 2025.02.26 |