f8g

JSActionsでGPSから座標を取得してGoogleMapsに反映

Tombloo + JSActionsでWSHを実行するコードは下ページからのコピペです。凄い簡単にFirefoxからWSHが使える。
http://d.hatena.ne.jp/brazil/20090102/1230876349

GPSからデータを取得する

GPSからデータを取得するのに自作コンポーネントを使ってますが、MSCommを使ったりとか、そもそもWSHを使わないとか、色々方法はありますんでその辺は適当に。
自作コンポーネントはこんなの: http://d.hatena.ne.jp/arikui/20071212/1197453931

GoogleMapsを用意する

window.map = new GMap2(document.getElementById("map"));

みたいに、外からGoogleMapsのAPIが使えるやつ。

コード

JSActionsのコードからwindow.mapを参照できなかったので、javascriptスキームで座標を指定してます。

var T = Components.classes['@brasil.to/tombloo-service;1'].getService().wrappedJSObject;

(function(times){
	var data = "";
	var count = 1;

	var timer = setInterval(function(){
		data += getGpsData();

		var coord = getCoordinates();

		if(coord)
			window.location.href = "javascript:window.map.setCenter(new GLatLng("+coord+"));void(0);"

		if(++count > times)
			clearInterval(timer);
	}, 1000);

	function getCoordinates(){
		var _data = data.split("\n");
		var match = null;

		while(_data.length){
			if(match = /\$GPGGA.{12}(.{9}).{3}(.{10})/.exec(_data.pop())){
				data = _data.join("\n");

				var coord = [
					parseInt(match[1].substr(0, 2), 10) + match[1].substr(2) / 60,
					parseInt(match[2].substr(0, 3), 10) + match[2].substr(3) / 60,
				];

				if(coord[0] && coord[1])
					return coord;
				else
					return null;
			}
		}

		return null;
	}
})(5);

function getGpsData(){
	return executeWSH(function(){
		var gps = WSH.CreateObject("CommPort.Comm");

		gps.port = 23;
		gps.BaudRate = 4800;
		gps.Open();

		var s = gps.Input();

		WSH.Sleep(1000);

		s += gps.Input();

		gps.Close();

		return s;
	});
}

// http://d.hatena.ne.jp/brazil/20090102/1230876349
function executeWSH(func, args){
  args = args || [];
  
  with(T){
    var bat = getTempFile('bat');
    var script = getTempFile();
    var out = new LocalFile(script.path + '.out');
    
    putContents(bat, [
      'cscript //E:JScript //Nologo', 
      script.path.quote(), 
      '>', 
      out.path.quote()].join(' '));
    putContents(script, 
      args.map(function(a, i){return 'var ARG_' + i + ' = ' + uneval(a) + ';'}).join('\n') + 
      'WScript.echo(' + func.toSource() + '(' + 
      args.map(function(a, i){return 'ARG_' + i}).join(',') + 
      '));');
    
    new Process(bat).run(true, [], 0);
    
    var res = getContents(out).replace(/\s+$/, '');
    
    bat.remove(false);
    script.remove(false);
    out.remove(false);
    
    return res;
  }
}