osg系列文章目录
文章目录
- osg系列文章目录
- 前言
- 一、错误原因
- 二、解决方法
前言
今天使用osg3.6.5,osgEarth3.2加载shp文件,代码很简单
#include <Windows.h>
#include <iostream>
#include <string>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgEarth/MapNode>
#include <osgEarthDrivers/cache_filesystem/FileSystemCache>
#include <osgEarth/ImageLayer>
#include <osgEarth/OGRFeatureSource>
#include <osgEarth/FeatureModelLayer>
#include <osgEarth/FeatureImageLayer>
using namespace std;
int main()
{
osg::ref_ptr<osgEarth::OGRFeatureSource> features = new osgEarth::OGRFeatureSource;
features->setURL("F:/osg/yangShiXing/019.Earth/builder/data/shpFile/world.shp");
features->open();
osgEarth::Query query;
query.expression() = "POP_CNTRY = 67074";
// 创建进度回调(可以传递 nullptr 如果不需要进度回调)
osg::ref_ptr<osgEarth::ProgressCallback> progressCallback = nullptr;
osg::ref_ptr<osgEarth::FeatureCursor> cursor = features->createFeatureCursor(query, progressCallback);
while (cursor->hasMore()){
osgEarth::Feature* feature = cursor->nextFeature();
std::string text = feature->getString("Cntry_name");
if (feature) {
std::string name = feature->getString("NAME");
std::string pop = feature->getString("POP_CNTRY");
std::string area = feature->getString("AREA_CNTRY");
//std::string geom = feature->getGeometry()->asText();
std::cout << "Cntry_name:" << text << name << ", Population: " << pop << ", Area: " << area << ", Geometry: " <</* geom <<*/ std::endl;
}
}
}
记过编译器报错:
“(”:“::”右边的非法标记
语法错误:“expression”后出现意外标记“(”
语法错误: 此处出现意外的“)”;应为“;”
语法错误:“expression-statement”后出现意外标记“)”
语法错误: 此处出现意外的“:”;应为“;”
语法错误:“expression-statement”后出现意外标记“:”
“(”:“::”右边的非法标记
语法错误:“expression”后出现意外标记“(”
语法错误: 此处出现意外的“)”;应为“;”
语法错误:“expression-statement”后出现意外标记“)”
语法错误: 此处出现意外的“:”;应为“;”
语法错误:“expression-statement”后出现意外标记“:”
“(”:“::”右边的非法标记
语法错误:“expression”后出现意外标记“(”
语法错误: 此处出现意外的“)”;应为“;”
语法错误:“expression-statement”后出现意外标记“)”
语法错误: 此处出现意外的“:”;应为“;”
语法错误:“expression-statement”后出现意外标记“:”
“(”:“::”右边的非法标记
语法错误:“expression”后出现意外标记“(”
语法错误: 此处出现意外的“)”;应为“;”
语法错误:“expression-statement”后出现意外标记“)”
语法错误: 此处出现意外的“:”;应为“;”
语法错误:“expression-statement”后出现意外标记“:”
报错位置在:include\osgEarth\Math
一、错误原因
宏定义冲突:
Vsual C++定义了min/max两个宏,这里被认为冲突
检查是否有宏定义与 std::min 冲突。在项目中搜索是否有类似 #define min 的宏定义,如果有,请使用 #undef min 进行取消定义,或使用命名空间限定明确指定 std::min。
二、解决方法
在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义:在项目名称鼠标右键:项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中添加NOMINMAX。 这种方法不用修改源码即可。
加括号
加上括号,与Vsual C++的min/max宏定义区分开
result.xMin() = (std::min)((result.xMin(), (*itr).x())); result.xMax() = (std::max)((result.xMax(), (*itr).x())); result.yMin() = (std::min)((result.yMin(), (*itr).y())); result.yMax() = (std::max)((result.yMax(), (*itr).y()));
这种方法修改了osgEarth源码