我有一个使用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
"指示忽略海拔规范"(根据文件),因此无论其海拔值如何,该点都将被放置在地面。
为了能够改变高度,使用relativeToGround
或absolute
作为高度模式,或者使用API来改变高度,例如
pm.getGeometry().setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND);
然后,您通过pm.getGeometry().setAltitude(...)
设置的任何高度都应该有效。