LayaAir Geolocation 獲取地理位置
Geolocation
1、如果裝置支援 Geolocation(地理定位),並且所使用的瀏覽器支援,就可以使用 Geolocation 獲取裝置的當前地理位置。可以開啟網頁http://caniuse.com/#search=geolocation 檢視有哪些瀏覽器版本支援Geolocation。
2、LayaAir 的 Geolocation 是對 《HTML5 Geolocation(地理定位)》的封裝,同理實際中支援在移動裝置上使用,在 PC 端基本獲取不到資料。
3、使用靜態方法 Geolocation.getCurrentPosition() 獲取當前的位置,getCurrentPosition() 只觸發一次,其中支援兩個回撥函式,分別是獲取位置資訊成功時,以及獲取位置資訊失敗時。
4、getCurrentPosition 獲取當前的位置成功時,回撥函式返回 GeolocationInfo 物件,包含以下資訊:
latitude —— 緯度(度)。
longitude —— 經度(度)。
altitude —— 相對於海平面的海拔高度(米)。如果裝置不提供海拔資料,altitude 的值為null。
accuracy —— 返回經緯度的精度,以米為單位。
altitudeAccuracy —— 返回海拔的精度,以米為單位。altitudeAccuracy 可能為null。
heading —— 返回裝置的移動方向(角度),指示距離北方的角度。0度表示指向正北方,方向以順時針旋轉(這表示東方是90度,西方是270度)。如果speed是0,heading會是NaN。如果裝置無法提供heading資訊,值為null。
speed —— 返回裝置每秒的移動速度(米)。speed可能為null。
timestamp —— 獲取資訊的時間戳。
Package | laya.device.geolocation |
類 | public class Geolocation |
Inheritance | Geolocation Object |
Property(屬性) |
---|
enableHighAccuracy : Boolean = false [static] 如果enableHighAccuracy為true,並且裝置能夠提供一個更精確的位置,則會獲取最佳可能的結果。 請注意,這可能會導致較慢的響應時間或增加電量消耗(如使用GPS)。 另一方面,如果設定為false,將會得到更快速的響應和更少的電量消耗。 預設值為false。 |
maximumAge : Number = 0 [static] 表示可被返回的快取位置資訊的最大時限。 如果設定為0,意味著裝置不使用快取位置,並且嘗試獲取實時位置。 如果設定為Infinity,裝置必須返回快取位置而無論其時限。 |
supported : Boolean [static] 是否支援。 |
timeout : Number = 1E10 [static] 表示允許裝置獲取位置的最長時間。預設為Infinity,意味著getCurentPosition()直到位置可用時才會返回資訊。 |
Method(方法) |
---|
clearWatch(id:int):void [static] 移除watchPosition安裝的指定處理器。 |
getCurrentPosition(onSuccess:Handler, onError:Handler = null):void [static] 獲取裝置當前位置。 |
watchPosition(onSuccess:Handler, onError:Handler):int [static] 監視裝置當前位置。回撥處理器在裝置位置改變時被執行。 |
Constant(常量) |
---|
PERMISSION_DENIED : int = 1 [static] 由於許可權被拒絕造成的地理資訊獲取失敗。 |
POSITION_UNAVAILABLE : int = 2 [static] 由於內部位置源返回了內部錯誤導致地理資訊獲取失敗。 |
TIMEOUT : int = 3 [static] 資訊獲取所用時長超出timeout所設定時長。 |
應用示例
特別提醒:使用 Geolocation 地理定位時,必須匯入 core | webgl | device | BaiduMap/bdmini 等 js 庫。
獲取當前定位
//使用Geolocation地理定位時,必須匯入 loadLib("libs/laya.bdmini.js"); 地相簿
//初始化引擎
Laya.init(1280, 1200,Laya.WebGL);
//建立一個文字物件,用於顯示手機旋轉時的陀螺儀資料
let infoText = new Laya.Text();
infoText.fontSize = 70;//字型大小70px
infoText.color = "#FFFFFF";//字型顏色白色
infoText.borderColor = "#f00";//文字元件邊框顏色為紅色
infoText.wordWrap = true;
//設定文字元件的大小等於整個舞臺大小
infoText.size(Laya.stage.width, Laya.stage.height);
Laya.stage.addChild(infoText);//將文字新增到舞臺
// 嘗試獲取當前位置
Laya.Geolocation.getCurrentPosition(Laya.Handler.create(this, onSuccess), Laya.Handler.create(this, onError));
// 成功獲取位置後觸發
function onSuccess(position){
var text = '經緯度:(' + position.longitude + '°,' + position.latitude + '°),\r\n精度:'+position.accuracy + 'm';
if(position.altitude != null){
text += "\r\n海拔:"+ position.altitude + 'm' + (position.altitudeAccuracy != null ? (',精度:' + position.altitudeAccuracy + 'm') : '');
}
if(position.heading != null && !isNaN(position.heading)){
text += '\r\n方向:' + position.heading + "°";
}
if(position.speed != null && !isNaN(position.speed)){
text += '速度:' + position.speed + "m/s";
}
infoText.text = text;
}
// 獲取位置失敗後觸發
function onError(err){
var errType;
if (err.code = Geolocation.PERMISSION_DENIED){
errType = "Permission Denied";
} else if (err.code == Geolocation.POSITION_UNAVAILABLE){
errType = "Position Unavailable";
} else if (err.code == Geolocation.TIMEOUT){
errType = "Time Out";
}
infoText.text = 'ERROR(' + errType + '): ' + err.message;
}