Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Конечно, вы сами должны соблюдать требования Google.

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

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

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

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

Конечным результатом является то, что я использовал Google планета Земля для геокодирования адреса.

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 Нажмите Геокод, код ожидает остановки масштабирования enter image description here

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top