特征与符号¶
了解功能¶
特征 是矢量几何。不同于图像和高程数据 粗锉 )功能没有离散显示分辨率。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_range
和 max_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
功能图块可以调出之前的最短时间(秒)。将此值设置为负数可完全禁用过期(即,瓷砖永远不会翻页)。