自作アプリに Google Map を表示させる(Google Mapからの通知受け)

Google MapはJavaScript上で勝手に動いてくれてますので地図を移動されようが、拡大・縮小されようが表示するだけならアプリ側では何もケアする必要はありません。ただ、少しアプリで何かしようとすると「勝手に動いてくれる処理」が邪魔になったりします。その辺り、Google Map側も身勝手ではないのできっかけは用意してくれてます。今回は最も基本となりそうな中心座標をアプリで取得してみようと思います。

中心座標を取得する切っ掛けを Google Maps API から発行してもらいます。というのも、Google Mapをマウスで掴んで素早くスクロールさせ離した場合、マウスは離した状態なのにMapは惰性でスルスルと動いているというケースがあるのでWebBrowserコントロールのクリックイベントのみでは止まった位置を把握する事が難しいからです。

Mapの移動が終わった時に発生するイベントは 'idle' です。ただしこの時点ではMap画像の読み込みは必ずしも終わっているわけではなく、そっちを捕まえたい場合は 'tilesloaded' を使用すると良いかもです(使った事無い)。以下の様にJavaScriptに記述すると'idle'のイベントが発生した時にこの関数読んでね的な事ができます。

map.addListener('idle', gm_event_idle);


gm_event_idle()はJavaScript内の関数(にしておく)なのでそこから一気にWindowのFormの関数を呼び出す様にします。これには、JavaScriptとWebbrowserコントロールとFormの連携が必要になってきます。window.external と WebBrowser.ObjectForScriptingプロパティ と 実行関数ですね。code.jsファイルは埋め込みリソースにしてgmap.htmlにキーワードを入れていてそこへ置換機能を使って展開しています。前回実施したのと同じ方法です。

code.js
function initMap() {


map.addListener('idle', gm_event_idle);


}

function gm_event_idle(){
var latlng = map.getCenter();
var str = latlng.lat() + "," + latlng.lng();
window.external.GMEvent_idle(str);
};


Form1.cs
[System.Runtime.InteropServices.ComVisible(true)]
public partial class Form1 : Form
{
private void FormMain_Load(object sender, EventArgs e)
{


this.webBrowser1.ObjectForScripting = this;


}


public void GMEvent_idle(string message)
{
string[] center = message.Split(',');
SetTextLatLong(double.Parse(center[0]), double.Parse(center[1]));
}

private void SetTextLatLong(double latitude, double longitude)
{
double fractional = latitude;
int integer = (int)fractional;
fractional -= integer;
string stInt = string.Format("{0,3:##0}", integer);
string stFrac = string.Format("{0:.0#############}", Math.Abs(fractional));
string st = stInt + stFrac;
this.maskedTextBoxLatitude.Text = st; // 緯度


fractional = longitude;
integer = (int)fractional;
fractional -= integer;
stInt = string.Format("{0,3:##0}", integer);
stFrac = string.Format("{0:.0#############}", Math.Abs(fractional));
st = stInt + stFrac;
this.maskedTextBoxLongitude.Text = st; // 経度
}



}


WebBrowser.ObjectForScriptingプロパティに設定するオブジェクトはComVisible属性を持つ必要があります。なので、class Form1 の直前に属性定義を記載しています。SetTextLatLong()の所でmaskedTextBoxコントロールに対して値を表示する様に設定しています。小数点の位置を保ちたかったのと、小数点第2位以下は0なら空白にしたかったのでチョッと変な変換を噛ましてます。

ビルドして実行した結果がこちらの動画です。
位置が決まると画像を読み込む前に緯度・経度を表示しているのと、画像を読み込む前に緯度・経度を表示しているのが見て取れると思います。


スポンサーサイト



tag : windows

tag : map

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
04 | 2020/05 | 06
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ Linux RaspberryPi 三段化 6P43P-E 全段差動プッシュプル トランジスタ式ミニワッター 6P43P TRminiWatterPart4 MPD FON2405E イーサネットコンバータ OpenOCD DAC buildroot FM3ペリフェラル BeagleBoneBlack map windows Bluetooth ODROID-U2 library FM3評価ボード mingw OpenGL シングル bitbake KiCad 計測 プリアンプ Edison VMware FM4 ミニワッター 6N6P TL-WR700N 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter