osgEarth之添加shp

news2024/11/24 18:51:30

目录

效果

代码

代码分析

加载模式


效果

代码

#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.coloradmin.cn/o/1189974.html

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

相关文章

node插件MongoDB(三)—— 库mongoose 的使用和数据类型

前言 提示&#xff1a;使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档&#xff1a;http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码&#xff08;连接mongodb 服务&#xff09;3.…

后入能先出,一文搞懂栈

目录 什么是栈数组实现链表实现栈能这么玩总结 什么是栈 栈在我们日常编码中遇到的非常多&#xff0c;很多人对栈的接触可能仅仅局限在 递归使用的栈 和 StackOverflowException&#xff0c;栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)。 栈&…

SpringCache(Redis)

一、springcache是什么 springcache是spring的缓存框架&#xff0c;利用了AOP&#xff0c;实现了基于注解的缓存功能&#xff0c;并且进行了合理的抽象&#xff0c;业务代码不用关心底层是使用了什么缓存框架&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能了…

基于SSM的劳务外包管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

如何写一篇吊炸天的竞品分析

这段时间&#xff0c;除了撩妹之外&#xff0c;最多的就是竞品分析了。最近很多临近毕业的同学也在四处应聘产品岗&#xff0c;而一份不错的竞品分析一定能为你的求职加分不少。于是&#xff0c;有着菩萨心肠天使面孔魔鬼身材的我&#xff0c;就来教大家怎么做一份完整的竞品分…

gitlab-ce-12.3.5 挖矿病毒及解决方案

前言 最近发现在使用gitlab提交代码的时候总是失败&#xff0c;一访问gitlab还时常报503&#xff0c;于是使用 top 命令查看了内存占用情况&#xff0c;发现了一个git进程内存使用了2.3g&#xff0c;cpu还一直占用300-400%&#xff0c; 以前不知道gitlab还有病毒&#xff0c;只…

Python的版本如何查询?

要查询Python的版本&#xff0c;可以使用以下方法之一&#xff1a; 1.在命令行中使用python --version命令。这会显示安装在计算机上的Python解释器的版本号。 # Author : 小红牛 # 微信公众号&#xff1a;wdPython2.在Python脚本中使用import sys语句&#xff0c;然后打印sy…

ppt聚光灯效果

1.放入三张图片内容或其他 2.全选复制成图片 3.设置黑色矩形&#xff0c;透明度30% 4.粘贴复制后的图片&#xff0c;制定图层 5.插入椭圆&#xff0c;先选中矩形&#xff0c;再选中椭圆&#xff0c;点击绘图工具&#xff0c;选择相交即可&#xff08;关键&#xff09;

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

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

4.移位计算,乘除法运算

目录 一. 移位计算 &#xff08;1&#xff09;算数移位 &#xff08;2&#xff09;逻辑移位 &#xff08;3&#xff09;循环移位 二. 乘法运算 &#xff08;1&#xff09;原码的乘法运算 &#xff08;2&#xff09;补码的乘法运算 三. 除法运算 &#xff08;1&#xf…

[HCTF 2018]WarmUp全网最详细解释

查看源码找到提示 访问source.php 代码审计&#xff1a; class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"]; 定义了一个名为emmm的类&#xff0c;在该类中有…

线性代数(四)| 解方程 齐次性 非齐次性 扩充问题

文章目录 1 方程解的个数2 解方程步骤2.1 齐次性方程组2.2 非齐次方程组 3 一些扩充问题 系数矩阵 增广矩阵 A m n X B A_{mn}XB Amn​XB 1 方程解的个数 m 代表有m个方程 n代表有n个未知数 系数矩阵的秩与增广矩阵的秩不同 无解 若相同 &#xff0c;如系数矩阵的秩和未知…

Leetcode—226.翻转二叉树【简单】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—226.翻转二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

MySQL中表格的自我复制,与复制表格

先创建一个空表&#xff0c;my_tab01 CREATE TABLE my_tab01(id INT ,name VARCHAR(32),sal DOUBLE,job VARCHAR(32),deptno INT); SELECT * FROM my_tab01;准备一张有数据的表格&#xff1a; 将另一张表格的数据插入到my_tab01的表格中&#xff1a; -- 演示如何自我复制 --…

Android Glide transform旋转rotate圆图CircleCrop,Kotlin

Android Glide transform旋转rotate圆图CircleCrop&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load…

在现实生活中传感器GV-H130/GV-21的使用

今天&#xff0c;收获了传感器GV-H130/GV-21&#xff0c;调试探头的用法&#xff0c;下面就来看看吧&#xff01;如有不妥欢迎指正&#xff01;&#xff01;&#xff01;&#xff01; 目录 传感器GV-H130/GV-21外观 传感器调试探头 探头与必要准备工作 传感器数值更改调试 …

MySQL的表格去重,史上最简便的算法,一看就会

首先&#xff0c;表格my_tab02存在很多重复的数据&#xff1a; #表格的去重 方法一&#xff1a; 详细内容传送门&#xff1a;表格的去重 -- 思路&#xff1a; -- 1.先创建一张临时表 my_tmp,该表的结构和my_tab02一样 -- 2.把my_tmp的记录通过distinct关键字 处理后 把记录复…

docker.service配置docker镜像加速

加速器配置方法很多&#xff0c;小白我用的是docker.service文件&#xff0c;所以直接在里面配置啊 配置以后&#xff0c;要systemctl daemon-reload下 &#xff0c;然后docker info 下看下镜像地址是否是自己已配置的 docker run --privilegedtrue --name mytomcat -p 8080…

【线上问题】服务器关机导致docker启动的mysql数据库消失了

目录 一、问题描述二、解决方式 一、问题描述 1. 服务器迁移断电导致docker启动的mysql数据库没有了数据 2. data目录是空的 3. mysql重启数据库消失了 二、解决方式 1. sudo -i切换root账号 2. 查找mysql的容器卷 find /var/lib/docker/volumes/ -name mysql3. 进入各个_dat…

文生图模型评测之PickScore

文章目录 1. 简介2. 构建数据集2.1 Pick-a-Pic web App2.2 Pick-a-Pic Dataset3. PickScore3.1.1模型结构和损失函数3.2 模型训练3.3 验证模型4. 作用4.1 作为验证模型的验证集4.2 用于模型选择5. 小结论文链接:Pick-a-Pic: An Open Dataset of User Preferences for Text-to-…