Геокодирование с использованием Google Earth - PullRequest
1 голос
/ 12 ноября 2009

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

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

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

0 голосов
/ 05 января 2011

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

Конечно, вы должны уважать Условия использования Google.

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

0 голосов
/ 03 декабря 2010

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

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

В цикле я периодически отслеживаю Google Планета Земля, чтобы увидеть, находится ли он в процессе масштабирования до нового местоположения. Как только он перестал двигаться, я знаю, что он увеличился до результата поиска, и я могу захватить Lat Long, используя 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 Введите адрес enter image description here

Изображение 2 Нажмите Geocode, код ожидает, чтобы масштабирование прекратилось enter image description here

Изображение 3 Код записывает окончательный лат / долг, пользователь нажимает запись, если они удовлетворены. enter image description here

Я попытался зациклить код для программного геокодирования многих мест. Лучше всего, если вы настроите скорость масштабирования Google Планета Земля как достаточно быструю (но не мгновенную)

...