特征与符号

了解功能

特征 是矢量几何。不同于图像和高程数据 粗锉 )功能没有离散显示分辨率。osgearth可以在任何细节级别呈现功能。

A 特征 是三个组成部分的组合:

  • 矢量几何(点、线或多边形的集合)

  • 属性(名称/值对的集合)

  • 空间参考(描述几何坐标)

创建要素图层

osgearth可以用两种不同的方式呈现功能:

  • 栅格化为 图像层

  • 细分为 模型层

栅格化

栅格化特征 是最简单的-osgearth将“绘制”向量到图像块,然后在普通图像层中使用该图像块。

Osgerath有一个栅格化功能驱动程序:The agglite 司机。下面是一个将ESRI形状文件呈现为栅格化图像层的示例:

<image name="my layer" driver="agglite">
    <features name="states" driver="ogr">
        <url>states.shp</url>
    </features>
    <styles>
        <style type="text/css">
            states {
                stroke:       #ffff00;
                stroke-width: 2.0;
            }
        </style>
    </styles>
</image>

镶嵌

镶嵌特征 执行一个编译过程,将输入向量转换为OSG几何体(点、线、三角形或替换的3D模型)。主要功能细分插件是 feature_geom 驱动程序-您将在OSGearth的大多数地球文件中看到这一点,这些文件演示了功能数据的使用。

这里是一个 模型层 它将ESRI形状文件呈现为一系列黄色线条,呈现为OSG线条几何:

<feature_model name="boundaries">
    <features name="states" driver="ogr">
        <url>states.shp</url>
    </features>
    <styles>
        <style type="text/css">
            states {
                stroke:       #ffff00;
                stroke-width: 2.0;
            }
        </style>
    </styles>
</feature_model>

还可以将要素数据作为单独的图层进行引用。如果您有多个使用相同数据集的要素图层,则此功能非常有用:

<feature_source name="data_layer" driver="ogr">
    <url>states.shp</url>
</feature_source>

<feature_model name="boundaries" feature_source="data_layer">
    <styles>
        <style type="text/css">
            states {
                stroke:       #ffff00;
                stroke-width: 2.0;
            }
        </style>
    </styles>
</feature_model>

要素图层的组件

从上面的示例中可以看到,任何要素层都有一些必要的组件

  • 这个 <features> 块描述了实际的特性源,即osgearth应该在哪里找到输入数据。交替地,a <feature_source> 引用指定特征数据的另一层。

  • 这个 <styles> 块描述Osgerath应如何渲染功能,即它们在场景中的外观。我们称之为 样式表符号学 . 的组成 样式表 可以从根本上改变特征数据的外观。

这两个元素都是必需的。

造型

在地球档案中,你可以看到 <styles> 像这样的块:

<styles>
    <style type="text/css">
        buildings {
            altitude-clamping: terrain;
            extrusion-height:  15;
            extrusion-flatten: true;
            fill:              #ff7f2f;
        }
    </style>
</styles>

那是一个 样式表 阻止。你会在一个 <model> 正在呈现要素数据的层,与 <features> 阻止。(The <features> 块定义实际内容的源。)

在这种情况下, <style> 元素保存CSS格式的数据。一个CSS样式块可以容纳多个样式,每个样式都有一个名称。在这种情况下,我们只有一种样式: buildings . 此样式告知几何引擎执行以下操作:

  • 将特征几何图形与地形高程数据相夹;

  • 将形状挤出到高于地形15米的高度;

  • 压扁挤压形状的顶部;以及

  • 把形状涂成橙色。

OSGerath采用“模型/视图”方法来呈现功能。它将 内容风格 ,这与Web应用程序将使用的方法非常相似。 CSS 设置Web内容的样式。

osgearth获取每个输入特性并将其服从于一个样式化过程。输出将完全取决于样式表中符号的组合。这包括:

  • 填充和笔划-是否将数据绘制为线条或多边形

  • 拉伸-将二维几何图形拉伸为三维形状

  • 替换-用外部三维模型(如树)或图标替换几何图形

  • 高度-几何图形如何与地图地形交互

  • 文本-控件标签

  • 渲染-照明、混合和深度测试的应用

样式表

每个要素层都需要 样式表 . 样式表显示为 <styles> 在地球文件中阻塞。举个例子:

<feature_model name="test">
    <features driver="ogr">
        <geometry>POLYGON( (0 0, 1 0, 1 1, 0 1) )</geometry>
        <profile>global-geodetic</profile>
    </features>
    <styles>
        <style type="text/css">
            default {
                fill:               #ff7f009f;
                stroke:             #ffffff;
                stroke-width:       2.0;
                altitude-clamping:  terrain;
                altitude-technique: drape;
                render-lighting:    false;
            }
        </style>
    </styles>
</feature_model>

这个 样式表 包含一个 风格 打电话 default . 因为只有一种样式,所以osgearth将把它应用于所有的输入特性。(要将不同的样式应用于不同的功能,请使用 选择器 -更多信息见下文。)

样式包含一组 符号 描述osgearth应该如何呈现特征几何图形。在这种情况下:

填满

以指定的HTML样式颜色(在本例中为橙色)绘制填充多边形。

用白色勾勒多边形的轮廓。

笔画宽度

绘制2像素宽的轮廓。

高度夹紧

将多边形夹在地形上。

高度技术

使用“悬垂”技术来夹住多边形(投影纹理)。

渲染照明

禁用多边形上的OpenGL照明。

这只是一个可用符号的小样本。有关完整的列表,请参阅: 符号学参考 .

表达

某些符号属性支持 表达 . 表达式是一种简单的内嵌计算,使用功能属性值动态计算属性。

在表达式中,您可以通过将特性属性值的名称括在方括号中来访问它,如下所示: [name]

例子::

mystyle {
    extrusion-height:  [hgt]*0.3048;           - read the "hgt" attribute, and convert it from feet to meters
    altitude-offset:   max([base_offset], 1);  - use the greater of the "base_offset" attribute, and 1.0
    text-content:      "Name: [name]";         - sets the text label to the concatenation of a literal and an attribute value
}

数值表达式计算器支持基本算术(+、-、*、/%),一些实用函数(最小、最大)和带括号的分组。它也适用于字符串值。没有运算符,但仍可以嵌入属性。

如果简单表达式不够,可以使用javascript::

<styles>
    <script language="javascript">
        function getOffset() {
            return feature.properties.base_offset + 1.0;
        }
    </script>

    <style type="text/css">
        mystyle {
            extrusion-height: feature.properties.hgt * 0.3048;
            altitude-offset:  getOffset();
        }
    </style>
</styles>

地形跟踪

特征以某种方式与地形交互是相当常见的。这方面的要求包括:

  • 沿着地形轮廓的街道

  • 地上种植的树

  • 主题地图,比如根据人口给一个国家的地区着色

Osgerath提供多种地形跟踪方法,因为没有哪种方法最适合每种情况。

地图夹持

地图夹持 是最简单的方法。在编译显示功能时,osgearth将对 立面图层 在地图中,找到Terrian的高度,并将其应用于生成的要素几何体。它将沿着几何图形测试每个点。

地图夹持会产生高质量的渲染;权衡是性能:

  • 根据您选择的分辨率,可以对地图中的高程数据进行缓慢采样。对于大量的特性,它可能是CPU密集型和耗时型的。

  • 采样是精确的,对几何图形中的每个点都进行采样。您可以选择在 质心 以提高编译速度。

  • 根据特征几何体的分辨率,可能需要对数据进行细分以获得更好的质量。

  • 与其他方法相比,渲染质量较好。

您可以在样式表中激活地图夹,如下所示:

altitude-clamping:   terrain;        // terrain-following on
altitude-technique:  map;            // clamp features to the map data
altitude-resolution: 0.005;          // [optional] resolution of map data to clamp to

悬垂

悬垂 是将已编译的几何图形覆盖在地形表面的过程,很像是在不平坦的表面上“悬垂”一条毯子。Osgerath会将该功能渲染为纹理(RTT),然后将该纹理向下投射到地形上。

悬垂有其优点和缺点:

  • 悬垂将完全符合地形特征;不需要担心分辨率或镶嵌。

  • 渲染线条或多边形边时,可能会出现锯齿状的效果。投影纹理的大小有限,它必须覆盖的区域越大,投影图像的分辨率越低。这意味着在实践中,悬垂对多边形比线更有用。

  • 意外的混合伪影可能是由于将许多透明几何图形相互重叠而导致的。

您可以像这样激活悬垂:

altitude-clamping:   terrain;        // terrain-following on
altitude-technique:  drape;          // drape features with a projective texture

GPU夹持

GPU夹持 使用GPU明暗器实现近似地形跟随。它使用了两个阶段的技术:首先,它使用深度场采样将每个顶点钳制到顶点明暗器中的地形皮肤上;其次,它在片段明暗器中应用深度偏移算法以减轻Z-战斗。

GPU夹持也有其权衡:

  • 它非常适合线(甚至三角线),但不适合多边形,因为它需要对多边形内部进行细分,以便进行良好的近似夹持。

  • 它很快,完全在运行时发生,并利用了GPU的并行处理。

  • 没有像悬垂那样的锯齿状边缘效果。

设置GPU夹持,如下所示:

altitude-clamping:   terrain;        // terrain-following on
altitude-technique:  gpu;            // clamp and offset feature data on the GPU

呈现大型数据集

将功能数据加载到OSGearth的最简单方法如下:

<feature_model name="shapes">
   <features name="data" driver="ogr">
      <url>data.shp</url>
   </features>
   <styles>
      data {
          fill: #ffff00;
      }
   </styles>
</feature_model>

我们刚刚加载了shapefile中的每个特性,并将它们全部涂成黄色。

在某种程度上,这是很好的——OSGearth(和OSG)被过多的几何图形超载的点。即使有了Osgearth几何编译器所采用的优化,足够大的数据集也会耗尽系统资源。

解决这一问题的方法是功能平铺和分页。下面是如何配置它。

功能显示布局

功能显示布局激活功能数据的分页和分片。让我们修改前面的示例:

<feature_model name="shapes">
   <features name="data" driver="ogr">
      <url>data.shp</url>
   </features>

   <layout>
       <tile_size>250000</tile_size>
       <level name="data" max_range="100000"/>
   </layout>

   <styles>
      data {
          fill: #ffff00;
      }
   </styles>
</feature_model>

只存在于 <layout> 元素激活分页。这意味着,一旦应用程序启动,特性数据将在后台加载和编译,而不是在加载时加载和编译。在特征数据出现在场景中之前可能会有延迟,这取决于其复杂性。

存在 <level> 布局中的元素将激活平铺和细节级别。如果省略级别,数据仍将在后台加载,但将同时加载。对于一个或多个级别,OSGerath将以一个或多个详细级别将功能数据分解为图块,并单独分页这些图块。更多信息见下文。

分页将数据分成块。这个 tile_size 是每页瓷砖的宽度(以米为单位)。

裁剪功能

默认情况下,如果某个特征与图块相交,则即使该特征超出图块的范围,也将包括在内。这对像挤压建筑这样的东西很有用,因为你不想看到半个建筑页面,所以在挤压建筑中,试图将它们切碎以与瓷砖完全吻合是没有意义的。建筑物一般也很小,所以它们向外延伸的距离相对较小。

对于像道路或乡村边界这样具有线性特征的事物,修剪它们以精确地适应瓷砖可能更有意义。从视觉上看,如果一行出现在页面上,它看起来不会那么糟糕。您可以通过设置 crop_features 布局上的属性为true。

例如::

<feature_model name="roads">
      <features name="roads" driver="ogr" build_spatial_index="true">
            <url>roads.shp</url>
      </features>

      <layout crop_features="true" tile_size="1000">
          <level max_range="5000"/>
      </layout>

      <styles>
          <style type="text/css">
              roads {
                  stroke:  #ffff7f7f;
                }
          </style>
      </styles>
</feature_model>

水平

每个级别描述一个详细级别。这是一个摄像机范围(介于 min_rangemax_range )在这个细节级别的瓷砖被渲染的位置。但每块瓷砖有多大?这是根据 瓷砖范围系数 .

这个 tile_size 设置瓷砖的大小(以米为单位)。

你为什么关心瓷砖的尺寸?因为数据的密度会影响每个图块中几何图形的大小。而且,由于OSG(OpenGL,真的)从向图形卡发送大量类似的几何图形中获益,调整图块大小可以帮助提高性能和吞吐量。不幸的是,Osgearth无法提前确切知道“最佳”瓷砖尺寸;因此,您有机会使用此设置进行调整。

布局设置

tile_size

最大范围内布局中每个要素图块的大小(以一维表示)。必须设置最大范围才能使其生效。

max_range

预平铺功能源(如tfs)所需的最大范围。

min_range

布局中所有瓷砖的最小可见性范围。

crop_features

将要素级别切碎到网格单元时,是否裁剪几何图形以适应单元范围。默认情况下,这是错误的,这意味着将包括其质心位于单元内的特征。如果将此设置为true,则意味着如果功能的任何部分位于工作单元内,则它将被剪切到单元范围并使用。

priority_offset

设置将应用于此布局中瓷砖的计算分页优先级的偏移量。调整此选项会影响此数据相对于场景中其他页面数据(如地形或其他要素图层)的优先级。默认值=0.0

priority_scale

设置要应用于此布局中瓷砖的计算分页优先级的比例因子。调整此选项会影响此数据相对于场景中其他页面数据(如地形或其他要素图层)的优先级。默认值为1.0。

min_expiry_time

功能图块可以调出之前的最短时间(秒)。将此值设置为负数可完全禁用过期(即,瓷砖永远不会翻页)。