添加 PhotoOverlay

KML 早期版本可让您在附着到 Google 地球地标上的说明提示框中加入小照片。所有的图层(如 Panoramio)都由用户提供的地理定位照片组成。要查看这些照片,用户必须点击地标图标(或点击“列表”面板中的名称)来打开包含照片的提示框。

PhotoOverlay 是直接嵌入地球景观中的照片。它们可以是2D矩形,此类矩形添加了可扩展地球基本航拍图像的风景“广告牌”。PhotoOverlay 还可以投影到圆柱面或球面上以创建虚拟全景,用户可以“输入”、浏览并进行详细检查。此外,KML 2.2可容纳包含大量兆像素数据的特大 PhotoOverlay。这些图片要求作为 KML 编写者的您提供一组图片的降低采样版本,以便 Google 地球能够以适当的细节级别仅有效加载适合当前视图的图片部分。

除了此页面外,请务必阅读“KML 主题”页中关于 PhotoOverlay 对象所使用的镜头的部分。如果您要对 PhotoOverlay 使用特大图片,还需要创建一个 <ImagePyramid>

您可以执行的操作

新的 <PhotoOverlay> 元素可让您查找照片在地球上的地理位置,并指定查看此 PhotoOverlay 的镜头的位置和方向。PhotoOverlay 可以是简单的2D矩形、部分或完整的圆柱面,也可以是球面(用于球面全景)。该叠加层位于指定位置,并朝向镜头。

此地图项最令人惊喜的方面可能就是它能够处理特大照片(包含大量兆像素数据),并且允许用户有效地放大和平移这些大型图片以查看微妙的细节。此高级地图项将在添加特大照片部分进行介绍。

重要概念

下面的部分介绍了一些与 PhotoOverlay 相关的重要概念:

  • 继承自 <Feature> 和 <AbstractView>
  • 继承自 <Overlay>
  • 形状
  • 视野
  • 通过 <rotation> 调整视图
  • 使用图标标记 PhotoOverlay
  • 图片金字塔 - 高级(请参见添加特大照片部分)

语法

下面提供了 <PhotoOverlay> 的语法,便于您在阅读相关重要概念时作为参考。

<PhotoOverlay>
  <!-- inherited from Feature element -->   
  <name>...</name>                      <!-- string -->   
  <visibility>1</visibility>            <!-- boolean -->   
  <open>0</open>                        <!-- boolean -->
  <atom:author>...<atom:author>         <!-- xmlns:atom -->   
  <atom:link>...</atom:link>            <!-- xmlns:atom -->   
  <address>...</address>                <!-- string -->   
  <AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">...
</AddressDetails> <!-- string --> <phoneNumber>...</phoneNumber> <!-- string -->
<Snippet maxLines="2">...</Snippet> <!-- string --> <description>...</description> <!-- string --> <AbstractView>...</AbstractView> <!-- Camera or LookAt --> <TimePrimitive>...</TimePrimitive> <styleUrl>...</styleUrl> <!-- anyURI --> <StyleSelector>...</StyleSelector> <Region>...</Region> <ExtendedData>...</ExtendedData> <!-- inherited from Overlay element --> <color>ffffffff</color> <!-- kml:color --> <drawOrder>0</drawOrder> <!-- int --> <Icon> <href>...</href> <!-- anyURI --> ... </Icon> <!-- specific to PhotoOverlay --> <rotation>0</rotation> <!-- kml:angle180 --> <ViewVolume> <leftFov>0</leftFov> <!-- kml:angle180 --> <rightFov>0</rightFov> <!-- kml:angle180 --> <bottomFov>0</bottomFov> <!-- kml:angle90 --> <topFov>0</topFov> <!-- kml:angle90 --> <near>0</near> <!-- double --> </ViewVolume> <ImagePyramid> <tileSize>256</tileSize> <!-- int --> <maxWidth>...</maxWidth> <!-- int --> <maxHeight>...</maxHeight> <!-- int --> <gridOrigin>lowerLeft</gridOrigin> <!-- lowerLeft or upperLeft--> </ImagePyramid> <Point> <coordinates>...</coordinates> <!-- lon,lat[,alt] --> </Point> <shape>rectangle</shape> <!-- kml:shape --> </PhotoOverlay>

继承自 <Feature>

由于 <PhotoOverlay> 派生自 <Feature>,因此它可以包含派生自 <AbstractView> 的两个元素中的任意一个:<Camera> 或 <LookAt>。Camera(或 LookAt)会指定视点和查看方向(也称为“查看矢量”)。PhotoOverlay 是相对于视点来进行定位的。具体来说,2D矩形图片的平面和查看矢量正交(成直角)。该平面的法线方向(即远离照片的正向)朝向视点。

继承自 <Overlay>

PhotoOverlay 图片的网址在 <Icon> 标签中指定,该标签继承自 <Overlay>。<Icon> 标签必须包含 <href> 元素,该元素指定用于 PhotoOverlay 的图片文件。如果图片像素达到千兆,那么 <href> 则作为一个特殊网址,用于将具有不同分辨率的图片金字塔编入索引(请参见添加特大照片)。

形状

PhotoOverlay 会投射到“形状”上。<shape> 的值可为以下某一项:

  • rectangle - 用于普通照片
  • cylinder - 用于全景(部分或完整的圆柱面)
  • sphere - 用于球面全景

视野

将镜头定位在空间中并调准方向后,就需要定义当前场景的可见部分。指定视野类似于在真实相机中指定镜头开度。较小的视野(如长焦镜头),聚焦于场景中较小的部分。较大的视野(如广角镜头),聚焦于场景中较大的部分。

PhotoOverlay 的视野用四个平面定义,其中每个平面都用相对于查看矢量的夹角来指定。这四个平面分别定义了视野的上下左右四面,形状如同截断的金字塔(如下所示):

view volume for a camera

以下图表显示了此金字塔的 <rightFov> 与 <leftFov> 的夹角(“侧视图”)和 <topFov> 与 <bottomFov> 的夹角(“俯视图”):

在以下两种情况下,真实世界中的典型镜头具有两个方向的对称视野

bottomFov = -topFov 

leftFov = -rightFov

典型值如下所示:

<ViewVolume>
  <near>1000</near>
  <leftFov>-60</leftFov>
  <rightFov>60</rightFov>
  <bottomFov>-60</bottomFov>
  <topFov>60</topFov>
</ViewVolume>

包含 PhotoOverlay 的 <shape> 位于 <near> 处,该元素为到视点(或镜头位置)的距离(以米为单位)。视野的四个平面与该形状相交。视野内形状的任何部分都是可见的。视野外形状的任何部分都可以说是“经过剪切”且不可见的。

矩形的视野

对于矩形,<topFov> 必须小于90°,<bottomFov> 必须大于-90°。如果超出了上述任一限制,视野平面将根本不可能与图片相交。<bottomFov> 和 <leftFov> 元素通常为负值。

圆柱面的视野

对于圆柱形图片,圆柱面的轴与视图向上的矢量(Y 轴)匹配。圆柱面的半径等于 <near>。

对于圆柱面,视野范围如下所示:

-90 < bottomFov < topFov < 90
-180 < leftFov < rightFov < 180 

球面的视野

球面图片以镜头原点(视点)为中心。球面的半径等于 <near>。对于球面,视野范围如下所示:

-90 < bottomFov < topFov < 90
-180 < leftFov < rightFov < 180 

通过 <rotation> 调整视图

使用 <rotation> 元素作为 <PhotoOverlay> 的子元素调整照片在视野内的放置方式。如果您的照片已经过旋转且略微偏离所需的水平角度,就需要使用该元素。

使用图标标记 PhotoOverlay

<PhotoOverlay> 包含一个 <Point> 元素,该元素在 <Placemark> 元素内使用时的行为方式与 <Point> 相同,也就是说该元素可使 Google 地球绘制图标来标记 PhotoOverlay 的位置。绘制的图标由 <styleUrl> 和 <StyleSelector> 字段指定,就像它用于 <Placemark> 一样。

添加特大照片

对于非常大的图片,您需要构建“图片金字塔”,这是一组分层图片,从原始图片开始,每一层图片的分辨率都逐层降低。金字塔中的每张图片都细分为多张平铺图片,因此只需加载视图中的相关部分。Google 地球计算当前视点,并加载适合用户距图片距离的平铺图片。随着视点移近 PhotoOverlay,Google 地球会加载更高分辨率的平铺图片。由于无法同时在屏幕上观看原始图片中的所有像素,这种处理过程就可让 Google 地球实现最佳性能,因为它只加载视图中的那部分图片以及用户在当前视点所能看到的像素细节。

如果图片非常大,应该为该图片创建一个图片金字塔并在 <Icon> 元素中修改 <href>,以加入针对要加载的平铺图片的规范。以下部分介绍了如何创建图片金字塔以及如何为千兆像素的图片指定 <href>。

<ImagePyramid> 元素

<ImagePyramid> 元素具有以下语法:

<ImagePyramid>
  <tileSize>256</tileSize>              <!-- int -->
  <maxWidth>...</maxWidth>              <!-- int -->
  <maxHeight>...</maxHeight>            <!-- int -->
  <gridOrigin>lowerLeft</gridOrigin>    <!-- lowerLeft or upperLeft -->
</ImagePyramid>

原始图片的像素大小在 <maxWidth> 和 <maxHeight> 元素中指定。宽度和高度可以是任何大小值,不一定要是2的整数次幂。您可以使用黑色像素填充余下的像素,如对图片添加填充中所述。

平铺图片必须是正方形,且 <tileSize> 必须是2的整数次幂。平铺图片大小的默认值为256;建议值为512。

创建图片金字塔

这些说明假定您的图片像素度量值是2的整数次幂(如果图片像素度量值不是2的整数次幂,则需要先添加填充,如对图片添加填充中所述)。然后按照以下步骤创建图片金字塔:

  1. 从原始图片(全尺寸图片)开始,将其分成平铺图片大小的部分,例如分成多个均为256 * 256像素的图块。
  2. 按因子2缩小图片。
  3. 将此新图片分成平铺图片大小的正方形。
  4. 重复步骤2和3,直到所得图片适合该平铺图片大小(例如256 * 256像素)。

对图片添加填充

如果一行中最后的平铺图片不是正方形,则需要添加透明的填充像素来合成正方形的平铺图片。放置图片以使 (0,0) 平铺图片位于原点(例如,如果原点位于左下角,则将图片放在平铺图片网格的左下角)。然后,将可能需要填充的行和列放于图片的右侧和上方。为了优化过滤,请复制图片边缘的最后一行(或列)。然后,将填充项(例如黑色)添加到该行(或列)的平铺图片余下的像素中。

示例

作为示例,可以考虑尺寸为3600 * 2700像素(大概为10兆像素)的图片。以下是为该图片创建图片金字塔的步骤:

  1. 使用256 * 256像素的平铺图片大小,您可以将原始图片细分为16 * 16像素的网格(该图片在最终金字塔中的第4层结束)。
  2. 填充像素以使最后列(右侧)和最后行(顶部,假定 <gridOrigin> 为“lowerLeft”)中部分填充的平铺图片“成为正方形”(如对图片添加填充中所述)。
  3. 按因子2缩小图片。
  4. 将图片细分为256 * 256像素的平铺图片。该层的图片由8 * 8个平铺图片的网格组成(第3层)。
  5. 按因子2缩小第3层的图片。
  6. 细分为平铺图片。该层的图片由4 * 4个平铺图片的网格组成(第2层)。
  7. 按因子2缩小第2层的图片。
  8. 细分为平铺图片。该层的图片由2 * 2个平铺图片的网格组成(第1层)。
  9. 按因子2缩小第1层的图片。
  10. 所得图片为256 * 256像素,因此这是图片金字塔的最后一层(第0层)。

4096 * 4096图片的图片金字塔共有5层,如下表中所示:

层数
平铺图片数
图片大小(像素)
0
1
256 * 256
1
4(2 * 2网格)
512 * 512
2
16(4 * 4网格)
1024 * 1024
3
64(8 * 8网格)
2048 * 2048
4
256(16 * 16网格)
4096 * 4096

因此,第n层在每个方向上均有2n个平铺图片。

以下说明显示了图片金字塔示例的第0、1和2层。

对平铺图片编号

每层中的平铺图片都具有编号,以便 Google 地球只获取适合当前视点的特定平铺图片。每张平铺图片都用以下三个值标识:

  • x 值 - 网格中的行位置
  • y 值 - 网格中的列位置
  • 层数 - 图片金字塔中的层数(0为最高层)

默认情况下,原点 (0,0) 位于网格的左下方。如果图片的原点位于左上方,请为 <gridOrigin> 指定 topLeft

下图说明了这张10兆像素图片在第2层的平铺图片编号,其原点位于左下方:

指定特大图片的网址

对于千兆像素的图片,<Icon> 元素中的 <href> 规范包含特定实体以指定 Google 地球需要获取的平铺图片的 levelxy 值。例如,图片的网址可指定如下:

http://server.company.com/bigphoto/$[level]/row_$[x]_column_[$y].jpg 

要请求第3层、第2行、第1列中的平铺图片,Google 地球将提取以下网址:

http://server.company.com/bigphoto/3/row_2_column_1.jpg

透明度

如果您的图片是完全不透明的,则使用 JPEG 格式。如果图片部分不透明,部分透明,则可以混合使用 PNG 和 JPEG 平铺图片。只对具有透明度值的平铺图片使用 PNG 格式。如果您需要混合这些格式,请忽略图片文件 <href> 规范的文件扩展名,并在每个平铺图片的文件名中加入该文件扩展名。

返回页首