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

osg3.6.5,osgEarth3.2报错:“(”:“::”右边的非法标记,语法错误:“expression”后出现意外标记“(”,语法错误: 此处出现意外的“)”;应为“;”_std max

一、错误原因

宏定义冲突:
Vsual C++定义了min/max两个宏,这里被认为冲突
检查是否有宏定义与 std::min 冲突。在项目中搜索是否有类似 #define min 的宏定义,如果有,请使用 #undef min 进行取消定义,或使用命名空间限定明确指定 std::min。

二、解决方法

在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义:在项目名称鼠标右键:项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中添加NOMINMAX。 这种方法不用修改源码即可。

osg3.6.5,osgEarth3.2报错:“(”:“::”右边的非法标记,语法错误:“expression”后出现意外标记“(”,语法错误: 此处出现意外的“)”;应为“;”_std min_02

加括号

    加上括号,与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源码

osg3.6.5,osgEarth3.2报错:“(”:“::”右边的非法标记,语法错误:“expression”后出现意外标记“(”,语法错误: 此处出现意外的“)”;应为“;”_std max_03