Skip to content

Instantly share code, notes, and snippets.

@mogya
Created October 9, 2012 23:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mogya/3862146 to your computer and use it in GitHub Desktop.
Save mogya/3862146 to your computer and use it in GitHub Desktop.
電源コンパス
Titanium.UI.setBackgroundColor('#000');
var win1 = Titanium.UI.createWindow({
title:'電源コンパス',
backgroundColor:'#fff'
});
var compass = Ti.UI.createImageView({
image:'/arrow.png',
width:Ti.UI.SIZE,
height:Ti.UI.SIZE,
// top:5,
// left:5
});
var compass_bg = Ti.UI.createView({
backgroundColor:'White',
width:50,
height:50,
borderWidth:1,
borderColor:'Black',
borderRadius:25,
// top:5,left:5
});
// 緯度経度で二点を指定して角度を計算して取得する
// thanks: http://www.logical-arts.jp/wp-content/uploads/distance_and_azimuth.js
var A = 6378137; // 地球の赤道半径
var RAD = Math.PI / 180; // 1°あたりのラジアン
function azimuth(lat1, lon1, lat2, lon2) {
lat1 *= RAD;
lon1 *= RAD;
lat2 *= RAD;
lon2 *= RAD;
var lat_c = (lat1 + lat2) / 2; // 緯度の中心値
var dx = A * (lon2 - lon1) * Math.cos(lat_c);
var dy = A * (lat2 - lat1);
if (dx == 0 && dy == 0) {
return 0; // dx, dyともに0のときは強制的に0とする。
}
else {
return Math.atan2(dy, dx) / RAD; // 結果は度単位で返す
}
}
var cur_pos = {};
var cafe_pos = {};
var cafe_degree = null;
// モバイラーズオアシスAPIで最寄り電源カフェ情報を取得
var get_near_cafe = function(cur_pos,onSuccess,onError){
var url = 'http://oasis.mogya.com/api/v0/search?n=%f&s=%f&w=%f&e=%f&lat=%f&lng=%f';
url = String.format(url,
cur_pos.lat+0.01,
cur_pos.lat-0.01,
cur_pos.lng-0.01,
cur_pos.lng+0.01,
cur_pos.lat,
cur_pos.lng
);
var xhr = Titanium.Network.createHTTPClient();
xhr.open( 'GET', url );
Ti.API.info( '>>> Geocoder URL: ' + url );
xhr.onload = function() {
Ti.API.info( 'responce' );
var json = JSON.parse(xhr.responseText);
if( 'OK'===json.status && json.results[ 0 ] ) {
Ti.API.debug('success');
onSuccess(json.results[0]);
}else{
onError(json.message);
}
};
xhr.onerror = function(error){
if(onError){onError( 'xhr error : '+error )}
};
xhr.send();
}
// コンパス情報取得時のイベントハンドラ
var update_compass = function(e){
// Ti.API.info('update_compass');
if(e.error){
Ti.API.info(e);
return;
}
if (cafe_degree){
var magnetic_heading = e.heading.magneticHeading;
var rotate = Ti.UI.create2DMatrix();
var angle = 360 + magnetic_heading-cafe_degree;
rotate = rotate.rotate(angle);
compass.transform = rotate;
}
};
// 位置情報取得時のイベントハンドラ
var update_pos = function(e){
if(!cur_pos){ cur_pos = {}; }
cur_pos.lat = e.coords.latitude;
cur_pos.lng = e.coords.longitude;
//リクルートMTLラボ(地下はGPSがうまく取れないのでズルをするw)
// cur_pos.lat = 35.67085290;
// cur_pos.lng = 139.76053150;
Ti.API.debug( String.format('update_pos:%.3f,%.3f',cur_pos.lat,cur_pos.lng) );
get_near_cafe(cur_pos,
function(cafe){
Ti.API.debug('success to get nearest cafe:'+cafe.title);
cafe_pos.lat = parseFloat(cafe.latitude);
cafe_pos.lng = parseFloat(cafe.longitude);
cafe_degree = azimuth(cur_pos.lat,cur_pos.lng,cafe_pos.lat,cafe_pos.lng);
Ti.API.debug( String.format('cafe_degree:%.3f',cafe_degree) );
},
function(e){
Ti.API.error(e);
}
);
};
Ti.Geolocation.headingFilter = 90;
Ti.Geolocation.getCurrentHeading(function(e){
update_compass(e);
});
Ti.Geolocation.getCurrentPosition(function(e){
update_pos(e);
});
Ti.Geolocation.addEventListener('heading', function(e){
update_compass(e);
});
Ti.Geolocation.addEventListener('location', function(e){
update_pos(e);
});
win1.add(compass_bg);
win1.add(compass);
win1.open();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment