2009年2月更新:添加了有关 <gx:altitudeMode>、<gx:TimeStamp> 和 <gx:TimeSpan> 的内容。
KML 2.2中引入了 <Camera>
,该元素提供了另一种指定观察者视点和相关视图参数的方式。<Camera>
与 <LookAt>
相似,因为这两种元素都用于定义虚拟镜头查看地球时所处的位置和方向。区别在于,LookAt 会根据查看的景点来指定视图。相比之下,Camera 则会根据观察者的位置和方向来指定视图。
<LookAt>
和 <Camera>
都扩展自 <AbstractView>
元素,该元素是个基本抽象类型。<Camera>
和 <LookAt>
在 KML 文件中的用法相同,即用作一个派生自 <Feature>
(Placemark、ScreenOverlay、GroundOverlay、PhotoOverlay、Folder、Document、NetworkLink)的任意元素的子元素,或用作 <NetworkLinkControl>
的子元素。您可以在某地图项内使用 <Camera>
或 <LookAt>
,但不能同时使用这两个元素(即只有一个虚拟镜头可以指定当前视点)。
<Camera>
和 <LookAt>
之间的区别
新的 <Camera>
元素可以让您更加灵活地指定视图。最重要的是,您可以倾斜镜头视图,以便越过地平线观察星空。<Camera>
可以提供全面而自由的视角,以全景六度来控制视图,因此您可以在空间中定位镜头,然后将它绕着 X、Y 和 Z 轴旋转。如果未指定旋转值,则这两个元素的作用是相同的:
<Camera>
<longitude>-121</longitude>
<latitude>37</latitude>
<altitude>2000</altitude>
<altitudeMode>clampToGround</altitudeMode>
</Camera>
<LookAt>
<longitude>-121</longitude>
<latitude>37</latitude>
<altitude>2000</altitude>
<altitudeMode>clampToGround</altitudeMode>
</LookAt>
以下部分对 <LookAt>
元素进行了简短回顾,以便您对比它和新的 <Camera>
元素各自的用法。
<LookAt>
回顾
<LookAt>
元素用于指定地球上正被查看的点、景点与视点间的距离以及视图的角度。该元素的语法如下:
<LookAt id="ID"> <longitude></longitude> <!-- kml:angle180 --> <latitude></latitude> <!-- kml:angle90 --> <altitude>0</altitude> <!-- double --> <range></range> <!-- double --> <tilt>0</tilt> <!-- float --> <heading>0</heading> <!-- float --> <altitudeMode>clampToGround</altitudeMode> <!--kml:altitudeModeEnum:clampToGround, relativeToGround, absolute --> <!-- or, gx:altitudeMode can be substituted: clampToSeaFloor, relativeToSeaFloor --> </LookAt>
下图展示了 <LookAt>
视点的构建方式:
<LookAt>
元素可指定以下问题的答案:
问题 | <LookAt> 中的规范 |
当前在查看什么目标? | <longitude>、<latitude>、<altitude>、<altitudeMode> |
视点距景点有多远? | <range> |
视图方向是否是北面朝上? | 如果是,则使用默认的 <heading> 值0。如果不是,请指定一个0(不含)到360°的 <heading> 旋转值 |
视图方向是否直指地球? | 如果是,则使用默认的 <tilt> 值。如果不是,镜头将向上朝着地平线;请指定一个不大于90°的 <tilt> 旋转值。 90°表示直接沿着地平线看过去(如果您离地球表面很远,而且 <tilt> 值为90°,那么您可能看不到地球表面)。 |
示例
以下是一个 <Placemark>
示例,其中包含 <LookAt>
元素:
<Placemark>
<name>Machu Picchu, Peru</name>
<LookAt>
<longitude>-72.503364</longitude>
<latitude>-13.209676</latitude>
<altitude>0</altitude>
<range>14794.882995</range>
<tilt>66.768762</tilt>
<heading>71.131493</heading>
</LookAt>
<styleUrl>#msn_icon12</styleUrl>
<Point>
<coordinates>-72.516244,-13.162806,0</coordinates>
</Point>
</Placemark>
以下是 Google 地球中显示的地标:
如果您的查看方向与地球相交,请使用 <LookAt>
元素,因为指定该元素比指定 <Camera>
要稍微容易一些。
<Camera>
的子元素
<Camera>
元素可以在空间中的任意位置定位视点,并且可以沿任意方向旋转视图。该元素的语法如下:
<Camera id="ID"> <longitude>0</longitude> <!-- kml:angle180 --> <latitude>0</latitude> <!-- kml:angle90 --> <altitude>0</altitude> <!-- double --> <heading>0</heading> <!-- kml:angle360 --> <tilt>0</tilt> <!-- kml:anglepos180 --> <roll>0</roll> <!-- kml:angle180 --> <altitudeMode>clampToGround</altitudeMode> <!-- kml:altitudeModeEnum: relativeToGround, clampToGround, or absolute --> <!-- or, gx:altitudeMode can be substituted: clampToSeaFloor, relativeToSeaFloor --> </Camera>
<Camera>
元素可指定以下问题的答案:
问题 | <Camera> 中的规范 |
镜头位于空间中的什么位置? | 将镜头放置在由 <longitude>、<latitude>、<altitude> 和 <altitudeMode> 指定的点处。通常情况下,将镜头放置在地面上不是明智的做法。 |
镜头的朝向能否确保视图是北面朝上? | 如果是,则使用默认的 <heading> 值0。如果不是,请参照罗盘的点旋转镜头,旋转值范围为0(不含)到360°。 |
镜头方向是否直指地球? | 如果是,则使用默认的 <tilt> 值0。如果不是,请旋转镜头(旋转值范围为0到180°),来指定绕 X 轴旋转的角度(<tilt> 值可以为负值,但这会导致视图上下颠倒)。 |
通过镜头观看景物时,镜头是否水平? | 如果是,则使用默认的 <roll> 值0。请注意:<roll> 用作 <Camera> 的子元素时,其值通常为0。您可以指定一个介于−180到+180°之间的值,但这种用法很少见。 |
下图显示了附加到虚拟镜头的 X、Y 和 Z 轴。
- X 轴指向镜头右侧,称为“向右矢量”。
- Y 轴定义相对于屏幕的“向上”方向,称为“向上矢量”。
- Z 轴从屏幕的中心指向视点(镜头沿着 −Z 轴方向俯瞰),称为“查看矢量”。
以下示例将 <Camera>
设置为 <Document>
内的起始视点:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Golden Gate tour</name>
<open>1</open>
<Camera>
<longitude>-122.4790</longitude>
<latitude>37.8110</latitude>
<altitude>127</altitude>
<heading>18.0</heading>
<tilt>85</tilt>
<altitudeMode>absolute</altitudeMode>
</Camera> </Document> </kml>
该视点在 Google 地球中显示为:
AbstractView 中的时间
<Camera>
和 <LookAt>
均可包含时间信息,时间信息会对历史图像、光照以及标有时间的所有对象产生影响。<gx:TimeSpan>
和 <gx:TimeStamp>
可在 AbstractView 中使用,并包含在 Google 扩展元素命名空间中。有关详情,请参见时间和动画一章中的使用 AbstractView 指定时间部分。
示例
以下示例展示了不同的 <Camera>
旋转角度。
方位
本示例显示了一个方位为90度(向东)并倾斜90度(向地平线)的 <Camera>
。该镜头位于海拔100米的位置。
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Placemark>
<name>100m looking east</name>
<Camera>
<longitude>-122.4783</longitude>
<latitude>37.8120</latitude>
<altitude>100</altitude>
<heading>90</heading>
<!-- east -->
<tilt>90</tilt>
<!-- level -->
<altitudeMode>absolute</altitudeMode>
</Camera>
</Placemark> </Document> </kml>
在 Google 地球中的结果为:
倾斜
以下示例使用向地平线倾斜90度的 <Camera>
。该示例中,<heading>
、<altitude>
、<altitudeMode>
和 <roll>
均采用默认值。
<Camera>
包含 <gx:TimeStamp>
值;该值会对历史图像、光照以及标有时间的所有对象的显示产生影响。下图启用了光照效果,并且 <Camera>
查看该地点的时间为世界协调时间2009年1月1日下午3:29(当地时间为上午7:30)。
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
<Placemark>
<name>At ground level</name>
<Camera>
<gx:TimeStamp><
when>2009-01-01T15:29:27Z</when>
</gx:TimeStamp>
<longitude>-122.4783</longitude>
<latitude>37.8120</latitude>
<!-- altitude default is 0 (default altitudeMode is clampToGround) -->
<!-- heading default is 0 (north) -->
<tilt>90</tilt>
<!-- level -->
<!-- roll default is 0 -->
<!-- altitudeMode default is clampToGround -->
</Camera>
</Placemark>
</Document>
</kml>
该视点在 Google 地球中显示为:
滚动
本示例使用值为45度的 <roll>
元素,这会使镜头转向左侧。
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
<Placemark>
<name>Roll left</name>
<Camera>
<gx:TimeStamp><
when>2009-01-01T15:29:27Z</when>
</gx:TimeStamp>
<longitude>-122.4783</longitude>
<latitude>37.8120</latitude>
<altitude>100</altitude>
<heading>90</heading>
<!-- east -->
<tilt>90</tilt>
<!-- level -->
<roll>45</roll>
<altitudeMode>absolute</altitudeMode>
</Camera>
</Placemark>
</Document>
</kml>
转换顺序
旋转的顺序很重要。默认情况下,镜头沿 −Z 轴垂直俯瞰地球。在执行旋转之前,镜头会沿 Z 轴转换到 <altitude>
。转换顺序如下:
- <altitude> - 沿 Z 轴转换到 <altitude>
- <heading> - 绕 Z 轴旋转。
- <tilt> - 绕 X 轴旋转。
- <roll> -(再次)绕 Z 轴旋转。
请注意,每次进行旋转时,两条镜头轴都会改变方向。