1. 程式人生 > >LayaAir Geolocation 獲取地理位置

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 Inheritance 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(方法)

Geolocation()

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;
}