osgearth3.2平面模式,加载多块本地地形

问题描述:osgearth3.2平面模式,同时加载多个具有相同srs的地形和影像文件

解决思路:

1.首先给map指定一个srs信息,指定一个bound信息,即要显示的范围,加载多块地形时,bound的范围为所有影像的minx,miny,maxx,maxy;

2.使用map->addlayer()依次添加所有的影像层和高程层。

具体实现见代码,此代码中拥有完整的实现流程。

#include 
#include  
#include  
#include 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include

#include
#include 
#include 
#include

#define DEBUG
#ifdef DEBUG
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgEarthd.lib")
#pragma comment(lib,"osgDBd.lib")
#else
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgGA.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osgEarth.lib")
#pragma comment(lib,"osgDB.lib")
#endif // DEBUG

struct Extents
{
	double minx, miny, maxx, maxy;
	Extents() { minx = 0.0, miny = 0.0, maxx = 0.0, maxy = 0.0; };
};
Extents getExtents(std::string inputfilepath)
{
	GDALDataset* poDataset;
	GDALAllRegister();  //注册所有的驱动
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
	poDataset = (GDALDataset*)GDALOpen(inputfilepath.c_str(), GA_ReadOnly);//打开数据集

	if (poDataset == NULL)
	{
		cout << "fail in open files!!!" << endl;
		exit(1);
	}

	//获取图像的尺寸
	int nImgSizeX = poDataset->GetRasterXSize();
	int nImgSizeY = poDataset->GetRasterYSize();

	//获取坐标变换系数
	double trans[6];
	CPLErr aaa = poDataset->GetGeoTransform(trans);
	//计算范围
	Extents extents;
	extents.minx = trans[0];
	extents.maxx = trans[0] + nImgSizeX * trans[1];
	extents.miny = trans[3] + nImgSizeY * trans[5];
	extents.maxy = trans[3];
	return extents;
}
std::string getProjectInformation(std::string inputfilepath)
int main()
{
	osgEarth::initialize();
	osgViewer::Viewer viewer;
	osgEarth::GLUtils::setGlobalDefaults(viewer.getCamera()->getOrCreateStateSet());
	osg::ref_ptr map = new Map();
	MapNode* mapNode;
	//map->addLayer(basemap);
	{
		//加载多块地形 
		string strimage, imagePathStr;
		//声明地形高程、影像名称
		string image1, image2, height1, height2;
		image1 = "E:\\LocalRepos_2022\\terrain\\多地形1_影像.tif";
		image2 = "E:\\LocalRepos_2022\\terrain\\多地形2_影像.tif";
		height1 = "E:\\LocalRepos_2022\\terrain\\多地形1_高程.tif";
		height2 = "E:\\LocalRepos_2022\\terrain\\多地形2_高程.tif";
		string srs;
		osgEarth::Map::Options options;
		options.cachePolicy() = osgEarth::CachePolicy::USAGE_READ_WRITE;
		srs = getProjectInformation(image1);

		osgEarth::ProfileOptions options1;
		options1.srsString() = srs;
		Extents bound;
		Extents bound2;
		bound = getExtents(image1);
		bound2 = getExtents(image2);
		osgEarth::Bounds bs(min(bound.minx,bound2.minx), min(bound.miny, bound2.miny), max(bound.maxx, bound2.maxx), max(bound.maxy, bound2.maxy));
		options1.bounds() = bs;
		options.profile() = options1;
		osg::ref_ptr map = new osgEarth::Map(options, nullptr); 
		mapNode = new MapNode(map.get());

		GDALImageLayer* terraini1 = new GDALImageLayer();
		terraini1->setURL(image1);
		map->addLayer(terraini1);
		
		GDALElevationLayer* terrainh1 = new GDALElevationLayer();
		terrainh1->setURL(height1);
		map->addLayer(terrainh1);

		GDALImageLayer* terraini2 = new GDALImageLayer();
		terraini2->setURL(image2);
		map->addLayer(terraini2);

		GDALElevationLayer* terrainh2 = new GDALElevationLayer();
		terrainh2->setURL(height2);
		map->addLayer(terrainh2);
	}

	osg::ref_ptr < osg::Group > root = new osg::Group;
	root->addChild(mapNode);
	viewer.setSceneData(root);
	viewer.setCameraManipulator(new EarthManipulator());
	MapNodeHelper().configureView(&viewer);
	return viewer.run();
}

你可能感兴趣的:(Osgearth,图形渲染,c++)