VB.net2008上からWebBrowserコンポーネントを使って、VBとOpenStreetMapを連動する仕組みを作成する際に質問があります。


OpenStreetMapの地図をロードすると、そこには著作権表示とOpenStreetMapへのリンクが貼ってあります。
しかしVB内でWebブラウジングできると話がややこしくなるので、WebBrowserコンポーネント内はOpenStreetMapの表示のみ行いたいと考えています。

そこで、以下のどちらかの対処法についてご存じの方教えてください。

A.著作権表示をクリックすると新しくユーザが普段使っているブラウザ、もしくはIEが起動してOpenStreetMapのページを表示するようにする。
B.OpenStreetMapの地図には著作権表示を行うが、OpenStreetMapへのリンクは外して表示させる。

よろしくお願いいたします。

※なお、表示されているOpenStreetMapの著作権表示の上あたりに透明な何かを置いてクリックできないようにするという手は、最後の手段でとっておいているのでご遠慮ください。
※WindowsXPのSP2以降で使える手段でお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/04/23 21:27:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:HALSPECIAL No.2

回答回数407ベストアンサー獲得回数86

ポイント35pt

簡単にやるには、こんな感じでいかがでしょう。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'JSON形式のデータがこうで、
        '   {name:"OpenStreetMap",attribution:"Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>"
        '実際はこのようなタグで表示されています。
        '   <div unselectable="on" class="olControlAttribution olControlNoSelect" style="position: absolute; z-index: 1002;" id="OpenLayers.Control.Attribution_3">Data CC-By-SA by <a href="http://openstreetmap.org/">OpenStreetMap</a></div>
        Dim doc As HtmlDocument = WebBrowser1.Document
        Dim div As HtmlElement = doc.GetElementById("OpenLayers.Control.Attribution_3")
        'なので簡単な対応としては、このdivタグの中身を書き換えればOKです。
        div.InnerHtml = "Data CC-By-SA by OpenStreetMap"

    End Sub

なお、WebBrowser1_DocumentCompleted で実装するには、htmlがロードされ、JavaScriptの処理等がすべて済んだのを確認してから、上記のようにする必要があります。(工夫が必要?)

id:halohalolin

HALSPECIALさんありがとうございます。

ただページ遷移はボタンをクリックする時に発生するのではなく、OpenStreetMapに表示されるリンクをクリックすることで

発生するものなので、自分の中で引っかかっていました。

結局自分がとった方法は

1.ページ移動が発生するとWebBrowser.Navigatedイベントが発生することがわかったので、イベント処理関数を追加しました

2.イベント処理関数内では、OpenStreatMapへ誘導するブラウザの起動させ、WebBrowserを初期化するようにした

3.WebBrowser.Navigatedはページ遷移の際に2回発生するので、1度だけしか実行しないように一時的なロックをかける

という方法で解決しました。

HALSPECIALさん何度もアドバイスを提供して頂いてありがとうございました。

2010/04/23 21:26:50

その他の回答1件)

id:HALSPECIAL No.1

回答回数407ベストアンサー獲得回数86

ポイント35pt

以前にも回答したかと思うのですが、WebBrowserからDOMを操作することで対応できると思います。

DOM自体は、WebBrowser+VB でも JavaScriptでも変わらないと思いますので、

まず、OpenStreetMapのページをhtmlファイルとして、静的なファイルに保存し、

JavaScriptでリンクを無効にする等の操作を記述してみます。

それをVBに転記するように作業を進めてはいかがでしょうか?


著作権表示の部分だけでも、HTMLのタグを公開していただければ、私、もしくは他の回答者がコードとして回答しやすくなるのではないかと思います。

id:halohalolin

HALSPECIALさんありがとうございます。

OpenStreetMapから届いてくる時点で著作権表示へのリンクが埋め込まれているので、どうやって操作したら良いのかわからず投稿させていただきました。

そのOpenStreetMapをダウンロードしてくれる静的HTMLのソースについてですが、Easymapから「Create Map」タブをクリックし、一番下の「Download Map」ボタンをクリックすることでダウンロードできます。

http://osmtools.de/easymap/

このHTMLに加えて、右側にリンクされている「util.js」「map.css」を一緒にダウンロードしてきて同じフォルダに置くことで

利用することができます。

私の場合は、この3つのファイルをリソースに組み込んで、表示するときにはその都度書き出して対処しています。

よろしくお願いいたします。

2010/04/19 15:56:54
id:HALSPECIAL No.2

回答回数407ベストアンサー獲得回数86ここでベストアンサー

ポイント35pt

簡単にやるには、こんな感じでいかがでしょう。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'JSON形式のデータがこうで、
        '   {name:"OpenStreetMap",attribution:"Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>"
        '実際はこのようなタグで表示されています。
        '   <div unselectable="on" class="olControlAttribution olControlNoSelect" style="position: absolute; z-index: 1002;" id="OpenLayers.Control.Attribution_3">Data CC-By-SA by <a href="http://openstreetmap.org/">OpenStreetMap</a></div>
        Dim doc As HtmlDocument = WebBrowser1.Document
        Dim div As HtmlElement = doc.GetElementById("OpenLayers.Control.Attribution_3")
        'なので簡単な対応としては、このdivタグの中身を書き換えればOKです。
        div.InnerHtml = "Data CC-By-SA by OpenStreetMap"

    End Sub

なお、WebBrowser1_DocumentCompleted で実装するには、htmlがロードされ、JavaScriptの処理等がすべて済んだのを確認してから、上記のようにする必要があります。(工夫が必要?)

id:halohalolin

HALSPECIALさんありがとうございます。

ただページ遷移はボタンをクリックする時に発生するのではなく、OpenStreetMapに表示されるリンクをクリックすることで

発生するものなので、自分の中で引っかかっていました。

結局自分がとった方法は

1.ページ移動が発生するとWebBrowser.Navigatedイベントが発生することがわかったので、イベント処理関数を追加しました

2.イベント処理関数内では、OpenStreatMapへ誘導するブラウザの起動させ、WebBrowserを初期化するようにした

3.WebBrowser.Navigatedはページ遷移の際に2回発生するので、1度だけしか実行しないように一時的なロックをかける

という方法で解決しました。

HALSPECIALさん何度もアドバイスを提供して頂いてありがとうございました。

2010/04/23 21:26:50
  • id:halohalolin
    なお、WebBrowserコンポーネントを利用して表示するのは、下記の自動カスタマイズツールが書き出したHTMLデータです。

    Easymap - Create your own simple OSM-Map
    http://osmtools.de/easymap/

    VBはこの内容をリソースに持っており、OpenStreatMapへアクセスする際には、VBのデータに合わせて
    ファイルとして書き出し、その内容をWebBrowserコンポーネントが読み込んで
    OpenStreetMapへアクセスするようにしています。

    よろしくお願いいたします。
  • id:halohalolin
    なお、リソースに埋め込んでいるHTMLファイルに対して、何かうまくJavaScriptを入れることで対処出来る!というアイデアも有りです。よろしくお願いいたします。
  • id:HALSPECIAL
    HALSPECIAL 2010/04/23 21:50:53
    たぶん、上手伝わっておらず、すみせん。
    回答2は、OpenStreetMapに表示されるリンクを無効にする方法を紹介しました。
    Button1_Clickイベントに記述したのは便宜上、そうしただけです。
    実際には、回答2のリンクを無効にする処理を、
    OpenStreetMapがWebBrowserコンポーネントに表示され、JavaScriptの実行等が終わった段階で行うことになります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません