문제

우편 주소에서 한 쌍의 좌표 (경도, 위도)를 얻고 싶습니다.

Excel 통합 문서에서 VBA를 코딩하고 있습니다. Google 어스가 COM 서버로 설치 및 등록되었다고 가정 할 수 있습니다. 따라서 Google Earth Com API를 사용하여이를 달성하는 방법을 찾고 있지만 아무것도 찾지 못했습니다.

웹에서 찾은 대부분의 히트는 웹 프로그래머를위한 것이며 JavaScript 인 "Google Geocoding API"를 사용하는 것입니다.

(업데이트 : 이것은 수십/수백 개의 주소를위한 배치 작업으로 수행되어야했습니다. RJMunro가 지적했듯이 비공개이므로 Google 이용 약관에 반대하므로 다른 서비스를 찾아야했습니다.)

도움이 되었습니까?

해결책

Google 어스를 사용하고 싶은 이유는 무엇입니까? 컴퓨터가 온라인 상태가 아닌 경우 지오 코드 할 수 없으며 온라인 상태 인 경우 웹 API를 직접 사용할 수도 있습니다. 거기 있습니다 많은 예 VBA를 사용하여 Google 및 다른 제공 업체 (Bing, Yahoo 등)와 함께 웹에서 Geocoding API에 액세스하는 것.

이것이 누구나 다운로드 할 수있는 개인 애플리케이션이 아닌 개인 애플리케이션이라면 Google 서비스 약관에 위배 될 수 있으며 다른 제공 업체를 사용해야 할 수도 있습니다. 보다 이 질문 Google의 FAQ에서.

다른 팁

나는 개발했다 이 Excel Addin 귀하의 요청을 수행하려면 유용 할 수 있습니다.

물론 Google의 TOS를 존중하는 것은 당신에게 달려 있습니다.

(AddIn은 문서에 지정된대로 Google 요금 제한을 시행합니다).

실제로 VBA 에서이 작업을 수행했는데 솔루션을 제공하겠습니다.

Google Earth API를 사용합니다 (참조 : Earth 1.0 유형 라이브러리) 주소 정보를 가져 오는 것으로 시작합니다 (Cell Tools.Range (RNGGEOCODERADDRESS)). 요점에 대한 KML 데이터를 구성하고 Google 어스로 보내고 (필요하지 않을 수도 있음) 주소 정보에 대한 검색을 실행합니다. 이렇게하면 Google이 결과 위치를 확대하기 시작합니다.

루프에서, 나는 정기적으로 Google 어스를 모니터링하여 새로운 위치로 확대하는 과정에 있는지 확인합니다. 일단 이동이 중단되면 검색 결과로 확대되었음을 알고 있으며 GetPointonterRainfromsCreenCoords (0,0)를 사용하여 LAT Long을 캡처 할 수 있습니다.

최종 결과는 Google Earth를 사용하여 주소를 지오 코딩했습니다.

Public Sub LookUpAddress_Click()
    Dim GEI As ApplicationGE
    Dim PointOnTerrain As PointOnTerrainGE
    Dim Search As SearchControllerGE
    Dim KMLData As String
    Dim row As Long

    'Get the row of the location selected to look up'
    With ddGeocoderID()
        If .listCount <= 1 Then Exit Sub
        row = .ListIndex + 1
    End With

    Set GEI = GEInit()
    If GEI Is Nothing Then Exit Sub

    KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
            "<kml xmlns=""http://www.opengis.net/kml/2.2"">" & _
            "<Placemark>" & _
                "<name>" & ddGeocoderID().List(ddGeocoderID().ListIndex) & "</name>" & _
                "<visibility>1</visibility>" & _
                "<open>1</open>" & _
                "<description>" & "<![CDATA[" & Tools.Range(rngGeocoderDescription) & "]]></description>" & _
                "<address>" & Tools.Range(rngGeocoderAddress) & "</address>" & _
            "</Placemark>" & _
            "</kml>"
    GEI.LoadKmlData KMLData

    Set Search = GEI.SearchController()
    Call Search.Search(Tools.Range(rngGeocoderAddress))
    Dim resul As Variant
    Set resul = Search.GetResults()
    Dim lat As Double, lon As Double, prevlat As Double, prevlon As Double, checkChange As Double
    Dim steady As Boolean
    steady = False: checkChange = -1
    lat = 0: lon = 0: prevlat = -1: prevlon = -1
    While Not steady
        Set PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        lat = PointOnTerrain.Latitude
        lon = PointOnTerrain.Longitude
        lblGeoedLat().Caption = sigFigs(lat, 8)
        lblGeoedLong().Caption = sigFigs(lon, 8)
        DoEvents
        If (checkChange = 100) Then
            If (lat = prevlat And lon = prevlon) Then steady = True
            prevlat = lat: prevlon = lon
            checkChange = -1
        End If
        checkChange = checkChange + 1
        Sleep 10
    Wend
End Sub

다음은 UI와 함께 작동하는 방법을 보여주는 스크린 샷입니다.

이미지 1 주소를 입력하십시오enter image description here

이미지 2 지오 코드를 클릭하고 코드는 축소가 중지되기를 기다립니다enter image description here

이미지 3 코드는 최종 LAT/Long, 사용자가 만족하면 레코드를 클릭합니다.enter image description here

많은 위치를 프로그래밍 방식으로 지오 코드로 코드를 루핑하려고 시도했습니다. Google 어스의 줌 속도를 매우 빠르게 (그러나 즉각적이지는 않음) 구성하는 경우 가장 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top