Created
October 9, 2012 23:30
-
-
Save mogya/3862146 to your computer and use it in GitHub Desktop.
電源コンパス
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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