osgEarth示例分析——osgearth_graticule

news2025/1/13 13:58:20

前言

本示例最具有借鉴的功能:绘制网格、网格上的文字显示、拾取地球的坐标。在地球网格示例中,可以设置4种网格。执行命令如下: 

// --geodetic
osgearth_graticuled.exe --geodetic earth_image\china-simple.earth
// --utm
osgearth_graticuled.exe --utm earth_image\china-simple.earth
// --mgrs
osgearth_graticuled.exe --mgrs earth_image\china-simple.earth
// --gars
osgearth_graticuled.exe --gars earth_image\china-simple.earth

运行状态如下:

--geodetic 显示经纬网格,且左上角是经纬高,WGS84坐标系下。

--utm 地球上显示的字符,左上角显示坐标信息,WGS84坐标系

 --utm 仅左上角显示坐标信息,高程为负值,是因为没有添加高程值,WGS84坐标系

 

--utm 仅左上角显示坐标信息,高程为负值,是因为没有添加高程值,WGS84坐标系 

 

类结构分析

不同的坐标系网格图层,适用不同的坐标格式化方式。

GARS坐标系:“GARS”经常作为“Global Area Reference System”的缩写来使用,中文表示:“全球区域参考系统”。

Geodetic坐标系: 是一种地球参考系和地心坐标系。它有WGS60、WGS66、WGS72、WGS84等,是全球定位系统(GPS)的参考构架。

UTM坐标系:UTM(Universal Transverse Mercator Grid System,通用横墨卡托格网系统)坐标是一种平面直角坐标,这种坐标格网系统及其所依据的投影已经广泛用于地形图,作为卫星影像和自然资源数据库的参考格网以及要求精确定位的其他应用。

MGRS坐标系:军事格网参考系 (MGRS) 是一种基于格网的参考系,用于在通用横轴墨卡托投影 (UTM) 和通用极方位立体投影 (UPS) 格网系中以字母数字字符串的形式表示位置。与定义特定点不同,MGRS 坐标定义的是地球表面上的某个区域。完全限定的 MGRS 字符串长度为 15 个字符,由以下三个部分组成:格网区域标识、100,000 平方米标识符以及东移/北移。

左上角显示经纬度信息的ui控件关系图:

 代码分析

#include <osg/Notify>
#include <osgGA/StateSetManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgEarth/MapNode>		// 地图节点
#include <osgEarthUtil/EarthManipulator>	// 地球操作器
#include <osgEarthUtil/MouseCoordsTool>		// 将鼠标下的地图坐标打印到LabelControl中的工具。
#include <osgEarthUtil/MGRSFormatter>		// 将坐标数据格式化为MGRS。
#include <osgEarthUtil/LatLongFormatter>	// 格式化大地坐标(纬度/经度)。

#include <osgEarthUtil/GeodeticGraticule>	// 处理网格
#include <osgEarthUtil/MGRSGraticule>		// MGRS网格
#include <osgEarthUtil/UTMGraticule>		// UTM网格
#include <osgEarthUtil/GARSGraticule>		// GARS网格

using namespace osgEarth::Util;
using namespace osgEarth::Annotation;

int
usage( const std::string& msg )
{
    OE_NOTICE 
        << msg << std::endl
        << "USAGE: osgearth_graticule [options] file.earth" << std::endl
        << "   --geodetic            : display a Lat/Long graticule" << std::endl
        << "   --utm                 : display a UTM graticule" << std::endl
        << "   --mgrs                : display an MGRS graticule" << std::endl
        << "   --gars                : display a GARS graticule" << std::endl;
    return -1;
}

//------------------------------------------------------------------------

int
main(int argc, char** argv)
{
	// 执行时,程序名 + earth路径
    osg::ArgumentParser arguments(&argc,argv);
    osgViewer::Viewer viewer(arguments);

    // parse command line:
    bool isUTM = arguments.read("--utm");
    bool isMGRS = arguments.read("--mgrs");
    bool isGeodetic = arguments.read("--geodetic");
    bool isGARS = arguments.read("--gars");

    // load the .earth file from the command line.
    MapNode* mapNode = MapNode::load( arguments );
    if ( !mapNode )
        return usage( "Failed to load a map from the .earth file" );

    // install our manipulator:
    viewer.setCameraManipulator( new EarthManipulator() );

    // root scene graph:
    osg::Group* root = new osg::Group();
    root->addChild( mapNode );

	// 坐标格式器的接口类
    Formatter* formatter = 0L;
    if ( isUTM )
    {
        UTMGraticule* gr = new UTMGraticule();	// UTM网格
        mapNode->getMap()->addLayer(gr);		// 将UTM网格加入到图层
        formatter = new MGRSFormatter();
		std::cout << "isUTM,Universal Transverse Mercator Grid System,通用横墨卡托格网系统" << std::endl;
    }
    else if ( isMGRS )
    {
        MGRSGraticule* gr = new MGRSGraticule();
        mapNode->getMap()->addLayer(gr);
        formatter = new MGRSFormatter();
		std::cout << "isMGRS,军事格网参考系 (MGRS) " << std::endl;
    }
    else if ( isGARS )
    {
        GARSGraticule* gr = new GARSGraticule();
        mapNode->getMap()->addLayer(gr);
        formatter = new LatLongFormatter();
		std::cout << "isGARS: Global Area Reference System--全球区域参考系统" << std::endl;
    }
    else // if ( isGeodetic )
    {
        GeodeticGraticule* gr = new GeodeticGraticule();
        mapNode->getMap()->addLayer(gr);
        formatter = new LatLongFormatter();
		std::cout << "isGeodetic,大地测量地心坐标系" << std::endl;
    }
   
    // mouse coordinate readout:
    ControlCanvas* canvas = new ControlCanvas();// 将控件与OSG视图关联对象
    root->addChild( canvas );
    VBox* vbox = new VBox();// 垂直布局,垂直堆叠控件的容器。
    canvas->addControl( vbox );

    LabelControl* readout = new LabelControl();// 包含字符串的控件
    vbox->addControl( readout );

    MouseCoordsTool* tool = new MouseCoordsTool( mapNode );//将鼠标下地图坐标写入控件
    tool->addCallback( new MouseCoordsLabelCallback(readout, formatter) );
    viewer.addEventHandler( tool );


    // disable the small-feature culling
    viewer.getCamera()->setSmallFeatureCullingPixelSize(-1.0f);

    // set a near/far ratio that is smaller than the default. This allows us to get
    // closer to the ground without near clipping. If you need more, use --logdepth
    viewer.getCamera()->setNearFarRatio(0.0001);


    // finalize setup and run.
    viewer.setSceneData( root );
    viewer.addEventHandler(new osgViewer::StatsHandler());
    viewer.addEventHandler(new osgViewer::WindowSizeHandler());
    viewer.addEventHandler(new osgViewer::ThreadingHandler());
    viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
    return viewer.run();
}

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

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

相关文章

[附源码]Python计算机毕业设计Django大学生心理测评系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

磁盘划分和磁盘格式化

文章目录列出装置的 UUID 等参数parted 列出磁盘的分区表类型与分区信息磁盘分区&#xff1a;gdisk、fdisk用 gdisk 新增分区槽用 gdisk 删除一个分区槽磁盘格式化&#xff08;建立文件系统&#xff09;XFS 文件系统 mkfs.xfsXFS 文件系统 for RAID 效能优化&#xff08;Option…

【Linux】环境变量

文章目录一.什么是环境变量二.常见的环境变量1.常见的环境变量和与之相关的命令2.PATH指定命令搜索路径3.env显示所有环境变量4.echo查看环境变量三.本地变量与环境变量的联系四.获取环境变量的三种方式1.getenv()函数获取环境变量2.利用命令行参数3.利用第三方变量一.什么是环…

如何校准Linux服务器时间

最近服务器上的时间与北京时间出现偏差&#xff0c;而Java代码里java.util.Date获取的是服务器时间&#xff0c;导致当前时间错误。 Linux查看服务器当前时间 查看当前时区&#xff1a;date -R 查看当前日期和时间&#xff1a;date 校准Linux服务器时间 Linux中有个ntp包可…

【Unity】URP渲染管线下代码获取相机的Volume Mask属性

步骤1. 引用URP的命名空间2. 获取摄像机3.通过URP扩展获取Volume Mask属性附 层级的相关代码Reference1. 引用URP的命名空间 using UnityEngine.Rendering.Universal;2. 获取摄像机 这里可以使用公有拖拽或者私有赋值的方式。 如果使用拖拽&#xff0c;则&#xff1a; publi…

神经网络和深度学习-多分类问题Softmax Classifier

多分类问题Softmax Classifier 在之前做糖尿病数据集的时候做的二分类问题&#xff0c;因为只有两类&#xff0c;所以只需要输出一个概率值&#xff0c;另一个概率值用1去减去就可以得到 实际上在大多数数据集中是在处理一个多分类问题&#xff0c;例如MNIST中有10类标签 神经…

Hifiasm-meta | 你没看错!基于宏基因组的完成图!!

哈佛大学医学院Dana-Farber癌症研究所李恒课题组重磅推出三代HiFi宏基因组组装软件——hifiasm-meta。研究论文“Metagenome assembly of high-fidelity long reads with hifiasm-meta”预印本在线发布。 宏基因组样本的do novo组装是研究微生物群落的常用方法。与单个物种的组…

RNA-seq 详细教程:分析准备(3)

学习目标 了解 RNA-seq 和差异表达基因的分析流程了解如何设计实验了解如何使用 R 语言进行数据分析1. 简介 在过去的十年中&#xff0c;RNA-seq 已成为转录组差异表达基因和 mRNA 可变剪切分析不可或缺的技术。正确识别哪些基因或转录本在特定条件下的表达情况&#xff0c;是理…

【FreeRTOS(四)】显示任务详细信息

文章目录显示任务详细信息 vTaskList代码示例显示任务详细信息 vTaskList 通过 vTaskList来协助分析操作系统当前 task 状态&#xff0c;以帮助优化内存&#xff0c;帮助定位栈溢出问题。 void vTaskList( char *pcWriteBuffer );parameterdescriptionpcWriteBuffer保存任务状态…

11.21~11.28日学习总结

首先这一周&#xff0c;主要进行的几个事情。 1.在星期一~星期二图书报账的相关事情处理已经完毕&#xff0c;记录了现在图书报账的相关流程&#xff0c;比以前的流程有不少改变&#xff0c;已经写了word记录了流程&#xff0c;给下一任图书管理员做参考。 2.进行了项目的中期…

mysql集群的主从复制搭建

1.master上和slave分别安装好mysql&#xff08;5.7&#xff09; 2.按照下面的方式进行安装 3.安装完成后&#xff0c;进行初始化&#xff0c;并找到默认的密码进行登录 4.设置为开机自&#xff0c;并检查状态 5.进行登录&#xff0c;用root账户&#xff0c;密码为生成的那个密码…

C++:STL之Vector实现

vector各函数 #include<iostream> #include<vector> using namespace std;namespace lz {//模拟实现vectortemplate<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//默认成员函数vector(); …

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布jar包

1、创建一个SpringBoot项目 下载项目之后将项目导入IDEA 2、如何添加外部jar包 准备一个外部的jar包&#xff0c; 我这里使用的是guava-31.1-jre.jar作为演示 下载地址&#xff1a;https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar 在项…

黎曼的几何基础,维度

黎曼的几何基础&#xff0c;让数学领先物理100年&#xff0c;维度是人类最大的障碍 - 知乎 高斯很早就有了“高维几何”的想法&#xff0c;他曾经向他的同事们说起假想完全生活在二维表面上的“书虫”&#xff0c;并想要把这推广到高维空间的几何学中去。然而&#xff0c;由于害…

Java安全编码规范之Web安全漏洞

Java安全编码规范之Web安全漏洞安全现状漏洞案例事件一事件二事件三安全编码规范之常见的安全漏洞敏感数据编码概述漏洞危害常见关键字举例解决方案代码硬编码秘钥错误示例日志打印导致的敏感信息泄露漏洞概述关键字举例解决方案代码中在日志打印token 错误示例文件上传漏洞概述…

CSDN客诉周报第12期|修复10个重大bug,解决29个次要bug,采纳1个用户建议

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉周报》第12期&#xff0c;接下来就请大家一同回顾我们最近几周解决的bug&#xff5e; 一、重大问题 1、【博客】主页无法访问 反馈量&#xff1a;80 发生时间&#xff1a;10月30日下…

外汇天眼:Axi收回在RGT Capital的全部控制权,Eurotrader获得FCA牌照

在过去的一周里&#xff0c;国外外汇市场上有哪些值得关注的新闻&#xff0c;跟着天眼君一起了解下吧~具体新闻如下&#xff1a; 1、Axi收回在RGT Capital的全部控制权 据天眼君了解&#xff0c;总部位于澳大利亚的零售外汇和差价合约经纪商Axi在澳大利亚投资公司RGT Capital的…

AutoDL使用手册

官网&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL 1.服务器购买 2.新建虚拟环境 conda create -n tf python3.8 # 构建一个虚拟环境&#xff0c;名为&#xff1a;tf conda init bash && source /root/.bashrc # 更新bashrc中的环境变量 conda acti…

【Flink】使用水位线实现热门商品排行以及Flink如何处理迟到元素

文章目录一 WaterMark1 水位线特点总结2 实时热门商品【重点】&#xff08;1&#xff09;数据集&#xff08;2&#xff09;实现思路a 分流 - 开窗 - 聚合分流&#xff1a;开窗&#xff1a;聚合&#xff1a;b 再分流 -- 统计再分流&#xff1a;统计&#xff1a;&#xff08;3&am…

【Hack The Box】Linux练习-- Seventeen

HTB 学习笔记 【Hack The Box】Linux练习-- Seventeen &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f…