点的访问器's修改海拔高度的位置标记信息

Accessor to the Point's information of a placemark to modify the altitude

本文关键字:高度 位置 信息 修改海 访问      更新时间:2024-05-13

我有一个使用google-earth API的web,在那里我使用多个KML层来显示数据。

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

在某些情况下,我想在占位符的Altitude处修改包含在KML处指定的几何体的Point信息中的信息。实际上它是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>

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

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

KmlGeometry对象是一个抽象对象,不能使用直接地它为所有衍生几何体提供占位符对象对象。

看看一些使用点信息的例子,它只用于创建一个点,然后将其包含在几何体中,但在我的情况下,我无法在Javascript中创建点,因为我无法获得坐标信息,新点会覆盖它。

那么,有没有我找不到的访问者可以实现这个目的呢?

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

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

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

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

顺便说一句,如果不知道几何体的特定类型(例如,如果几何体在单击事件中作为目标返回,并且可以是任何对象),则可以始终使用从KmlObject继承的getType来询问它(在这种情况下,pm.getGeometry().getType()将返回'KmlPoint'),然后可以对其采取行动。不是一个完美的反射系统,但它是有效的。

附录:您的示例KML包含行

<altitude>clampedToGround</altitude>

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

<altitudeMode>clampToGround</altitudeMode>

地球会丢弃它不理解的元素(尽管验证器会显示这个错误),但在这种情况下并不重要,因为clampToGround无论如何都是默认的altitudeMode。这是任何海拔变化下降的原因,因为clampToGround"指示忽略海拔规范"(根据文件),因此无论其海拔值如何,该点都将被放置在地面。

为了能够改变高度,使用relativeToGroundabsolute作为高度模式,或者使用API来改变高度,例如

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

然后,您通过pm.getGeometry().setAltitude(...)设置的任何高度都应该有效。