osgEarth使用笔记3——加载倾斜摄影数据

1. 概述

我在《OSG加载倾斜摄影数据》这篇博文中论述了如何通过OSG生成一个整体的索引文件,通过这个索引文件来正确显示ContextCapture(Smart3D)生成的倾斜摄影模型数据。这类倾斜摄影模型数据一般都会有个元数据metadata.xml,通过这个元数据,可以将其正确显示在osgEarth的数字地球上。

2. 详论

2.1. 位置

metadata.xml中的内容一般如下所示:
imglink1

SRS就是空间坐标参考的意思,ENU表示是东北天站心坐标系,站心点的经纬度坐标为(108.9594, 34.2196)。这个站心点对应的应该是倾斜摄影模型的中心点,那么思路就很简单了,只需要平移旋转这个倾斜摄影模型,使模型的中心点对应于站心点。这其实是个地心坐标系于站心坐标系转换的问题:
imglink2

在osgEarth中可以不用关心这个问题,其直接封装了一个类osgEarth::GeoTransform,可以直接通过这个类的接口来加载倾斜摄影模型:

std::string filePath = "D:/Data/scene/Dayanta/Data.osgb";
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(filePath);

osg::ref_ptr<osgEarth::GeoTransform> xform = new osgEarth::GeoTransform();
xform->addChild(node);
xform->setTerrain(mapNode->getTerrain());
osgEarth::GeoPoint point(map->getSRS(), 108.9594, 34.2196, -410);                 //使用绝对高,正高
xform->setPosition(point);

osg::ref_ptr<osgEarth::ModelLayer> modelLayer = new osgEarth::ModelLayer("oblic", xform);
map->addLayer(modelLayer);

给osgEarth::GeoTransform传入的osgEarth::GeoPoint就是站心点。不过这种类型的metadata.xml似乎都没有给出准确的高程值,所以需要自己调整高程来贴地。可能因为我这里试用的倾斜摄影数据都是网上找的,不太可能给出准确的地理坐标。

2.2. 着色

另外一点要注意的是直接读取加载的倾斜摄影模型是没有颜色信息的,这点和OSG还不太一样,在帮助文档里面论述了这个问题:
imglink3

所以一定要记得加上着色器渲染,否则倾斜摄影模型会变成白模:

osgEarth::Registry::shaderGenerator().run(node);

2.3. 其他

有的metadata.xml里面的内容是这样的:
imglink4

这个元数据的意思是这个倾斜摄影模型是根据EPSG编号为2384的空间参考坐标系下构建的。简单查了一下这个坐标系应该是xian80高斯克吕格平面投影直角坐标系,因为是用于三维数据,所以加上一个高程形成一个三维立体直角坐标系。严格意义上来讲,是需要将地球展成这个立体直角坐标系,将这个倾斜摄影模型放置到SRSOrigin的地理位置才是最准确的。但是一般的投影东向和北向的方向是不会变的,仍然可以将SRSOrigin的地理位置当成一个站心位置,只不过这个站心位置不再是经纬度而是EPSG:2384的平面坐标值(加上高程)。

所以像这种类型的数据,只需要将SRSOrigin的地理位置值转换成经纬度值,就变成2.1中描述的情况了。

3. 结果

具体的实现代码如下:

#include <Windows.h>
#include <iostream>
#include <string>

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>

#include <osgEarth/MapNode>

#include <osgEarthDrivers/gdal/GDALOptions>
#include <osgEarthDrivers/cache_filesystem/FileSystemCache>
#include <osgEarth/ImageLayer>
#include <osgEarth/Viewpoint>
#include <osgEarth/GeoTransform>
#include <osgEarth/ModelLayer>
#include <osgEarth/Registry>

#include <osgEarthUtil/EarthManipulator>

#include <gdal_priv.h>

using namespace std;

void AddModel(osg::ref_ptr<osgEarth::Map> map, osg::ref_ptr<osgEarth::MapNode> mapNode)
{
	//
	std::string filePath = "D:/Data/scene/Dayanta/Data.osgb";
	osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(filePath);

	osg::ref_ptr<osgEarth::GeoTransform> xform = new osgEarth::GeoTransform();
	xform->addChild(node);
	xform->setTerrain(mapNode->getTerrain());
	osgEarth::GeoPoint point(map->getSRS(), 108.9594, 34.2196, -410);                 //使用绝对高,正高
	xform->setPosition(point);

	osg::ref_ptr<osgEarth::ModelLayer> modelLayer = new osgEarth::ModelLayer("oblic", xform);
	map->addLayer(modelLayer);

	osgEarth::Registry::shaderGenerator().run(node);
}

int main()
{		
	CPLSetConfigOption("GDAL_DATA", "D:/Work/OSGNewBuild/OpenSceneGraph-3.6.4/3rdParty/x64/gdal-data");
	
	//string wktString = "EPSG:3857";			//web墨卡托投影
	//string wktString = "EPSG:4326";			//wgs84
	osgEarth::ProfileOptions profileOpts;
	//profileOpts.srsString() = wktString;
		
	//osgEarth::Bounds bs(535139, 3365107, 545139, 3375107);
	//osgEarth::Bounds bs(73, 3, 135, 53);
	//profileOpts.bounds() = bs;
		
	//地图配置:设置缓存目录
	osgEarth::Drivers::FileSystemCacheOptions cacheOpts;
	string cacheDir =  "D:/Work/OSGNewBuild/tmp";
	cacheOpts.rootPath() = cacheDir;
	
	//
	osgEarth::MapOptions mapOpts;   
	mapOpts.cache() = cacheOpts;
	//mapOpts.coordSysType() = osgEarth::MapOptions::CSTYPE_PROJECTED;

	mapOpts.profile() = profileOpts;

	//创建地图节点
	osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map(mapOpts);
	osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map);

	osgEarth::Drivers::GDALOptions gdal;
	//gdal.url() = "D:/Work/OSGNewBuild/osgearth-2.10.1/data/world.tif";
	//gdal.url() = "D:/Work/SinianGIS/bin/Resource/BlueMarbleNASA.jpg";
	gdal.url() = "D:/Work/SinianGIS/bin/Resource/baseMap.jpg";
	osg::ref_ptr<osgEarth::ImageLayer> imgLayer = new osgEarth::ImageLayer("BlueMarble", gdal);
	map->addLayer(imgLayer);
				   	  	
	AddModel(map, mapNode);

	osgViewer::Viewer viewer;
	viewer.getCamera()->setClearColor(osg::Vec4(0, 0, 0, 0));
	viewer.setSceneData(mapNode);
	
	osg::ref_ptr< osgEarth::Util::EarthManipulator> mainManipulator = new osgEarth::Util::EarthManipulator;
	viewer.setCameraManipulator(mainManipulator);

	osgEarth::Viewpoint vp;
	osgEarth::GeoPoint newPoint(map->getSRS(), 108.9594, 34.2196, 0);
	vp.focalPoint() = newPoint;
	vp.heading() = 0;
	vp.pitch() = -90;
	vp.range() = 1000;	
	mainManipulator->setViewpoint(vp);
	
	viewer.setUpViewInWindow(100, 100, 800, 600);

	return viewer.run();
}

运行结果如下:
imglink5

4. 参考

  1. GNSS学习笔记-坐标转换
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
### 回答1: wrf-chem数据下载的相关网址链接: 1. NCEP/NCAR Reanalysis I: ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/surface/ 2. Chemical Transport Model (CTM) data from the GEOS-Chem group: https://acmg.seas.harvard.edu/geos/ 3. Emissions data from the Emissions Database for Global Atmospheric Research (EDGAR): https://edgar.jrc.ec.europa.eu/ 4. The Community Multi-scale Air Quality (CMAQ) modeling system data: https://www.epa.gov/air-research/community-multiscale-air-quality-cmaq-modeling-system 请注意,不同的数据来源可能需要不同的许可证才能访问,请确保您具有访问所需数据的合法资格。 ### 回答2: WRF-Chem是一种大气化学模型,它用于模拟大气中化学物种的输运和转化过程。在建立WRF-Chem模型之前,我们需要收集和处理一些数据,以确保模型的准确性和可靠性。这些数据包括地理信息、排放数据、气象数据和化学初始和边界条件等。 首先,地理信息数据是建立WRF-Chem模型的基础。这些数据包括经纬度、高程和土地覆盖类型等信息,可以用于生成地形和表面辐射强度图。我们可以在https://www.ngdc.noaa.gov/上下载世界各地的地理数据。 其次,排放数据是描述大气中污染物来源和排放速率的关键数据。这些数据包括人工排放和自然排放两种来源。人工排放包括工业、交通和农业等活动产生的污染物,自然排放包括植被的插值和火山喷发等自然事件。各个国家和地区的排放数据可在Emission Database for Global Atmospheric Research (EDGAR) (https://www.sciencedirect.com/science/article/pii/S1352231009003904 )上下载。 第三,气象数据是WRF-Chem模型的必需数据。气象数据包括气温、风速、风向和湿度等逐小时或逐分钟的数据。我们可以在National Centers for Environmental Prediction (NCEP) (https://www.ncdc.noaa.gov/data-access/model-data/model-datasets)或European Center for Medium-Range Weather Forecasts (ECMWF) (https://www.ecmwf.int/en/forecasts/datasets)上下载气象数据。 最后,化学初始和边界条件数据是指大气中化学物种的浓度和化学反应速率等信息。这些数据通常由现场观测或其他化学模型得出,可以在全球化学输送模型 (GEOS-Chem) (http://acmg.seas.harvard.edu/geos/)上获取。 总之,WRF-Chem模型的建立需要以上四个基本数据。这些数据可以在相关数据下载网址上获取。但是,这些数据的质量和格式都需要我们认真审查和处理,以确保WRF-Chem模型的准确性和可靠性。 ### 回答3: wrf-chem是一种用于模拟大气物质输运和化学反应的数值模型。在进行wrf-chem模拟时,需要使用许多与气体和颗粒物浓度、化学反应等相关的数据。这些数据可以通过官方网站和其他一些数据平台进行下载。 其中,官方网站是wrf-chem模型最全面的数据源,开发者提供了许多与模型运行相关的数据和工具。这些数据包括了不同时间尺度上的气象模型、气体和颗粒物浓度模型、化学反应模型、辐射强度模型等。此外,网站中还提供了许多工具,例如反求模块、统计模块等,可以用于模型调试和后处理。下载方式为直接点击网站上的下载链接,选择相应的数据和工具即可。 另外,还有一些数据平台也可以提供相关数据的下载,例如NCAR Data Portal、Earth System Grid、国家气象信息中心等。这些平台通常提供了一些免费的数据下载服务,但需要用户进行注册和认证。同时,有些数据需要进行特定的格式转换,才能够被wrf-chem模型所使用。 总体来说,wrf-chem模型所需的数据比较丰富,但是通过官方网站和其他数据平台的配合,用户可以方便地获取这些数据,并进行相应的分析和后处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charlee44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值