0

我正在尝试通过 Websockets 实现 Google 地球控制器。

我在 c# 中有一个简单的 echo websockets 服务器,当我在文本框中键入一个值时,它只会将其发送回页面(我计划稍后能够直接从服务器发送数据)。

我初始化谷歌地球的脚本非常标准并且有效:

    <script type="text/javascript">

google.load("earth", "1");

function init() {
  google.earth.createInstance('map3d', initCallback, failureCallback);
  StartServer();
}

function initCallback(instance) {
  ge = instance;
  ge.getWindow().setVisibility(true);

  // add a navigation control
  ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);

  // add some layers
  ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);
  ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);
}

function failureCallback(errorCode) 
{

}
</script>

(ge 变量)只是谷歌地球实例。

现在在我的服务器代码中,如果我这样做:

            ws.onmessage = function (evt) 
        {
            inc.innerHTML += evt.data + '<br/>';
            var lookAt =              ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
            lookAt.setLatitude(lookAt.getLatitude() + 10);
            lookAt.setLongitude(lookAt.getLongitude() + 20);
            ge.getView().setAbstractView(lookAt);
        };

一切正常(地球旋转一点点)。

现在,如果我这样做:

            ws.onmessage = function (evt) 
        {
            inc.innerHTML += evt.data + '<br/>';
            var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
            lookAt.setLatitude(lookAt.getLatitude() + evt.data); //Here i try to use the data received
            lookAt.setLongitude(lookAt.getLongitude() + 20);
            ge.getView().setAbstractView(lookAt);
        };

我得到异常:在 NPObject 上调用方法时出错

我试图拆分字符串,转换为数字,但总是得到同样的错误。

inc.innerHTML += evt.data + '<br/>';

总是有效。

编辑:

我也试过: var i = parseInt(d); //有效,但是当我调用 l lookAt.setLatitude(i); //例外

任何帮助表示赞赏

4

3 回答 3

1

尝试用 替换evt.data(+evt.data)一元加号运算符将值强制为数字。

我不知道 Google 地球 API,但如果 getLongitude 出于某种奇怪的原因返回了一个字符串,那么这可能会产生您在那里看到的行为(字符串 + 数字是一个数字,但字符串 + 字符串是一个字符串)。

于 2012-11-29T21:17:54.783 回答
0

好的排序,非常愚蠢的事情,服务器正在发送额外的字符。

在解析时出现这种通用错误感觉有点糟糕,像“字符串格式无效”这样的东西会更有意义。

于 2012-12-01T17:53:19.487 回答
0

我遇到了完全相同的问题,结果证明纬度/经度值太精确了,所以我这样做是为了将其转换为最大 6 位十进制精度等效值:

function Blah(lat, lon) {
    //because the GPS is ridiculously accurate and 
    //google earth is not, we need to round to six decimals at most
    lat = Math.round(lat * 1000000) / 1000000;
    lon = Math.round(lon * 1000000) / 1000000;
于 2014-04-16T10:50:16.030 回答