osgEarth之添加shp

目录

效果

代码

代码分析

加载模式


效果

代码

#include "stdafx.h"
#include <osg/Notify>
#include <osgGA/StateSetManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgEarth/MapNode>
#include <osgEarth/ImageLayer>
#include <osgEarth/ModelLayer>
#include <osgEarthUtil/ExampleResources>
#include <osgEarthUtil/EarthManipulator>

#include <osgEarthSymbology/Style>
#include <osgEarthFeatures/FeatureModelLayer>

#include <osgEarthDrivers/gdal/GDALOptions>
#include <osgEarthDrivers/feature_ogr/OGRFeatureOptions>
#include <osgEarthDrivers/agglite/AGGLiteOptions>

using namespace osgEarth;
using namespace osgEarth::Features;
using namespace osgEarth::Drivers;
using namespace osgEarth::Symbology;
using namespace osgEarth::Util;

int usage(const std::string& app)
{
	OE_NOTICE "\n" << app << "\n"	// 绘制特征的方法
		<< "  --rasterize           : draw features as rasterized image tiles \n" // 光栅化平铺瓦片图
		<< "  --drape               : draw features as projected texture \n"	// 投影纹理
		<< "  --clamp               : draw features using shader clamping \n"	// 使用贴地着色器
		<< "  --mem                 : load features from memory \n"				// 加载默认线
		<< "  --labels              : add feature labels \n"					// 添加文本标签
		<< "\n"
		<< MapNodeHelper().usage()
		<< std::endl;

	return 0;
}

//
// NOTE: run this sample from the repo/tests directory.
//
int main(int argc, char** argv)
{
	osg::ArgumentParser arguments(&argc, argv);

	if (arguments.read("--help"))
		return usage(argv[0]);

	// cmd执行命令时,输入: osgearth_featuresd.exe --rasterize --mem --labels --drape --clamp (一些参数)
	// 当输入了某个参数,则获取到的值为1,否则为0
	/*bool useRaster = arguments.read("--rasterize");
	bool useMem = arguments.read("--mem");
	bool useLabels = arguments.read("--labels");
	bool useDraping = arguments.read("--drape");
	bool useClamping = arguments.read("--clamp");*/
	bool useRaster = true;
	bool useMem = true;
	bool useLabels = true;
	bool useDraping = true;
	bool useClamping = true;
	std::cout << useRaster << useMem << useLabels << useDraping << useClamping << std::endl;

	osgViewer::Viewer viewer(arguments);

	// Start by creating the map:
	Map* map = new Map();

	// Start with a basemap imagery layer; we'll be using the GDAL driver
	// to load a local GeoTIFF file:
	// 添加默认地图
	GDALOptions basemap;// GDAL选项类,继承自TileSourceOptions
	basemap.url() = "../data/world.tif";
	map->addLayer(new ImageLayer(ImageLayerOptions("basemap", basemap)));

	// Next we add a feature layer. 
	// 添加shp文件
	OGRFeatureOptions featureData;
	if (!useMem)
	{
		// Configures the feature driver to load the vectors from a shapefile:
		// 如果给出相对路径,则国界线总是加载不上
		// 此处必须给全路径!!!
		featureData.url() = "F:\\point-cloud-lab-new\\PointCloudLab\\GeoEngine_output\\data\\world.shp";
		std::cout << "add world.shp" << std::endl;
	}
	else
	{
		// the --mem options tells us to just make an in-memory geometry:
		// 当没有 --mem参数时,采用默认的line绘制
		Ring* line = new Ring();
		line->push_back(osg::Vec3d(60, 20, 0));
		line->push_back(osg::Vec3d(120, 20, 0));
		line->push_back(osg::Vec3d(120, 60, 0));
		line->push_back(osg::Vec3d(60, 60, 0));
		featureData.geometry() = line;
		std::cout << "don't add world.shp" << std::endl;
	}

	// Make a feature source layer and add it to the Map:
	// 制作特征源图层并添加到map
	FeatureSourceLayerOptions ogrLayer;
	ogrLayer.name() = "vector-data";// 矢量数据
	ogrLayer.featureSource() = featureData;// shp 文件或者默认line
	map->addLayer(new FeatureSourceLayer(ogrLayer));

	// Define a style for the feature data. Since we are going to render the
	// vectors as lines, configure the line symbolizer:
	// 设置矢量面样式(包括边界线)
	Style style;

	LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>();
	ls->stroke()->color() = Color::Yellow;
	ls->stroke()->width() = 2.0f;// 可以将线宽设置宽一些,更容易看出不同参数useDraping和useClamping产生的区别
	ls->tessellationSize()->set(100, Units::KILOMETERS);// 细分程度

	if (useDraping)//是否设置drape属性
	{
		AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
		alt->clamping() = alt->CLAMP_TO_TERRAIN;
		alt->technique() = alt->TECHNIQUE_DRAPE;
		std::cout << "drape" << std::endl;
	}

	else if (useClamping)// 贴地属性
	{
		AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
		alt->clamping() = alt->CLAMP_TO_TERRAIN;
		alt->technique() = alt->TECHNIQUE_GPU;
		// 线的细分程度
		ls->tessellationSize()->set(100, Units::KILOMETERS);

		RenderSymbol* render = style.getOrCreate<RenderSymbol>();
		render->depthOffset()->enabled() = true;
		render->depthTest() = false;
		std::cout << "no drape,but clamp" << std::endl;
	}

	if (useRaster)// 光栅化
	{
		AGGLiteOptions rasterOptions;
		rasterOptions.featureOptions() = featureData;
		rasterOptions.styles() = new StyleSheet();
		rasterOptions.styles()->addStyle(style);
		map->addLayer(new ImageLayer("My Features", rasterOptions));
		std::cout << "raster" << std::endl;
	}

	else //if (useGeom)
	{
		FeatureModelLayerOptions fml;
		fml.name() = "My Features";
		fml.featureSourceLayer() = "vector-data";
		fml.styles() = new StyleSheet();
		fml.styles()->addStyle(style);
		// fml.enableLighting() = false;

		map->addLayer(new FeatureModelLayer(fml));
		std::cout << "no raster" << std::endl;
	}

	if (useLabels && !useRaster)// 有标签且非光栅化
	{
		// set up symbology for drawing labels. We're pulling the label
		// text from the name attribute, and its draw priority from the
		// population attribute.
		// 设置文本样式
		Style labelStyle;

		TextSymbol* text = labelStyle.getOrCreateSymbol<TextSymbol>();
		text->content() = StringExpression("[cntry_name]");//如果需要显示汉字,则需要转换成UTF-8编码
		text->priority() = NumericExpression("[pop_cntry]");
		text->size() = 26.0f;// 字号有些大
		text->alignment() = TextSymbol::ALIGN_CENTER_CENTER;
		text->fill()->color() = Color::White;
		text->halo()->color() = Color::DarkGray;// 文字光环颜色

		// and configure a model layer:
		FeatureModelLayerOptions fml;
		fml.name() = "Labels";
		fml.featureSourceLayer() = "vector-data";
		fml.styles() = new StyleSheet();
		fml.styles()->addStyle(labelStyle);

		map->addLayer(new FeatureModelLayer(fml));
		std::cout << "no raster, but labels" << std::endl;
	}

	// That's it, the map is ready; now create a MapNode to render the Map:
	MapNode* mapNode = new MapNode(map);

	viewer.setSceneData(mapNode);
	viewer.setCameraManipulator(new EarthManipulator());

	// add some stock OSG handlers:
	MapNodeHelper().configureView(&viewer);

	return viewer.run();
}

代码分析

osgEarth表达矢量的基本思路是:

  • 先将shp文件读取到矢量源图层FeatureSourceLayer中,
  • 这个图层加载到osgEarth的图层列表中是不显示的,
  • 必须得再加载一个专门的符号化图层,将其符号化,才能正常显示。

 
 
1. 先声明基础地图
osgEarth::Drivers::GDALOptions basemap;
basemap.url() = "world.tif";
// 添加影像图到map节点
map->addLayer( new ImageLayer(ImageLayerOptions("basemap", basemap)));
 
 
2. 加载特征数据
osgEarth::Drivers::OGRFeatureOptions featureData;
featureData.url() = "world.shp";
// 特征源图层选项设置
osgEarth::Features::FeatureSourceLayerOptions ogrLayer;
ogrLayer.name() = "vector-data";
ogrLayer.featureSource() = featureData;
map->addLayer(new osgEarth::Features::FeatureSourceLayer(ogrLayer));
 
/*******↑featureData添加到FeatureSourceLayer,*****↓符号化*******/
 
3.初始化线样式
// 对ls alt render 进行设置
Style style;
osgEarth::Symbology::LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>();
osgEarth::Symbology::AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
osgEarth::Symbology::RenderSymbol* render = style.getOrCreate<RenderSymbol>();
 
 
4.光栅化或矢量化,二选一
4.1光栅化
osgEarth::Drivers::AGGLiteOptions rasterOptions;
rasterOptions.featureOptions() = featureData;
rasterOptions.styles()->addStyle( style );
map->addLayer(new ImageLayer("My Features", rasterOptions) );
 
4.2矢量化
osgEarth::Features::FeatureModelLayerOptions fml;
fml.styles()->addStyle(style);
map->addLayer(new FeatureModelLayer(fml));
 
5.如果需要加入label样式,以矢量化为前提
osgEarth::Symbology::Style labelStyle;
osgEarth::Symbology::TextSymbol* text = labelStyle.getOrCreateSymbol<TextSymbol>();
FeatureModelLayerOptions fml;
fml.styles()->addStyle( labelStyle );
map->addLayer(new FeatureModelLayer(fml));

加载模式

// rasterize 光栅化,不输入时,会显示名称
// mem参数输入,加载矩形,否则加载world.shp文件。shp文件路径一定要写全路径,否则无法加载。
// labels 可以不用填写。
// clamp 和 drape 任选其一。
 
// 采用clamp方式绘制
osgearth_featuresd.exe --rasterize --mem --labels --clamp
 
// 采用drape方式绘制
osgearth_featuresd.exe --rasterize --mem --labels --drape
 
// 还有多种组合方式
osgearth_featuresd.exe --labels --drape

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP-guard WebServer 远程命令执行漏洞

IP-guard WebServer 远程命令执行漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: app="ip-guard"漏洞复现1. 构造poc2. 访问文件3. 执行命令免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平。 任何人不得…

高速信号PCB布局怎么布?(电子硬件)

对于高速信号&#xff0c;pcb的设计要求会更多&#xff0c;因为高速信号很容易收到其他外在因素的干扰&#xff0c;导致实际设计出来的东西和原本预期的效果相差很多。 所以在高速信号pcb设计中&#xff0c;需要提前考虑好整体的布局布线&#xff0c;良好的布局可以很好的决定布…

AI:67-基于深度学习的脱机手写汉字识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

Django(二、静态文件的配置、链接数据库MySQL)

文章目录 一、静态文件及相关配置1.以登录功能为例2.静态文件3.资源访问4.静态文件资源访问如何解决&#xff1f; 二、静态文件相关配置1. 如何配置静态文件配置&#xff1f;2.接口前缀3. 接口前缀动态匹配4. form表单请求方法补充form表单要注意的点 三、request对象方法reque…

阿里云 :推出通义大模型编码助手产品【通义灵码】

本心、输入输出、结果 文章目录 阿里云 &#xff1a;推出通义大模型编码助手产品【通义灵码】前言通义灵码简介主要功能主要功能点 支持的语言和 IDEjetbrains IDEA 安装计费相关弘扬爱国精神 阿里云 &#xff1a;推出通义大模型编码助手产品【通义灵码】 编辑&#xff1a;简简…

SOLIDWORKS --电磁仿真篇

什么是 SIMULIA? 基于3DEXPERIENCE平台的品牌 多学科多领域的协同仿真与分析优化 三大核心仿真领域 结构仿真 流体仿真 SIMULIA电磁仿真是什么? 完备的求解技术&#xff0c;支持从静场、低频到高频、光波的电磁仿真&#xff0c;支持全波仿真、混合仿真、多物理场仿真和场路…

任务管理器的正确使用教程

快捷键 Ctrlshiftesc&#xff1a;进入任务管理器 我以Win11举例 如何给XX排序 给XX排序&#xff0c;点击空白处可以选择某项降序排列&#xff08;可以找到最占用某项资料的程序&#xff09;&#xff0c;再点击空白处可以选择某项升序排列 文件正在使用&#xff0c;如何解决 …

台式电脑怎么无损备份迁移系统到新硬盘(使用傲梅,免费的就可以)

文章目录 前言一、想要将源硬盘上的系统原封不动地迁移到新硬盘上二、准备工作2.具体步骤 总结 前言 半路接手公司一台台式电脑&#xff0c;C盘&#xff08;120g&#xff09;爆红&#xff0c;仅剩几个G&#xff0c;优化了几次&#xff0c;无果后。准备换一个大一点的增到500g。…

Python实现从Labelme数据集中挑选出含有指定类别的数据集

Python实现从Labelme数据集中挑选出含有指定类别的数据集 前言前提条件相关介绍实验环境Labelme数据集中挑选出含有指定类别的数据集代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小…

【STM32 开发】| INA219采集电压、电流值

目录 前言1 原理图2 IIC地址说明3 寄存器地址说明4 开始工作前配置5 程序代码1&#xff09;驱动程序2&#xff09;头文件3) 测试代码 前言 INA219 是一款具备 I2C 或 SMBUS 兼容接口的分流器和功率监测计。该器件监测分流器电压降和总线电源电压&#xff0c;转换次数和滤波选项…

算法打卡01——求两数之和

题目&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…

Python进行数据可视化,探索和发现数据中的模式和趋势。

文章目录 前言第一步&#xff1a;导入必要的库第二步&#xff1a;加载数据第三步&#xff1a;创建基本图表第四步&#xff1a;添加更多细节第五步&#xff1a;使用Seaborn库创建更复杂的图表关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyth…

2023年度API安全状况详解

随着云计算和移动应用的快速发展&#xff0c;API&#xff08;应用程序接口&#xff09;已成为不可或缺的技术组成部分。然而&#xff0c;API的广泛使用也带来了安全风险。本文将探讨2023年的API安全状况&#xff0c;并介绍了一些应对这些安全挑战的最佳实践。 引言 随着全球互联…

【Leetcode】【每日一题】【简单】2609. 最长平衡子字符串

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-the-longest-balanced-subs…

在linux安装单机版hadoop-3.3.6

一、下载hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/core/hadoop-3.3.6/ 二、配置环境变量 1、配置java环境变量 2、配置hadoop环境变量 export HADOOP_HOME/usr/local/bigdata/hadoop-3.3.6 export HBASE_HOME/usr/local/bigdata/hbase-2.5.6 export JA…

C# 继承,抽象,接口,泛型约束,扩展方法

文章目录 前言模拟需求场景模拟重复性高的需求初始类结构继承优化抽象类 需求1&#xff1a;打印CreateTime方法1&#xff1a;使用重载方法2&#xff1a;基类函数方法3&#xff1a;泛型约束方法3.1&#xff1a;普通泛型方法方法3.2&#xff1a;高级泛型约束&#xff0c;扩展方法…

阿里云双11大促,WoSign SSL国密RSA双证书首购4折优惠

阿里云2023双11“金秋云创季”活动盛大开启&#xff01;2023年11月01日至11月31日&#xff0c;阿里云平台WoSign SSL证书“国密/RSA 双证书解决方案”首购4折优惠&#xff01;惊喜折扣、限时福利&#xff0c;机会不容错过&#xff01; 作为阿里云一年一度最盛大的优惠促销活动&…

RAID卡管理工具使用

RAID 基本概念 由于现代数据中心业务量的与日俱增&#xff0c;单台服务器上需要运行的数据也日益增多。当 单个物理磁盘在容量和安全性上不足以支持系统业务时&#xff0c;就需要将多个磁盘以某种特 定方式组合起来&#xff0c;对外作为一个可见的磁盘来使用&#xff0c;才可…

计算机毕业设计 基于Web的视频及游戏管理平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

oracle数据导出exp导入imp

Oracle的exp/imp命令用于实现对数据库的导出/导入操作&#xff1b; exp命令用于把数据从远程数据库服务器导出至本地&#xff0c;生成dmp文件&#xff1b; imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库。 一、获取帮助信息 exp/imp helpy 二、数据导出 1…