我想从邮政地址获得一对坐标(经度,纬度)。
我正在Excel工作簿中编写VBA。我可以假设Google Earth已安装并注册为COM服务器。因此,我一直在寻找一种方法来使用Google Earth COM API来实现这一目标,但是我还没有找到任何东西。
我在网上找到的大多数点击都是针对网络程序员的,并且是关于使用JavaScript的“Google地理编码API”,我认为这对我的情况不可行。
(更新:这是作为数十个/数百个地址的批处理作业完成的。正如rjmunro指出的那样,它是私有的,因此违反了谷歌的使用条款,所以我不得不寻找不同的服务。)< / p>
答案 0 :(得分:2)
您为什么要使用Google地球?如果计算机不在线,它就无法进行地理编码,如果它在线,您也可以直接使用web apis。 lots of examples使用VBA访问网络上的地理编码apis,包括Google和其他提供商(Bing,Yahoo等)。
请注意,如果这是针对私人应用程序,而不是任何人可以下载的应用程序,则可能违反了Google的服务条款,您可能需要使用其他提供程序。请参阅Google常见问题解答中的this question。
答案 1 :(得分:0)
我实际上是在VBA中完成的,我会给你解决方案:
我使用谷歌地球API(参考:地球1.0类型库) 我首先获取地址信息(来自单元Tools.Range(rngGeocoderAddress))。我构建了点的KML数据并将其发送到谷歌地球(可能没有必要),然后我对地址信息执行搜索。这将触发谷歌开始缩放到结果位置。
在一个循环中,我定期监视谷歌地球以查看它是否仍在缩放到新位置的过程中。一旦它停止移动,我知道它已缩放到搜索结果,我可以使用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 代码记录最终的纬度/经度,用户点击记录(如果满意)。
我已经尝试循环代码以编程方式对许多位置进行地理编码。如果您将google earth的缩放速度配置为非常快(但不是瞬时)
,则效果最佳答案 2 :(得分:0)