Геокодирование с помощью Google Earth

Я хотел бы получить пару координат (долгота, широта) с почтового адреса.

Я кодирую VBA в книге Excel. Я могу предположить, что Google Earth установлен и зарегистрирован как COM-сервер. Таким образом, я искал способ использовать Google Earth COM API для достижения этой цели, однако мне ничего не удалось найти.

Большинство хитов, которые я нашел в Интернете, предназначены для веб-программистов и касаются использования «API геокодирования Google», который представляет собой JavaScript, что, я думаю, неприемлемо для моего случая.

(Обновление: это должно было быть выполнено как пакетное задание для десятков/сотен адресов. Как указал rjmunro, это конфиденциально и, следовательно, противоречит условиям использования Google, поэтому мне пришлось искать другой сервис.)


person chiccodoro    schedule 12.11.2009    source источник


Ответы (3)


Почему вы хотите использовать Google Планета Земля? Он не может геокодировать, если компьютер не в сети, а если он в сети, вы также можете напрямую использовать веб-API. Существует множество примеров использования VBA для доступа к API геокодирования в Интернете, как с Google, так и с другими провайдерами (Bing, Yahoo и др.).

Обратите внимание, что если это для частного приложения, а не для того, которое может загрузить любой, это может противоречить условиям обслуживания Google, и вам может потребоваться использовать другого поставщика. См. этот вопрос в часто задаваемых вопросах Google.

person rjmunro    schedule 12.11.2009

Я разработал эту надстройку Excel, чтобы выполнить ваш запрос, она может оказаться вам полезной.

Конечно, вы должны соблюдать TOS Google.

(Надстройка применяет ограничения скорости Google, как указано в их документации).

person smirkingman    schedule 05.01.2011

Я действительно сделал это в VBA, я дам вам свое решение:

Я использую API Google Earth (ссылка: библиотека типов Earth 1.0). Я начинаю с получения информации об адресе (из ячейки Tools.Range(rngGeocoderAddress)). Я создаю данные KML для точки и отправляю их в Google Earth (вероятно, это не обязательно), затем я выполняю поиск по адресной информации. Это заставит Google начать масштабирование до полученного местоположения.

В цикле я периодически отслеживаю Google Earth, чтобы увидеть, находится ли он все еще в процессе масштабирования в новое место. Как только он перестанет двигаться, я знаю, что он приблизился к результату поиска, и я могу зафиксировать широту и долготу, используя GetPointOnTerrainFromScreenCoords(0,0)

Конечным результатом является то, что я использовал 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

Вот несколько снимков экрана, показывающих, как я заставил его работать с пользовательским интерфейсом:

Изображение 1 Введите адрес введите здесь описание изображения

Изображение 2 Нажмите "Геокодирование", код ожидает остановки масштабирования введите здесь описание изображения

Изображение 3 Код записывает окончательную широту/долготу, пользователь нажимает запись, если он удовлетворен. введите здесь описание изображения

Я попытался зациклить код для программного геокодирования многих местоположений. Это работает лучше всего, если вы настроите скорость масштабирования Google Earth так, чтобы она была довольно быстрой (но не мгновенной).

person Alain    schedule 03.12.2010
comment
Спасибо, Ален. Я обновил свой вопрос. К сожалению, это все еще противоречит условиям использования, как указал rjmunro. Кроме того, мне нужно было это для пакетного задания, поэтому ждать, пока Google Планета Земля изменит масштаб для каждой отдельной записи, для меня не вариант. В любом случае это правда, что если вам нужно подключение к Интернету, гораздо разумнее использовать веб-службу напрямую. - person chiccodoro; 06.12.2010