OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)
前言
上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。
OsgEarth编译过程简介
OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。
目标:Qt5.15.x + VS2019 x64版本
演示Demo
Demo基于Qt5.15.2 + vs2019 x64 + osg3.6.3 + osgEarth3.1。

演示环境Demo下载地址:https://download.csdn.net/download/qq21497936/14984791
编译OsgEarth 3.1
步骤一:下载解压

(备注:博主QQ群提供文件下载,博客首页有扫码加群)
步骤二:CMake配置,添加Curl

补充:没有添加Curl,则会报错如下:

步骤三:CMake配置,添加DGAL

补充:没有添加GDAL,则会报错如下:

步骤四:CMake配置,添加libZip

补充:没有添加libzip,则会报错如下:

步骤五:CMake配置,添加OSG

步骤六:CMake配置

步骤七:CMake生成工程

步骤八:打开工程编译

步骤九:编译错误“未定义GL_DYNAMIC_STORAGE_BIT”

直接自己加个定义把,先找到他的定义:

直接修改源码:

步骤十:编译成功


Demo源码
#include <osg/Notify>
#include <osgGA/StateSetManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgDB/WriteFile>
#include <osgEarth/MapNode>
#include <osgEarth/GDAL>
#include <osgEarth/ExampleResources>
#include <osgEarth/EarthManipulator>
#include <osgEarth/Style>
#include <osgEarth/OGRFeatureSource>
#include <osgEarth/FeatureModelLayer>
#include <osgEarth/FeatureImageLayer>
using namespace osgEarth;
using namespace osgEarth::Util;
const char* styles_css =
R"(
p {
altitude-clamping: terrain-drape;
render-backface-culling: false;
}
p1: p{ fill: #ff3f3f9f; }
p2: p{ fill: #3fff3f9f; }
p3: p{ fill: #3f3fff9f; }
p4: p{ fill: #ff3fff9f; }
p5: p{ fill: #ffff3f9f; }
)";
const char* script_source =
R"(
function getStyleClass()
{
// Exclude any countries beginning with the letter A:
if ( feature.properties.name.charAt(0) === 'A' )
return null;
// If it starts with the letter C, return an inline style:
if ( feature.properties.name.charAt(0) == 'C' )
return '{ _fill: #ffc838; stroke: #8f8838; extrusion-height: 250000; }';
// Otherwise, return a named style based on some calculations:
var pop = parseFloat(feature.properties.pop);
if ( pop <= 14045470 ) return "p1";
else if ( pop <= 43410900 ) return "p2";
else if ( pop <= 97228750 ) return "p3";
else if ( pop <= 258833000 ) return "p4";
else return "p5";
}
)";
int main(int argc, char** argv)
{
osgEarth::initialize();
osg::ArgumentParser arguments(&argc, argv);
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 useScript = arguments.read("--script");
std::string outfile;
arguments.read("--out", outfile);
osgViewer::Viewer viewer(arguments);
osg::ref_ptr<Map> map = new Map();
GDALImageLayer* basemap = new GDALImageLayer();
basemap->setURL("world.tif");
map->addLayer(basemap);
// Next we add a layer to provide the feature data.
OGRFeatureSource* features = new OGRFeatureSource();
features->setName("vector-data");
if (useMem)
{
// the --mem options tells us to just make an in-memory geometry:
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));
features->setGeometry(line);
}
else
{
features->setURL("world.shp");
}
map->addLayer(features);
Style style;
LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>();
ls->stroke()->color() = Color::Yellow;
ls->stroke()->width() = 2.0f;
ls->tessellationSize()->set(100, Units::KILOMETERS);
if (useDraping)
{
AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
alt->clamping() = alt->CLAMP_TO_TERRAIN;
alt->technique() = alt->TECHNIQUE_DRAPE;
}
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;
}
if (useRaster)
{
FeatureImageLayer* layer = new FeatureImageLayer();
layer->setFeatureSource(features);
StyleSheet* sheet = new StyleSheet();
sheet->addStyle(style);
layer->setStyleSheet(sheet);
map->addLayer(layer);
}
else
{
FeatureModelLayer* layer = new FeatureModelLayer();
layer->setFeatureSource(features);
StyleSheet* styleSheet = new StyleSheet();
if (useScript)
{
styleSheet->addStylesFromCSS(styles_css);
styleSheet->setScript(new StyleSheet::ScriptDef(script_source));
styleSheet->addSelector(StyleSelector("default", StringExpression("getStyleClass()")));
}
else
{
styleSheet->addStyle(style);
}
layer->setStyleSheet(styleSheet);
map->addLayer(layer);
}
if (useLabels && !useRaster)
{
Style labelStyle;
TextSymbol* text = labelStyle.getOrCreateSymbol<TextSymbol>();
text->content() = StringExpression("[name]");
text->priority() = NumericExpression("[pop]");
text->size() = 16.0f;
text->alignment() = TextSymbol::ALIGN_CENTER_CENTER;
text->fill()->color() = Color::White;
text->halo()->color() = Color::DarkGray;
StyleSheet* sheet = new StyleSheet();
sheet->addStyle(labelStyle);
FeatureModelLayer* fml = new FeatureModelLayer();
fml->setName("Labels");
fml->setFeatureSource(features);
fml->setStyleSheet(sheet);
map->addLayer(fml);
}
LayerVector layers;
map->getLayers(layers);
for (LayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i)
{
Layer* layer = i->get();
if (layer->getStatus().isError() &&
layer->getEnabled())
{
OE_WARN << layer->getName() << " : " << layer->getStatus().toString() << std::endl;
}
}
MapNode* mapNode = new MapNode(map.get());
if (!outfile.empty())
{
OE_NOTICE << "Writing to " << outfile << std::endl;
osgDB::writeNodeFile(*mapNode, outfile);
}
else
{
viewer.setSceneData(mapNode);
viewer.setCameraManipulator(new EarthManipulator());
MapNodeHelper().configureView(&viewer);
return viewer.run();
}
}
上一篇:《OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)》
下一篇:敬请期待…
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113541346
OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)的更多相关文章
- OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)
前言 OSG研究之后,做地理GIS显示了地球:<项目实战:Qt+OSG教育学科工具之地理三维星球>,这一文章是基于OSG做的,而基于OsgEarth是可以进一步对地球进行深度操作,所以 ...
- Django开发笔记三
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...
- TERSUS无代码开发(笔记08)-简单实例电脑端后台逻辑开发
主管审批功能逻辑开发 1.查询逻辑开发(查询待审批记录) 2.批准处理(将选中的一条记录进行批准处理) =============================================== ...
- TERSUS无代码开发(笔记07)-简单实例手机端后台逻辑开发
提交申请逻辑开发 1.添加父级对象引用(从父级对象中获取前端输入框的值) 1.设计数据库表(表名和字段名称不能用中文) 2.设计置数据库主键(可设联合主键) 3.传值形成数据实列处理 4.服务器端处理 ...
- opencv笔记1:opencv的基本模块,以及环境搭建
opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...
- 【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建
虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半 ...
- Ionic Android开发环境搭建 下
上篇 Ionic 安装完成了,由于要开发Android,所以必不可少需要继续搭建Android开发环境. 首先,下载并安装JDK.然后配置一下环境变量. 接着,下载并安装Android SDK.下载过 ...
- RBL开发笔记三
2014-08-26 20:06:24 今天就是在开发这个EPOLL来处理网络事件 封装较为健壮的EPOLL模型来处理基本的网络IO 1) 超时这个主题先没有弄 在开发EPOLL包括select/po ...
随机推荐
- MySQL 标识符到底区分大小写么——官方文档告诉你
最近在阿里云服务器上部署一个自己写的小 demo 时遇到一点问题,查看 Tomcat 日志后定位到问题出现在与数据库服务器交互的地方,执行 SQL 语句时会返回 指定列.指定名 不存在的错误.多方查证 ...
- 结合MATLAB、Python、R语言,在求得显著差异的边(节点对)之后,怎么画circle图
先来看看成果图: OK,开始画图: 实验背景声明:在脑影像分析中,我们首先构建脑网络,然 ...
- Linux下的screen和作业任务管理
一.screen 首先介绍下screen,screen是Linux下的一个任务容器,开启了之后就可以让任务在后台执行而不会被网络中断或者是终端退出而影响到. 在Linux中有一些耗时比较久的操作(例如 ...
- 科来网络通讯协议图2019版(OSI七层模型)
来源:http://www.colasoft.com.cn/download/protocols_map.php 自己把它转成了图片,好做查看:https://www.lanzous.com/ib5h ...
- Flutter 应用入门:路由管理
路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewContro ...
- Nginx安装步骤及本地浏览器不通解决方案,Nginx在Linux发布项目,Tomcat 与本地浏览器不通解决方案
Nginx安装步骤及本地浏览器不通解决方案 1.将安装包放到usr/local文件夹下 2..进入local目录,解压 tar -zxvf nginx-1.17.5.tar.gz 3.进入 nginx ...
- python学习笔记 | 递归思想
1.引子 大师 L. Peter Deutsch 说过: To Iterate is Human, to Recurse, Divine. 中文译为:人理解迭代,神理解递归 2.什么是递归 简单理解: ...
- Java进阶专题(二十一) 消息中间件架构体系(3)-- Kafka研究
前言 Kafka 是一款分布式消息发布和订阅系统,具有高性能.高吞吐量的特点而被广泛应用与大数据传输场景.它是由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会 ...
- MySQL sql命令行操作数据库
数据库命令行操作 命令行操作数据库, [if exists] 可加可不加, 命令行操作一定要加英文分号 ; 结尾 创建数据库 : create database [if not exists] 数据库 ...
- window10系统安装
准备工作: 一个U盘,大概8GB左右的存储,用于存放windows镜像文件与驱动精灵离线版网卡驱动以及相关的应用应用软件等. window10镜像文件(iso文件) 微PE工具软件 软件下载: 前提: ...