Я действительно сделал это в 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 Введите адрес ![введите здесь описание изображения](https://i.stack.imgur.com/JncwW.png)
Изображение 2 Нажмите "Геокодирование", код ожидает остановки масштабирования ![введите здесь описание изображения](https://i.stack.imgur.com/gJiEd.png)
Изображение 3 Код записывает окончательную широту/долготу, пользователь нажимает запись, если он удовлетворен. ![введите здесь описание изображения](https://i.stack.imgur.com/FPmky.png)
Я попытался зациклить код для программного геокодирования многих местоположений. Это работает лучше всего, если вы настроите скорость масштабирования Google Earth так, чтобы она была довольно быстрой (но не мгновенной).
person
Alain
schedule
03.12.2010