Excel - VBA

vWorld.kr의 Open API를 이용한 Geocoding

EGTools 2024. 2. 12. 23:37
728x90

vWorld.kr에서 제공하는 Open API를 이용하여 주소를 지도 좌표로 변환합니다.

기본적으로 인증키를 발급 신청하여야 사용할 수 있습니다.

인증키는 3개월 사용가능하고, 3회 연장이 가능하므로 총 12개월 사용이 가능합니다.

만료되면 새로 신청하거나 여러 개 신청해서 쓰면 되겠죠?^^

 

신청가능한 API -> 귀찮으니 몽땅 신청

 

사용할 API는  검색API입니다.

Geocoder API가 별도로 있는데,  검색API를 이용하는 이유는 정보가 좀 더 사용하기 편하기 때문입니다.

 

사용할 시나리오는 아래와 같이...

우리가 사용하는 주소가 2가지라 보편적으로 사용하는 도로명 주소를 먼저 조회하고,

검색 결과가 없으면 지번 주소로 추가 검색하여

결과를 파싱하여 필요한 정보를 뽑아 냅니다.  (  x좌표, y좌표 , 우편번호, 도로명주소, 지번주소 등 )

API 출력의 일부

 

서비스 기본 주소는 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는 이 함수를 그대로 사용하면 출력이 가능하고,

Excel 2019나 그 이전의 Excel은 배열을 출력하기 위해서는 vResult 배열을 적절히 처리해 주어야 합니다.

 

이제 1개 또는 여러개의 좌표 목록을 받았으므로 어떤 것을 선택하여 사용할 지 정하면 됩니다.

 

여기에 사용된 getURL 함수 함수는 아래를 참고하세요.

https://egtools.tistory.com/entry/VBA-Web-Scraping

 

VBA에서 Web 정보 가져오기 (Web Scraping)

Web Page에서 원하는 정보를 가져와서 재구성하거나 필요한 파일을 Web에서 다운로드 할 때, 또는 RESTful API를 이용하여 정보를 획득할 때 등등 Web에서 필요한 정보를 가져오기 하는 함수입니다. Web

egtools.tistory.com

 

delCDATA는 간단한 함수입니다.

Function delCDATA(ByVal text As String)
    delCDATA = Replace(Replace(text, "<![CDATA[", ""), "]]>", "")
End Function

 

 

728x90