使用Cloudpebble和PebbleJs访问GPS /位置数据

时间:2015-08-15 14:17:16

标签: gps location pebble-watch cloudpebble pebble-js

尝试通过编写一个简单的脚本在我的卵石上显示我当前的GPS位置(参见下面的代码)。

一切正常,但我无法访问GPS值。

代码构建于pebbles own geolocation example

我的问题是我只能在功能 locationSuccess()中获取GPS数据。

如何在该功能之外访问GPS数据(即 myLat myLong 的值)?我想把GPS数据放到这一行:

text : 'GPS:\n',

我正在使用CloudPebble和Pebble.js

代码:

var UI = require('ui');
var Vector2 = require('vector2');

var locationOptions = {
  enableHighAccuracy: true, 
  maximumAge: 10000, 
  timeout: 10000
};


// Get the location
function locationSuccess(pos) {
    console.log('\n****** START ******\nhere I am:\nlat= ' + pos.coords.latitude + ' lon= ' + pos.coords.longitude + '\n'); // Just to se that it works fine
    var myLat = pos.coords.latitude;
    var myLong = pos.coords.longitude;
    console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END  02 ******\n'); // This does also work fine
}   
function locationError(err) {
  console.log('location error (' + err.code + '): ' + err.message);
}

// Make an asynchronous request
navigator.geolocation.getCurrentPosition(locationSuccess, locationError, locationOptions);


// Create a text object 
var infotext = new UI.Text(
{
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
    text : 'GPS:\n',
  font: 'Gothic 28',
  color: 'white',
  textAlign: 'center'   
});

// Create and show the location (vars x and y are empty - why?)
var infowindow = new UI.Window();
infowindow.add(infotext);
infowindow.show(); 

1 个答案:

答案 0 :(得分:2)

由于我无法在您的帖子中添加评论,我将编辑我的第一个答案。对不起我的第一个答案中的错误,我对地理位置功能不太熟悉。

您在结束02 时未收到任何回复,因为功能locationSuccess()尚未运行,因此没有为myLat和{{1}分配任何值}。

您在结束03 时未收到回复的原因是因为函数myLong异步工作。当您的下一个navigator.geolocation.getCurrentPosition()执行时,它尚未完成运行,因此您的变量值仍未设置。

我建议将使用地理位置的代码包装到console.log函数中,因为无论如何,此成功函数是该类型代码的预期区域。

我所做的改变:

通过将成功代码移动到成功函数中,您不再需要初始化纬度和经度变量,因此我从下面的代码中删除了这些变量。我还修改了原始GPS窗口文本locationSuccess以显示:“正在加载GPS数据......”。这样infotext会立即加载,并在infowindow在后​​台运行时显示加载屏幕。

一旦找到当前位置,它将运行成功功能。我在此功能的末尾添加了一行,以更新GPS窗口中的文本以显示纬度和经度。我还在错误函数中添加了一个类似的行,让用户知道出错了什么。您无需再次致电navigator.geolocation.getCurrentPositioninfowindow.add(infotext);,即可在屏幕上更新文字。我还在信息窗口/文本的创建之下移动infowindow.show();,以便成功/错误函数在创建文本UI之前不能尝试更新文本。

更新代码:

navigator.geolocation.getCurrentPosition

/编辑

原始答案:

变量var UI = require('ui'); var Vector2 = require('vector2'); var locationOptions = { enableHighAccuracy: true, maximumAge: 10000, timeout: 10000 }; // Get the location function locationSuccess(pos) { console.log('\n****** START ******\nhere I am:\nlat= ' + pos.coords.latitude + ' lon= ' + pos.coords.longitude + '\n'); // Just to se that it works fine var myLat = pos.coords.latitude; var myLong = pos.coords.longitude; console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 01 ******\n'); // This does work fine //modify the text within infotext to show GPS data infotext.text('GPS:\n' + myLat + '\n' + myLong); } function locationError(err) { console.log('location error (' + err.code + '): ' + err.message); //modify the text within infotext to alert user of error infotext.text('Error Loading GPS Data!'); } console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 02 ******\n'); // Create a text object var infotext = new UI.Text( { position: new Vector2(0, 0), size: new Vector2(144, 168), text : 'Retrieving GPS Data...', font: 'Gothic 28', color: 'white', textAlign: 'center' }); // Create and show the location (vars x and y are empty - why?) var infowindow = new UI.Window(); infowindow.add(infotext); infowindow.show(); // Make an asynchronous request navigator.geolocation.getCurrentPosition(locationSuccess, locationError,locationOptions); console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 03 ******\n'); myLat是函数myLong中的局部变量。要解决此问题,您必须更改已定义locationSuccessmyLat范围

在下面的示例中,我定义了变量 global ,以便所有脚本和函数都可以引用它们。

myLong

有关变量范围的更多信息,this是一个很好的参考。