Google地球插件不是精确的坐标

时间:2013-12-05 20:31:35

标签: google-earth-plugin

我有相当奇怪的谷歌地球插件行为。我从插件中获取相机位置以创建一些带坐标的KML,然后将其存储在数据库中。当我重新加载页面时,它会读取kml,将其插入到其他字符串中 - 因此我在我的javascript代码中有一个包含整个kml文档的字符串。然后我将它加载到插件中。通常一切正常,但加载后我会看到两件事:

  • API返回的坐标与我正在加载的kml中的坐标不同
  • 相机位置有时会移动一点,这会导致错误:我在建筑物内部有一个摄像头,经过几页翻新后,摄像头突然出现在建筑物外面。

你有什么提示可以解决这个问题吗?

示例:

我创建了一个文档,并将此相机标签插入其中:

<Camera>
  <gx:ViewerOptions><gx:option name='streetview'></gx:option></gx:ViewerOptions>
  <longitude>2.1201209999999993</longitude>
  <latitude>48.80452499999986</latitude>
  <altitude>2.4999999991174264</altitude>
  <heading>22.795249807940547</heading>
  <tilt>82.25987544961218</tilt>
  <altitudeMode>relativeToGround</altitudeMode>
</Camera>

然后我将它加载到插件中,并要求飞到那里。当它飞行时,我使用copyAsCamera()得到坐标,纬度变为48.8044078508718

区别并不大,只是0.000117149,但结果显示出一个完全不同的地方(宫殿中的另一个房间。

我正试图获得完全相同的位置,如坐标所示。

1 个答案:

答案 0 :(得分:0)

我已经重写了答案,以涵盖您所提出的各种观点以及您提供的示例。

街景

KML数据正在设置<gx:ViewerOptions>以基于相机进入街景模式基于的关键词 - 街景视图是近似值。相机tiltheading等内容不再适用,因为它们被SteeetView POV对象取代。除此之外,您不能保证任何给定纬度和经度的摄像机实际上都会以相同的纬度和经度进入街景。

relativeToGround和terrain数据

使用高度模式relativeToGround可能会导致您看到的问题。这是因为当添加相对定位的元素(在您的情况下是相机)时,地形数据并不总是完成流式传输。

要明确您应该使用<altitudeMode>absolute</altitudeMode>ge.ALTITUDE_ABSOLUTE

您提供的示例同时使用<altitudeMode>relativeToGround</altitudeMode>ge.ALTITUDE_RELATIVE_TO_GROUND

您还可以尝试通过关闭地形图层来禁用地形数据,即

ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, false);

多个viewchangeend事件

viewchangeend事件可能会在viewchange的中间触发,特别是如果插件在更改期间暂停一段时间。您的标记正在触发街景模式,导致此情况发生。

您可以使用setTimeout来限制viewchangeend事件,以解决此问题。

var timer = null;
google.earth.addEventListener(ge.getView(), 'viewchangeend', function(){
  if(timer){
    clearTimeout(timer);
  }
    timer = setTimeout(eventHandler, 100);
  }
);

请参阅:https://developers.google.com/earth/documentation/events#event_listeners

倾斜差异

插件会自动“俯冲”在地平面上,使其从直视(0度倾斜)向地面直线移动(倾斜90度)。这是造成视图中倾斜值差异的原因。您正在查看地面上的对象,因此视图正在自动设置 - 无法禁用。

存储和输出KML数据

看一下这个文档,它提供了一些非常好的存储坐标数据的信息,并涵盖了我提到的那些点 - A Database Driven Earth App