国土地理院地図のwebを利用してkml形式のマークファイルを地図上に表示する事を考えています。
webを表示した時にマウス操作無しでkml形式のファイルを読み込みたいのです。
WebBrowser1.Navigate('https://maps.gsi.go.jp'); で地図表示は出来ているのですが kml形式のファイルを読み込む方法がわかりません。
WebBrowser1.ExecScript(xxxxx)で、javaScriptを記述して行うのでしょうか?
宜しくお願い致します。
環境:
Delphi2010
Windows8.1 pro
Harryl
Ú×ÅJÈàèªÆ¤´¢B
¦¸¢ÈºÌQp^[ŪAÇ¿çÌû@Åàkmlt@CðÇÝÝn}ãÉ\¦é±ÆªoÜB
> ¦ScriptStrÉ\bhSÌðdñŨÜB
> WebBrowser1.OleObject.document.parentWindow.execScript(ScriptStr);
>Êp^[ÆÄÍAÈºÌæ¤ÉÄàs¯éc©ÈHH
> ¦KMLFileTextÉkmlt@CÌgðAKMLFileNameÉt@CðüêĨÜB
>WebBrowser1.OleObject.document.parentWindow.GSI.GLOBALS.sakuzuList.loadFromText(KMLFileText, KMLFileName);
{É©èÜAèªÆ¤´¢ÜB
¡ãÆàX¨è¢vÜB
[Harryl]
JÅÚ×ÈàèªÆ¤´¢ÜB
¦¸ÜȺÌQp^[ŪAÇ¿çÌû@Åàukmlt@CvðÇÝñÅn}ãÉ\¦é±ÆªoÜB
¤ÅËBÅàexecScriptÍÈºÌæ¤È´¶Åg¢ÜB
¦ScriptStrÉ\bhSÌðdñŨÜB
WebBrowser1.OleObject.document.parentWindow.execScript(ScriptStr);
Êp^[ÆÄÍAÈºÌæ¤ÉÄàs¯éc©ÈHH
¦KMLFileTextÉkmlt@CÌgðAKMLFileNameÉt@CðüêĨÜB
WebBrowser1.OleObject.document.parentWindow.GSI.GLOBALS.sakuzuList.loadFromText(KMLFileText, KMLFileName);
{É©èÜAèªÆ¤´¢ÜB
¡ãÆàX¨è¢vÜB
Harryl
¦¸¢û@ÅÀ鱯ªoÜB
åÏ©èÜAèªÆ¤´¢ÜB
¡ãÆàX¨è¢vÜB
¦f¦ÂÉQñÙǨçÌÔðMĸ¢ÌŪ¶¯
@ÆÈÁÄÜ¢ÜBǤÄH...
Harryl
JÅÚ×ÈàèªÆ¤´¢ÜB
¦¸ÜȺÌQp^[ÆàAkmlt@CðÇÝñÅn}ãÉ\¦é±ÆªoÜB
¤ÅËBÅàexecScriptÍÈºÌæ¤È´¶Åg¢ÜB
¦ScriptStrÉ\bhSÌðdñŨÜB
WebBrowser1.OleObject.document.parentWindow.execScript(ScriptStr);
Êp^[ÆÄÍAÈºÌæ¤ÉÄàs¯éc©ÈHH
¦KMLFileTextÉkmlt@CÌgðAKMLFileNameÉt@CðüêĨÜB
WebBrowser1.OleObject.document.parentWindow.GSI.GLOBALS.sakuzuList.loadFromText(KMLFileText, KMLFileName);
åÏ©èÜAèªÆ¤´¢ÜB
¡ãÆàX¨è¢vÜB
ÜA¶¯Å©ê¢XbhÉÈÁÄÜ¢\óèÜñB
「TWebBrowserで表示中の地理院地図(電子国土Web)にkmlファイルを読み込ませ、地図上に図形を表示させる」
これを実際に地理院地図で行うと場合、右上にある[機能]→[ツール]→[作図・ファイル]で当該のモードレスダイアログを出し、
[ファイルから読み込み]ボタンを押して… (以下省略)
上記をDOM操作で置き換えれば…思ったんですが、途中でファイルオープンダイアログが出るためそこはDOM操作が不能、なのでボツ。
参考: 右上にある[機能]メニューを展開する
document.getElementsByClassName('leaflet-top leaflet-right')[0].getElementsByClassName('menu_btn')[0].click();
次に、「地図上にkmlファイルをドロップしても可」とのことなので、それを擬似的に(ドラッグ&ドロップのエミュレートを)
行えば良いのでは??とか思ったんですが、かなりのレア技術なのでハードル高過ぎでボツ。
---------------------------------------------------------------------------------------------------
仕方ないので、サイトのスクリプトのソース(https://github.com/gsi-cyberjapan/gsimaps にあります)を眺めて
みたところ、使えるメソッドを発見しました。これは行けるんじゃないかと思います。
GSI.GLOBALS.sakuzuList.loadFromText('《ここに、kmlファイルの中身を置く》', '《ファイル名》');
※ファイル名は「作図・ファイル」ダイアログ内でレイヤ名として使われるだけなので、実際と異なっていてもかまいません。
ファイルを直接読み込ませるのは File API とか大変そうなので、読み込みはDelphiで行い、その中身を文字列として送り込む戦略です。
参考: 以下を地理院地図上で(例えばFirefoxならスクラッチパッドなどを用いて)実行すると、図形が描画されます。
GSI.GLOBALS.sakuzuList.loadFromText('<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.opengis.net/kml/2.2"><Document><Style id="LineStyle1"> <LineStyle> <color>c90099ff</color> <width>10</width> </LineStyle></Style><Style id="PolyStyle2"> <IconStyle> <Icon> <href>https://maps.gsi.go.jp/portal/sys/v4/symbols/080.png</href> </Icon> <scale>2</scale> </IconStyle></Style><Placemark><styleUrl>#LineStyle1</styleUrl><LineString><coordinates>141.52587890625,34.92197103616377 145.96435546875,37.020098201368114 145.975341796875,32.685619853722 141.514892578125,34.58799745550482</coordinates></LineString></Placemark><Placemark><styleUrl>#PolyStyle2</styleUrl><Point><coordinates>141.317138671875,34.74161249883172</coordinates></Point></Placemark></Document></kml>', 'TestFile.kml');
---------------------------------------------------------------------------------------------------
…と、ここまで引っぱっておきながら、実際にDelphiで試してはいないです。。。。 今、動かせる環境が無いもので…スミマセン。
>WebBrowser1.ExecScript(xxxxx)で、javaScriptを記述して行うのでしょうか?
そうですね。でもexecScriptは以下のような感じで使います。
※ScriptStrにメソッド全体を仕込んでおきます。
WebBrowser1.OleObject.document.parentWindow.execScript(ScriptStr);
別パターンとしては、以下のようにしても行ける…かな??
※KMLFileTextにkmlファイルの中身を、KMLFileNameにファイル名を入れておきます。
WebBrowser1.OleObject.document.parentWindow.GSI.GLOBALS.sakuzuList.loadFromText(KMLFileText, KMLFileName);
以上、ご健闘をお祈りします。
かつさん、いろいろお疲れさまでした。(かつさんの投稿は解読させていただきました。)
>ご教示頂きました以下の2パターンとも、kmlファイルを読み込んで地図上に表示することが出来ました。
おお、それは良かったです。
後で気付いたんですが、execScript(ScriptStr); 版の場合はスクリプトコードとして渡す関係で、いくつかの配慮が
必要だと思うんです。それをクリアされたようで幸いです。
具体的には、以下のようなことです。
・ 改行を削除する (文字列リテラルの中に改行があるとまずいため。)
・ 必要に応じて文字列リテラル中の文字をエスケープ (クオーテーション等。XMLまたはJavascriptのエスケープを行う。)
このようなことを考えると、WebBrowser1.OleObject.document.parentWindow.GSI.… の、window直下にオブジェクトを
直付け指定してメソッドを起動する方法のほうが圧倒的に簡単ですね。
上記のような配慮も必要なく、スクリプトコードを組み立てる面倒も無く、生のデータをいきなりぶち込めますから。
もうひとつ気になったことがありまして、もしもTWebBrowserの起動直後にkmlファイルを読み込ませたい場合、
DocumentCompleteイベント内で行うと思うんですが、イベント発生直後ですとまだJavascript内でいろいろやっている
関係上、その時点ではloadFromTextメソッドが存在していない可能性があります。
なのでこのような場合は慎重にJavascriptのオブジェクト/メソッドの存在確認を行い、待機する必要があると思います。
真面目にJavascript側にコードを送って調べるのがスジですが、try 〜 except で投げやりに対処するのもアリかな??
そのうち、「真面目なコード例」を投稿したいな、と。
>文字化け等で見苦しいスレッドになってしまい申し訳ありません。
ドンマイです。ブラウザを変えて試してみたらいかがでしょうか。
この文字化け、過去に数回発生しているようです。管理人さんにメールしとこうかな。
ツイート | ![]() |