0

我有一个使用 google-earth API 的网络,我在其中使用多个 KML 层来显示数据。

随着用户的交互,有必要修改地标的一些属性,如样式和名称,以更改地标显示信息。

在某些情况下,我想在Altitude地标处修改包含在PointKML 中指定的几何信息中的信息。实际上它是clampedToGround,我想将它修改为任何数字,以便在其他元素之上。

这是我如何修改地标信息的示例:

var pm = ge.getElementByUrl(UrlOfLayer#IdOfPlacemark);
pm.setStyleUrl(UrlOfLayer#IdOfStyleMap);
pm.setName(NewName);

这工作得很好,所有更改都可以毫无问题地应用。KML 地标的结构如下:

<Placemark id="1">
   <name>Name</name>
   <visibility>1</visibility>
   <open>0</open>
   <Point>
      <extrude>1</extrude>
      <tessellate>1</tessellate>
      <altitude>clampedToGround</altitude>
      <coordinates>1,1,1</coordinates>
   </Point>
   <styleUrl>#style</styleUrl>
</Placemark>

有了这个结构和 Javascript 中的 Placemark,getElementByUrl我可以通过 , 等访问字段名称、可见性等getName()getVisibility()但是,这不适用于 Point 信息,因为它包含在Geometry地标的对象中。

我可以使用 访问几何信息pm.getGeometry(),但在那之后,无法访问“点”,因为正如 Google 地球文档所说:

KmlGeometry 对象是一个抽象对象,不能直接使用。它为所有派生的 Geometry 对象提供了一个占位符对象。

查看使用点信息的一些示例,它仅用于创建点,然后将其包含在几何中,但在我的情况下,我无法在 Javascript 中创建点,因为我无法获取坐标信息和新点将覆盖它。

那么,有没有我找不到的访问器来实现这个目的?

4

1 回答 1

1

在这一点上,文档有点不清楚;也许应该说KmlGeometry对象不能直接实例化。事实上,一个KmlGeometry对象有多种方法,如果您单击“所有成员列表”链接(最相关的方法继承自),您可以在文档中看到这些方法。KmlObject

所有不同的几何类型都继承自KmlGeometry,但是由于您知道此几何是 a KmlPoint,因此您可以将其视为 a KmlPoint(在其他语言中,您可能必须显式转换变量,但是,无论好坏,Javascript 更宽容) . 在你的情况下,你可以做

var point = pm.getGeometry();
point.setAltitude(newAltitudeValue);
point.setLatLng(...);

等您可以使用所有正常的 KmlPoint 方法

顺便说一句,如果您知道几何的特定类型(例如,如果几何在单击事件上作为目标返回并且可以是任何东西),您总是可以通过getType继承自来询问它KmlObject(在这种情况下,pm.getGeometry().getType()将返回'KmlPoint'),然后您可以对其采取行动。不是一个完美的反射系统,但它可以工作。

附录:您的示例 KML 包含该行

<altitude>clampedToGround</altitude>

这不是有效的 KML。你可能的意思是

<altitudeMode>clampToGround</altitudeMode>

Earth 丢弃它不理解的元素(尽管验证器会显示此错误),但在这种情况下并不特别重要,因为clampToGround无论如何都是默认的高度模式。这是任何高度变化被丢弃的原因,因为clampToGround“表示忽略高度规范”(根据文档),因此无论其高度值如何,该点都将放置在地面。

为了能够改变高度,要么改变你提供给它的KML,使用relativeToGroundabsolute作为altitudeMode,或者使用API​​来改变它,例如

pm.getGeometry().setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND);

然后你设置的任何高度都pm.getGeometry().setAltitude(...)应该工作。

于 2012-07-31T21:59:45.507 回答