1

住所から一対の座標(経度、緯度)を取得したいと思います。

ExcelワークブックでVBAをコーディングしています。Google Earthがインストールされ、COMサーバーとして登録されていると推測できます。したがって、私はこれを達成するためにGoogle Earth COM APIを使用する方法を探していましたが、何も見つかりませんでした。

私がWebで見つけたヒットのほとんどは、Webプログラマー向けであり、JavaScriptである「GoogleジオコーディングAPI」を使用することに関するものですが、私の場合は実行不可能だと思います。

(更新:これは、数十/数百のアドレスのバッチジョブとして実行される予定でした。rjmunroが指摘したように、これは非公開であり、したがってGoogleの利用規約に違反しているため、別のサービスを探す必要がありました。)

4

3 に答える 3

2

Google Earth を使用する理由を教えてください。コンピューターがオンラインでない場合はジオコーディングできません。オンラインの場合は、Web API を直接使用することもできます。VBA を使用して Web 上のジオコーディング API にアクセスする例は、Google と他のプロバイダー (Bing、Yahoo など) の両方で多数あります。

これが、誰でもダウンロードできるアプリケーションではなく、プライベート アプリケーション用である場合は、Google の利用規約に違反している可能性があり、別のプロバイダーを使用する必要がある場合があります。Google の FAQ でこの質問を参照してください。

于 2009-11-12T11:08:45.463 に答える
0

私は実際にVBAでこれを行ったので、私の解決策を紹介します:

Google Earth API を使用します (参照: 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

UI でどのように動作させるかを示すスクリーンショットを次に示します。

画像 1住所を入力 ここに画像の説明を入力

画像 2 [ジオコード] をクリックすると、コードはズームが停止するまで待機します ここに画像の説明を入力

画像 3コードは、最終的な緯度/経度、ユーザー クリックの記録を記録します。 ここに画像の説明を入力

コードをループして、プログラムで多くの場所をジオコーディングしようとしました。Google Earth のズーム速度を非常に高速 (ただし、瞬間的ではない) に設定すると、最適に機能します。

于 2010-12-03T17:14:20.783 に答える
0

私はこの Excel アドインを開発して、あなたの要求を実行しました。役に立つかもしれません。

もちろん、Google の TOS を尊重するかどうかはあなた次第です。

(アドインは、ドキュメントで指定されているように、Google のレート制限を適用します)。

于 2011-01-05T13:18:18.963 に答える