1 问题的发现
最近在用osgearth_cache对*.earth进行缓存时,发现往往会卡在一个进程中:
my@my-MRC-WX0:~/work/qtproject/build-OSGObject-unknown-Debug$ osgearth_cache --seed simple.earth
[osgEarth] Seeding layerworld_boundaries
就是进行不下去了。一开始我以为是卡住了,或者是那个图层的源数据太大了导致的。后来发现,保存缓存数据的文件夹还一直在增大,虽然增大的步子很小,但确实一直在增大。
后来分析卡主的图层的数据类型,大概猜测了一个可能。
卡住的位置的内容如下:
<!--添加世界线(黄色)与国界线-->
<image name="world_boundaries" driver="agglite">
<features name="world" driver="ogr">
<url>/media/my/SSD/OSG_DATA/MAIN_DATA/features/worldShp/world.shp</url>
<build_spatial_index>true</build_spatial_index>
</features>
<geometry_type>line</geometry_type>
<relative_line_size>true</relative_line_size>
<styles>
<style type="text/css">
world{
stroke:#ffff00;
stroke-opacity:1.0;
stroke-width:1.5;
}
</style>
</styles>
</image>
2 分析猜测
大胆猜测,可能并不是卡住了,而是陷入了死循环,而陷入死循环的原因,可能是因为,这里加载的shp数据是国界线和省界线,矢量下,线是只有长度,他的宽度本身没有太大意义,也就是说,如果不加以限制,无论把图像拉的多大,他的宽度都可以重新修正出来。所以无论剖析多少层,线都能进行下去,而osgearth_cache --seed simple.earth
没有定义最大的LOD的缓存层数,由下面的解释可以看出来,没有指定时,就是最大的LOD层级。因此就可能陷入死循环。
[--max-level level] ; Highest LOD level to seed (default=highest available)
3 解决方案
- 在缓存时,定义LOD的最大缓存层数
--max-level level
,只是这样可能会影响别的数据的缓存。 - 其实像国界线,省界线这样的矢量数据,它本身非常的小,完全不必要缓存,因此,在做缓存操作时,可以先将这部分矢量数据的加载的内容注释掉,也就是不进行缓存,缓存完之后,再取消注释。
- 将缓存策略配置到需要缓存的ImageLayer或者ElevationsLayer中。