6.OsgEarth加载倾斜摄影

news2024/12/26 10:50:14

愿你出走半生,归来仍是少年!

        三维场景中常用的地表模型包含倾斜摄影,通过CC处理出来的倾斜摄影是一个通过文件夹进行分块的,然后通过元数据记录了其空间位置信息(原点)。

        本文通过解析metadata.xml文件后进行多块情况的批量加载。

1.倾斜数据解读

        一般来说包含一个data文件夹和一个metadata.xml文件。

CC倾斜

        在metadata.xml中包含了坐标系定义以及原点信息。

<?xml version="1.0" encoding="utf-8"?>
<ModelMetadata version="1">
	<!--Spatial Reference System-->
	<SRS>EPSG:4523</SRS>
	<!--Origin in Spatial Reference System-->
	<SRSOrigin>35413650,3392689,0</SRSOrigin>
	<Texture>
		<ColorSource>Visible</ColorSource>
	</Texture>
</ModelMetadata>

        其中SRS节点代表坐标系,SRSOrigin代表原点。通过tinyxml2库可进行解析获取坐标。

        在data文件夹中包含若干子文件夹,都是一块一块的倾斜数据。每个文件夹中有一个和文件夹同名的osgb文件,它是最顶级的节点。然后其他的是不同层级下的节点。

文件夹
每个文件夹内的数据

 

 2.代码

 2.1.Metadata.xml解析

        通过tinyxml2库进行xml解析,并将对应的数据转换为我们需要的osg对象。

        通过xml中的Srs我们构建出了osgEarth::SpatialReference对象作为原始数据的坐标参照。

        通过xml中的SRSOriginin我们构建出了osgEarth::GeoPoint作为模型位置。

string parentDicPath = FileUtility::getParentDic(dataFolderPath);

string  metaPath = parentDicPath + "/metadata.xml";

if (FileUtility::exist(metaPath))
{
tinyxml2::XMLDocument doc;

tinyxml2::XMLError error = doc.LoadFile(metaPath.c_str());

if (error != tinyxml2::XML_SUCCESS) {

 

	throw  "读取 xml 失败";

	return NULL;
}

auto xmlRoot = doc.RootElement();

auto srsElement = xmlRoot->FirstChildElement("SRS");

string srsValue = srsElement->GetText();

boost::to_upper(srsValue);

boost::replace_all(srsValue, "EPSG:", "");

int srsId = std::stoi(srsValue);

osgEarth::SpatialReference* srs = Cv::SrsSource::getSrs(srsId);

auto srsOriginElement = xmlRoot->FirstChildElement("SRSOrigin");

string srsOriginValue = srsOriginElement->GetText();

std::vector<std::string> xyz;

boost::split(xyz, srsOriginValue, boost::is_any_of(","), boost::token_compress_on);

double x = std::stod(xyz[0]);

double y = std::stod(xyz[1]);

double z = std::stod(xyz[2]);

osgEarth::GeoPoint position(srs, x, y, 30);

auto pos4326 = position.transform(SpatialReference::get("wgs84"));
}

 2.2.ModelLayer创建

        通过遍历data文件夹下的子文件夹,将osgb文件一个一个的加载进来。

        需要注意的是,我们建立的ModelLayer不是用过SetURL方法加载的模型数据,而是通过了SetNode方法区加载的一个GeoTransform节点。通过这个节点区包含了所以的子节点。同时通过了osgEarth::Registry::shaderGenerator().run(node)增加了着色渲染器。

        同时给modelLayer添加了位置方便定位使用。

auto childOsgbFolders = FileUtility::getChildFolders(std::filesystem::path(dataFolderPath));

 
osg::ref_ptr<osgEarth::GeoTransform> xform = new osgEarth::GeoTransform();

for (size_t i = 0; i < childOsgbFolders.size(); i++)
{
	auto folder = childOsgbFolders[i];


	auto osgbPath = folder.string() + "/" + folder.filename().string() + ".osgb";

	bool exist = FileUtility::exist(osgbPath);


	auto node = osgDB::readNodeFile(osgbPath);


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

	xform->addChild(node);
	 

}

xform->setPosition(pos4326);


ref_ptr<osgEarth::ModelLayer> modelLayer = new osgEarth::ModelLayer();


modelLayer->setLocation(pos4326);

modelLayer->setNode(xform);

modelLayer->setName("倾斜摄影");

 2.3.加载

        通过map的addlayer将图层加载进入地球进行了。

3.效果

加载成功
成功效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Handler原理机制解析,Android开发中的重要性

Handler在android程序开发中使用的非常频繁、我们知道android是不允许在子线程中更新UI的&#xff0c;这就需要借助Handler来实现&#xff0c;那么你是否想过为什么一定要这个这样子做呢&#xff1f;而且Handler的内部消息处理机制究竟是什么样的呢&#xff1f;Handler的原理是…

Redis(11)| 持久化AOF和RDB

一、AOF&#xff08;Append Only File&#xff09; Redis 每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到一个文件里&#xff0c;然后重启 Redis 的时候&#xff0c;先去读取这个文件里的命令&#xff0c;并且执行它。 注意&#xff1a;只会记录写操作命令&am…

YOLOv7输出COCOmAP指标:输出自定义数据集中small、medium、large大中小目标的mAP值S,M,L指标,适用于自定义数据集

💡更多改进内容📚可以点击查看:YOLO改进原创目录 | 老师联袂推荐🏆 💡🚀🚀🚀内含改进源代码,按步骤操作运行改进后的代码即可,内附代码💡更方便的统计更多实验数据,方便写作 芒果改进 | YOLOv5 输出自定义数据集中 S,M,L指标大中小目标的mAP值 点这篇链…

华山编程培训中心——工业相机飞拍

飞拍功能是一种高速运动图像采集技术&#xff0c;通过降低相机的曝光时间来拍摄快速移动的对象&#xff0c;以提高工作效率和加快生产速度。下面视频演示工业相机飞拍&#xff1a; 上位机控制工业相机飞拍演示 一. 飞拍对相机硬件的要求 全局快门相机&#xff1a;飞拍要求相机…

树结构及其算法-二叉查找树

目录 树结构及其算法-二叉查找树 C代码 树结构及其算法-二叉查找树 二叉树在建立的过程中是根据“左子树 < 树根 < 右子树”的原则建立的&#xff0c;因此只需从树根出发比较键值即可&#xff0c;如果比树根大就往右&#xff0c;否则往左而下&#xff0c;直到相等就找…

网易按照作者批量采集新闻资讯软件说明文档

大家好&#xff0c;我是淘小白~ 今天给大家介绍的爬虫软件是网易按照作者采集的软件 1、软件语言&#xff1a; Python 2、使用到的工具 Python selenium库、谷歌浏览器、谷歌浏览器驱动 3、文件说明&#xff1a; 4、配置文件说明&#xff1a; 5、环境配置 安装Python&am…

【Linux笔记】Linux进程概念与进程状态

【Linux笔记】Linux进程概念与进程状态 一、什么是进程1.1、进程的概念1.2、进程的描述 二、关于进程的一些基本操作2.1、查看进程2.2、杀进程2.3、获取进程id2.4、创建进程 三、进程状态3.1、普适操作系统中的进程状态3.2、具体到Linux操作系统中的进程状态 四、僵尸进程和孤儿…

创建ABAP数据库表和ABAP字典对象-使用基本类型增加账号字段03

新增字段 现在你将增加字段&#xff1a;account_number,基于基本类型 1.输入以下内容(包括句点)&#xff0c;然后选择“代码补全”(Ctrl空格): key account_number : abap.2.从下拉列表中选择numc(len)并指定len为8。另外&#xff0c;指定这个关键字段为not null: key accoun…

深入浅出理解深度可分离卷积(Depthwise Separable Convolution)

一、参考资料 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】 卷积神经网络中的Separable Convolution 深度学习中常用的几种卷积&#xff08;下篇&#xff09;&#xff1a;膨胀卷积、可分离卷积&#…

postgresql 触发器如何生成递增序列号,从1开始,并且每天重置

大家好&#xff0c;我是三叔&#xff0c;许久不见&#xff0c;这期给大家介绍一下笔者在开发中遇到的业务处理&#xff1a;pgsql 创建触发器生成每日递增序列&#xff0c;并且第二天重置&#xff0c;根据不同的用户进行不同的控制。 1.创建生成递增序列的 table 表 -- 创建us…

新手必看的Facebook广告投放基础思路

一、广告账号要求 如果您还没有Facebook账号&#xff0c;那么第一步是准备Facebook账号。 1、配置正确的网络环境 Facebook账号需要在稳定安全的网络环境中运行&#xff0c;否则很容易导致封禁。像我们常用的是Maskfog指纹浏览器&#xff0c;可以通过自定义浏览器指纹与为环…

计算机网络第4章-网络层(1)

引子 网络层能够被分解为两个相互作用的部分&#xff1a; 数据平面和控制平面。 网络层概述 路由器具有截断的协议栈&#xff0c;即没有网络层以上的部分。 如下图所示&#xff0c;是一个简单网络&#xff1a; 转发和路由选择&#xff1a;数据平面和控制平面 网络层的作用…

Plist编辑软件 PlistEdit Pro mac中文版功能介绍

PlistEdit Pro mac是一款功能强大的Plist文件编辑软件。Plist文件是苹果公司开发的一种XML文件格式&#xff0c;用于存储应用程序的配置信息和数据。PlistEdit Pro可以帮助用户轻松地编辑和管理Plist文件。 PlistEdit Pro具有直观的用户界面和丰富的功能。用户可以使用该软件打…

【计算机网络】网络层——IP

目录 1.概念2.协议格式3.网络划分ip组成IP地址分类IP地址数量私网IP和公网IP子网掩码路由 1.概念 引入 应用层http协议是进行构建和解析请求request和响应response。 传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是&#xff0c;UDP协议并不保证数…

Java八大排序——归并排序

1.什么是归并排序 归并排序是一种基于分治思想的排序算法&#xff0c;它将待排序的序列分成若干个子序列&#xff0c;每个子序列都是有序的&#xff0c;然后再将这些有序的子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn)&#xff0c;是一种稳定的排序算法。除了排…

数据分析和用户个性化体验:开发同城外卖APP的技术解决方案

在数字化时代&#xff0c;外卖服务已经成为人们日常生活中不可或缺的一部分。无论是忙碌的白领、学生&#xff0c;还是家庭主妇&#xff0c;都倚赖同城外卖APP来方便地满足他们的饥饿需求。然而&#xff0c;随着竞争的激烈&#xff0c;外卖APP必须不断改进&#xff0c;以满足用…

ajax调用springboot后台接口

工具 api测试工具 由于后台接口不是同一个团队编写的&#xff0c;在文档缺失的情况下&#xff0c;需要测试后台接口接收参数类型&#xff0c;可以使用这个工具&#xff0c;注册很方便 页面如下所示&#xff0c;可以选择请求方法是get&#xff0c;或者post 重点介绍两种&…

SpireCV如何利用TensorRT加速?

TensorRT简介 TensorRT是NVIDIA推出的一款高性能的深度学习推理引擎(C库)。相比于一般的深度学习框架&#xff0c;在GPU模式下其可提供36X的加速&#xff0c;极大提高了深度学习模型在边缘设备上的推断速度&#xff0c;以满足无人机、无人车等无人系统的快速视觉检测场景。 Te…

Google play开发者账号隔离用指纹浏览器还是vps?哪个防关联效果更佳?

很多谷歌安卓开发者会通过矩阵、马甲包的方式&#xff0c;在Google play应用商店上获得更多的流量和收益&#xff0c;这需要多个开发者账号&#xff0c;因此开发者账号隔离问题的重要性不言而喻。 在Google play开发者账号的隔离防关联问题上&#xff0c;使用vps和指纹浏览器是…

Oracle(12)Managing Indexes

目录 目标&#xff1a; 一、基础知识 1、Classification ofindexes 索引的分类 2、B-Tree vs Bitmap 3、Creating Indexes: Guidelines 创建索引:准则 4、Offline Index Rebuild 脱机索引重建 5、RebuildingIndexes 重建索引 6、Online Index Rebuild 在线索引重建 7…