質問

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

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

Webで見つけたヒットのほとんどはWebプログラマー向けであり、JavaScriptである「Google Geocoding API」を使用することについてです。

(更新:これは、数十/数百の住所のバッチジョブとして行われることになっていました。Rjmunroが指摘したように、それはプライベートであり、したがってGoogle使用条件に反しているので、別のサービスを探す必要がありました。)

役に立ちましたか?

解決

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

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

他のヒント

私は開発しました この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 アドレスを入力しますenter image description here

画像2 Geocode]をクリックし、ズームが停止するのを待機しますenter image description here

画像3 コードは、最終的なLAT/LONGを記録します。ユーザーが満足している場合、ユーザーは記録をクリックします。enter image description here

プログラムで多くの場所をジオコードするためにコードをループしてみました。 Google Earthのズーム速度を非常に高速に構成する場合に最適に機能します(ただし、瞬時ではありません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top