Map(WEB)

vworld 지도 만들기(16) - 개별공시지가 표시하기(4) : PHP(2)

별동산 2025. 3. 6. 08:56
반응형

1. PHP 파일

php 파일은 html 파일에서 호출하는 show_landprice.php 파일과 사용자 정의함수가 들어 있는 vword_function.php 2개입니다.

show_landprice.php
0.00MB
vworld_function.php
0.00MB

 

2. 주소 JSON 파일의 구조

Geocoder API 2.0에서 제공하는 정보에 주소(아래 표에서 text)만 있는 줄 알았더니

zipcode와 법정동 코드인 level4LC가 있어서, data.go.kr을 이용하지 않고, 이것을 이용하겠습니다.

그리고, 동호수가 detail에 있어서 이것도 이용했습니다.

 

 

 

3. 간단한 코드 설명

가. show_landprice.php

(1) include로 파일을 불러옴

include는 다른 언어의 import와 유사한 기능입니다.

// 변수($VworldKey) 지정 파일 불러오기
include "./wp-admin/config.php";

// 사용자 정의 함수 불러오기
include "vworld_function.php";

 

config.php 파일에 자주 사용하는 변수를 넣어놓습니다.

여기서 $vworldKey와 $domain 변수를 이용하는데,

아래와 같은 내용으로 들어가 있습니다.

<?php
    $vworldKey='vworld 인증키';
    $domain='활용신청시 작성한 도메인 주소';
?>

 

vworld_function.php는 주소와 법정동 코드를 불러오고, 개별공시지가를 조회해서 반환하는 사용자 정의 함수가 들어 있습니다.

 

show_landprice.php의 아래에 사용자 정의 함수를 놓아도 되지만, 깔끔하게 정리하기 위해서 파일을 분리한 것입니다.

 

(2) Get 방식을 전달한 변수를 PHP 변수에 저장

// get으로 가져온 인수를 php로 불러오기
$coord = isset($_GET['coord']) ? $_GET['coord'] : '';

? 다음의 인수는 Get방식이므로 위와 같이 불러와서 $coord라는 php 변수에 대입합니다.

 

(3) $coord에서 위, 경도를 가져옴

$coord1 = explode(',', $coord);
$lat = $coord1[1]; //위도
$lng = $coord1[0]; //경도

explode 함수는 구분자(여기서는 콤마)를 기준으로 문자열을 분리하는 기능을 합니다.

 

(4) 지번 주소, 법정동 코드 등을 가져옴

// 지번 주소, 도로명 주소, 세부 주소, 우편번호, 법정동 코드 구하기
[$jibun_addr, $road_addr, $donghosu, $zipcode, $regionCd] 
= getAddr($coord, $vworldKey);

getAddr($coord, $vworldKey)로 주소와 관련된 정보를 가져오는데 여러 가지가 있으므로 배열로 반환(return)하고, 배열로 받습니다.

 

getAddr 함수로 전달하는 인자는 $coord와 $vworldKey입니다.

 

(5) PNU 만들기

// 주소를 가|로|동|리로 구분해서 나누기
preg_match('/^(.*[가|로|동|리])\s+(.*)$/u', $jibun_addr, $matches);
$dong = $matches[1];
$jibun= $matches[2];

// PNU(고유번호) 구하기 
$sanYN = strpos($jibun,'산') === false ? '1' : '2';
$numbers = explode('-', trim(str_replace('산', '', $jibun)));
$bonbun = str_pad($numbers[0], 4, '0', STR_PAD_LEFT);
$bubun = $numbers[1] ? str_pad($numbers[1], 4, '0', STR_PAD_LEFT) : '0000';
$pnu = $regionCd . $sanYN . $bonbun . $bubun;

지번 주소를 '가, 로, 동, 리'를 기준으로 2개로 분리하는데,

0번째는 전체 주소이고, 1번째는 가, 로, 동, 리까지이고, 2번째는 지번입니다.

 

지번에는 '산'이 있는지 여부를 판단해서 필지구분(여기서는 $sanYN)을 구하고,

본번과 부번을 앞에 0을 붙여 4자리 숫자로 만듭니다.

 

그런데 지번이 '산 1-1식'으로 strpos로 '산'을 찾으면 '산'이 있을 때도 0, 없을 때도 false라 0이 되므로, 구분하기 위해서 없을 때를 === false라고 해야 합니다.

 

'산 1-1'에서 '산'을 제외한 지번만을 추출할 때도 '산'을 빈칸('')으로 바꾼 다음 trim을 이용해 좌우 공백을 제거했습니다.

 

그리고, 법정동코드와 필지구분, 본번, 부번을 연결하면 PNU가 됩니다.

 

(6) 개별공시지가 구하기

// 개별공시지가 구하기
[$year, $landprice] = getLandPrice($pnu, $vworldKey, $domain);

개별공시지가는 vworld_function.php에 있는 getLandPrice 함수를 이용해서 구하는데, 위에서 만든 $pnu와 $vworldKey뿐만 아니라 아래 설명처럼 domain 정보도 넘겨야 하므로 $domain을 인수에 추가했습니다.

 

(7) 화면에 표시할 문장 구성

// div 태그에 표시할 내용 구성하기
echo "- 지번 주소: " . $jibun_addr .($zipcode ? '&nbsp;(우편번호: ' . $zipcode . ')' : '')
.($road_addr ? "<br>&nbsp;&nbsp;(도로명 주소: " . $road_addr . ")" : '')
.($donghosu ? " (" . $donghosu . ")" : "") 
."<br>- 위도: ". $lat . ', 경도: ' . $lng 
."<br>- 개별공시지가: ". number_format($landprice,0) ."원/㎡"; 

 

echo 함수를 이용해 화면에 표시하는데,

문자열을 연결하는 함수는 .(마침표)입니다.

 

"- 지번 주소: " . $jibun_addr  

  : '- 지번 주소' 다음에 $jibun_addr(지번 주소)를 표시합니다.

 

[3항 연산자 이용 도로명 주소 등 표시]

php에서 3항 연산자는

조건 ? 참일 때의 값 : 거짓일 때의 값

과 같이 사용합니다. 

조건에 따라 참일 때 값과 거짓일 때 값으로 한 줄에 표현합니다.

($zipcode ? '&nbsp;(우편번호: ' . $zipcode . ')' : '')
.($road_addr ? "<br>&nbsp;&nbsp;(도로명 주소: " . $road_addr . ")" : '')
.($donghosu ? " (" . $donghosu . ")" : "") 

 

위 구문은 $zipcode(우편번호), $road_addr(도로명 주소)와 $donghosu(상세 주소)가 있는지 여부를 판단해서 있을 때만 표시하는 것입니다.

 

(지번 주소, 우편번호, 도로명 주소, 세부정보가 모두 있는 경우)

(지번 주소, 우편번호, 도로명 주소, 세부정보가 모두 있는 경우)

 

(지번 주소, 우편번호만 있는 경우)

(지번 주소, 우편번호만 있는 경우)

 

(지번 주소만 있는 경우)

(지번 주소만 있는 경우)

 

vworld_function.php는 다음 편에서 설명하겠습니다.

반응형