vWorld.kr에서 제공하는 Open API를 이용하여 주소를 지도 좌표로 변환합니다.
기본적으로 인증키를 발급 신청하여야 사용할 수 있습니다.
인증키는 3개월 사용가능하고, 3회 연장이 가능하므로 총 12개월 사용이 가능합니다.
만료되면 새로 신청하거나 여러 개 신청해서 쓰면 되겠죠?^^
사용할 API는 검색API입니다.
Geocoder API가 별도로 있는데, 검색API를 이용하는 이유는 정보가 좀 더 사용하기 편하기 때문입니다.
사용할 시나리오는 아래와 같이...
우리가 사용하는 주소가 2가지라 보편적으로 사용하는 도로명 주소를 먼저 조회하고,
검색 결과가 없으면 지번 주소로 추가 검색하여
결과를 파싱하여 필요한 정보를 뽑아 냅니다. ( x좌표, y좌표 , 우편번호, 도로명주소, 지번주소 등 )
서비스 기본 주소는 https://api.vworld.kr/req/search
사용할 옵션은 servive=search, request=search, version=2.0
출력지정은 json과 xml이 가능한데 xml로 지정 format=xml
검색할 대상은 type=address
검색할 종류는 먼저 도로명주소로 category=road 한 다음 결과가 없으면 category=parcel 로 지번 주소를 검색
검색 결과는 최대치수로 지정 size=1000
출력할 좌표계는 EPSG코드로 지정 crs=EPSG:4326
검색할 주소는 URL encoding을 한 상태로 지정 query=인코딩된주소
마지막으로 사용할 개인 Key를 지정 key=신청하여받은Key
이중 빨강색으로 지정한 것은 사용자가 입력하도록 함수를 구성하면 아래와 같습니다.
Function GEOPoint(Optional Address$ = "", Optional EPSG& = 4326, Optional ByVal APIKey$ = "")
Dim sURL$, sXML$, x#, y#, i&, vResult
Dim xDOC As Object, xList As Object, xNode As Object
sURL = "https://api.vworld.kr/req/search?service=search&request=search&version=2.0&format=xml&type=address&category=road&size=1000&key=" & APIKey
sURL = sURL & "&crs=EPSG:" & EPSG & "&query=" & Application.EncodeURL(Address)
sXML = getURL(sURL)
If InStr(1, sXML, "INVALID_KEY") Then
GEOPoint = "Error: API Key"
Exit Function
ElseIf InStr(1, sXML, "NOT_FOUND") Then '// 지번주소로 한 번 더 검색
sURL = "https://api.vworld.kr/req/search?service=search&request=search&version=2.0&format=xml&type=address&category=parcel&size=1000&key=" & APIKey
sURL = sURL & "&crs=EPSG:" & EPSG & "&query=" & Application.EncodeURL(Address)
sXML = getURL(sURL)
If InStr(1, sXML, "NOT_FOUND") Then GEOPoint = "Error: 주소": Exit Function
End If
Set xDOC = CreateObject("MSXML2.DOMDocument.6.0")
With xDOC
.async = False
.validateOnParse = False
.LoadXML sXML
Set xList = .SelectNodes("//response/result/items/item")
If xList.Length = 0 Then GEOPoint = "Error: 자료 없음": Exit Function
ReDim vResult(1 To xList.Length, 1 To 7)
For Each xNode In xList
i = i + 1
With xNode
Set xNode = .SelectSingleNode("point/x"): If Not xNode Is Nothing Then vResult(i, 1) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("point/y"): If Not xNode Is Nothing Then vResult(i, 2) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("address/zipcode"): If Not xNode Is Nothing Then vResult(i, 3) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("address/road"): If Not xNode Is Nothing Then vResult(i, 4) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("address/parcel"): If Not xNode Is Nothing Then vResult(i, 5) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("address/bldnm"): If Not xNode Is Nothing Then vResult(i, 6) = delCDATA(xNode.text)
Set xNode = .SelectSingleNode("address/bldnmdc"): If Not xNode Is Nothing Then vResult(i, 7) = delCDATA(xNode.text)
End With
Next
End With
GEOPoint = vResult
End Function
Excel 2021이나 Microsoft 365는 이 함수를 그대로 사용하면 출력이 가능하고,
Excel 2019나 그 이전의 Excel은 배열을 출력하기 위해서는 vResult 배열을 적절히 처리해 주어야 합니다.
이제 1개 또는 여러개의 좌표 목록을 받았으므로 어떤 것을 선택하여 사용할 지 정하면 됩니다.
여기에 사용된 getURL 함수 함수는 아래를 참고하세요.
https://egtools.tistory.com/entry/VBA-Web-Scraping
delCDATA는 간단한 함수입니다.
Function delCDATA(ByVal text As String)
delCDATA = Replace(Replace(text, "<![CDATA[", ""), "]]>", "")
End Function
'Excel - VBA' 카테고리의 다른 글
[VBA] JSON 을 이름, 값 배열로 변환하기 (JSONPair) (0) | 2024.03.28 |
---|---|
Google Calendar를 Excel에 연결하기 (2) | 2024.03.18 |
[VBA] 지도 좌표계 변환 (WGS84, UTM52N, KATEC, UTM-K, 중부원점) (1) | 2024.02.10 |
[Excel] Windows 11 에서 한글 입력 이상할 때 (1) | 2023.12.26 |
[VBA] Module이나 Sub의 크기 한계 (3) | 2023.12.10 |