我实际上已经在 VBA 中做到了这一点,我会给你我的解决方案:
我使用 google earth API(参考:Earth 1.0 Type Library)我首先获取地址信息(来自单元格 Tools.Range(rngGeocoderAddress))。我为该点构建 KML 数据并将其发送到谷歌地球(可能没有必要),然后对地址信息执行搜索。这将触发谷歌开始缩放到结果位置。
在一个循环中,我会定期监控 google earth 以查看它是否仍在缩放到新位置的过程中。一旦它停止移动,我就知道它已经缩放到搜索结果,我可以使用 GetPointOnTerrainFromScreenCoords(0,0) 捕获 Lat Long
最终结果是我使用谷歌地球对地址进行地理编码。
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
下面是一些屏幕截图,展示了我如何使它与 UI 一起工作:
图 1输入地址

图 2单击地理编码,代码等待缩放停止

图 3代码记录最终的经纬度,用户点击记录是否满意。

我尝试循环代码以编程方式对许多位置进行地理编码。如果您将谷歌地球的缩放速度配置为非常快(但不是瞬时的),效果最好