Google Earthを使用したジオコーディング
-
19-09-2019 - |
質問
郵便住所から一対の座標(経度、緯度)を取得したいと思います。
私はExcelワークブックでVBAをコーディングしています。 Google Earthがインストールされ、COMサーバーとして登録されていると仮定できます。したがって、私はこれを達成するためにGoogle Earth Com APIを使用する方法を探していましたが、何も見つけることができませんでした。
Webで見つけたヒットのほとんどはWebプログラマー向けであり、JavaScriptである「Google Geocoding API」を使用することについてです。
(更新:これは、数十/数百の住所のバッチジョブとして行われることになっていました。Rjmunroが指摘したように、それはプライベートであり、したがってGoogle使用条件に反しているので、別のサービスを探す必要がありました。)
他のヒント
私は開発しました このExcel Addin あなたの要求を行うために、あなたはそれが役に立つと思うかもしれません。
もちろん、GoogleのTOSを尊重するのはあなた次第です。
(Addinは、ドキュメントで指定されているように、Googleレートの制限を実施します)。
私は実際にこれをVBAでやった、私はあなたに私の解決策を与えます:
Google Earth API(参照:Earth 1.0 Type Library)を使用します。アドレス情報(Cell Tools.Range(rnggeocoderAddress)から)を取得することから始めます。ポイントのKMLデータを構築し、Google Earthに送信します(おそらく必要ありません)。その後、アドレス情報で検索を実行します。これにより、Googleが結果の位置をズームするようになります。
ループでは、Google Earthを定期的に監視して、それがまだ新しい場所にズームする過程にあるかどうかを確認します。動きが停止したら、検索結果にズームしたことがわかり、getpointOnterrainfromscreencoords(0,0)を使用してLatを長くキャプチャできます。
最終結果は、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
UIで動作する方法を示すスクリーンショットは次のとおりです。
画像1 アドレスを入力します
画像2 Geocode]をクリックし、ズームが停止するのを待機します
画像3 コードは、最終的なLAT/LONGを記録します。ユーザーが満足している場合、ユーザーは記録をクリックします。
プログラムで多くの場所をジオコードするためにコードをループしてみました。 Google Earthのズーム速度を非常に高速に構成する場合に最適に機能します(ただし、瞬時ではありません)