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