Геокодирование с помощью Google Планета Земля
-
19-09-2019 - |
Вопрос
Я хотел бы получить пару координат (долготу, широту) с почтового адреса.
Я кодирую 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 Введите адрес
Изображение 2 Нажмите Геокод, код ожидает остановки масштабирования
Изображение 3 Код записывает конечную широту / длину клика пользователя, если он удовлетворен.
Я пробовал зацикливать код для программного геокодирования многих местоположений.Это работает лучше всего, если вы настроите скорость масштабирования Google Планета Земля на такую же высокую (но не мгновенную).