如何将一个栅格数据加载进osgearth

如何将一个栅格数据加载进osgearth,第1张

方法/步骤

1、测试数据我们主要是用osgearth_viewer这个库,让osgearth直接加载下载下来的tif文件。为此,我们要为下载下来的tif文件写一个.earth的配置文件,.earth文件里面主要包含tif文件的地址信息,截图如下:

在这个.earth文件中,最重要的一条信息就是:

<image driver="gdal" name="world-tiff">

<url>D:/矩形区域_#24_卫图_Level_13.tif</url>

</image>

2、这样子我们可以通过读取这个.earth文件来读取我们下载的ID为“矩形区域_#24_level_13.tif”这个文件,读取的时候我们要用到osgearth_viewer这个命令,在dos环境下输入命令读取,截图如下:

3、Osgearth_viewer表示我们要用这个库来读取,D:/gdal_tiff.earth表示D盘下的.earth文件。意思就是我们要用osgearth_viewer这个库来读取D盘下的gdal_tiff.earth文件。由于之前已经说明这个.earth是我们下载的tif文件的配置文件,因此通过这行命令就可以读取tif文件了。需要说明的是,由于tif文件都比较大,因此直接用osgearth加载的话可能会比较慢,所以需要大家耐心等待。

加载完成之后如果显示是这样子的,说明文件没有损坏:

4、把地图放大,可以明显看到我们下载的地图,如图所示:

5、如果加载出来的数据某一部分是黑的或者全部都是黑的,如图所示。说明数据已经损坏,损坏原因不明,可能是BigeMap软件本身的缺陷。数据一旦损坏请重新下载,不然切出的地图数据也会有问题的。

6、数据切片

前两部分主要是说明了数据的准备,这部分主要是进行数据的切片。数据切片我们主要用到两个东西。一个就是数据的配置文件——.earth文件;另一个就是osgearth提供的切片工具osgearth_package。

earth配置文件如图所示:

7、里面包含了我们要切割的所有源数据的地址信息。

另外我们还需要在DOS环境下输入命令,进行切割,如图所示:

8、Osgearth_package表示我们要用这个工具进行切图;--tms表示我们要用到的源数据的配置文件为:gdal_tiff.earth;--out表示输出文件夹;--Max-level表示切图的最大层级。

通过上述命令,osgearth就会通过源数据图的分辨率自动计算可以切多少层,每层切多少瓦片。切图过程需要一定时间,切完之后的文件如图所示:

可以看到切完之后生成了一个.xml文件,这个文件是对切片的配置文件,包括文件ID和索引等一些基本信息,如果想要读取这些瓦片数据的话,直接读取这个.xml配置文件即可。

9、完整演示

前面我们叙述过,osgearth读取文件需要用osgearth_viewer这个工具读取数据的.earth配置文件,而经过切片之后,切片数据会生成一个.xml的配置文件,要想读取切片之后的数据就要读取这个.xml文件,因此osgearth要想读取切片完成之后的数据,就要读取.earth文件,而这个.earth文件是指向包含切片数据信息的.xml文件的。这个.earth文件的详细信息如图所示:

10、将.earth指向.xml文件

至此,一个完整的数据准备过程结束了。

1、错误描述

编译完OSG,运行osgViewer.exe获取网络的.osg格式数据,在读取.osg数据时报错“无法定位序数354于动态链接库libeay32.dll”

2、修复尝试

拷贝3rdParty_VC11_x86_x64目录中的libeay32.dll覆盖当前的libeay32.dll,还是持续报错。

最好尝试将3rdParty_VC11_x86_x64中与OSG程序相关的.dll都拷贝并覆盖运行程序同目录下的.dll。最终运行osgViewer.exe

3、解决方案

osgViewer.exe同级目录下的某一dll文件所依赖的libeay32.dll的版本高于当前的依赖版本。所以剔除了此依赖关系,就可正常运行。

遇到此问题时,可换种思路,替换依赖libeay32.dll的库文件。

给你一些提示

#include<iostream>

#include<io.h>

using namespace std

int main(){

_finddata_t file

long lf

//输入文件夹路径

if((lf = _findfirst("d:\\OSG\\Data\\*.*", &file))==-1)//这个里面需要修改

cout<<"Not Found!"<<endl

else{

//输出文件名

cout<<"file name list:"<<endl

while(_findnext( lf, &file)==0){

cout<<file.name<<endl //你需要写入到文件

}

}

_findclose(lf)

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11637434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存