📄 readerwriterogr.cpp
字号:
/* -*- mode: c++; c-default-style: k&r; tab-width: 4; c-basic-offset: 4; -*- * Copyright (C) 2007 Cedric Pinson - mornifle@plopbyte.net * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details.*/#include <osg/Image>#include <osg/Notify>#include <osg/Geode>#include <osg/GL>#include <osg/Geometry>#include <osg/Point>#include <osg/Material>#include <osg/TriangleFunctor>#include <osgUtil/Tessellator>#include <osgDB/Registry>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/ImageOptions>#include <OpenThreads/ScopedLock>#include <OpenThreads/ReentrantMutex>#include <gdal_priv.h>#include <ogr_feature.h>#include <cpl_error.h>#include <ogr_core.h>#include <ogr_feature.h>#include <ogrsf_frmts.h>#define SERIALIZER() OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(_serializerMutex) static osg::Material* createDefaultMaterial(){ osg::Vec4 color; for (int i = 0; i < 3; i++) color[i] = (1.0 * (rand() / (1.0*RAND_MAX))); color[3] = 1; osg::Material* mat = new osg::Material; mat->setDiffuse(osg::Material::FRONT_AND_BACK, color); return mat;}struct TriangulizeFunctor { osg::Vec3Array* _vertexes; // do nothing void operator ()(const osg::Vec3& v1, const osg::Vec3& v2, const osg::Vec3& v3, bool treatVertexDataAsTemporary) { _vertexes->push_back(v1); _vertexes->push_back(v2); _vertexes->push_back(v3); }};static osg::Vec3Array* triangulizeGeometry(osg::Geometry* src){ if (src->getNumPrimitiveSets() == 1 && src->getPrimitiveSet(0)->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType && src->getVertexArray() && src->getVertexArray()->getType() == osg::Array::Vec3ArrayType) return static_cast<osg::Vec3Array*>(src->getVertexArray()); osg::TriangleFunctor<TriangulizeFunctor> functor; osg::Vec3Array* array = new osg::Vec3Array; functor._vertexes = array; src->accept(functor); return array;}class ReaderWriterOGR : public osgDB::ReaderWriter{public: ReaderWriterOGR() { supportsExtension("ogr","OGR file reader"); supportsOption("useRandomColorByFeature", "Assign a random color to each feature."); supportsOption("addGroupPerFeature", "Places each feature in a seperate group."); } virtual const char* className() const { return "OGR file reader"; } virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const { if (osgDB::equalCaseInsensitive(osgDB::getFileExtension(file),"ogr")) { return readObject(osgDB::getNameLessExtension(file),options); } OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(_serializerMutex); std::string fileName = osgDB::findDataFile( file, options ); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; return readFile(fileName, options); } virtual ReadResult readFile(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const { if (OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount() == 0) OGRRegisterAll(); // Try to open data source OGRDataSource* file = OGRSFDriverRegistrar::Open(fileName.c_str()); if (!file) return 0; bool useRandomColorByFeature = false; bool addGroupPerFeature = false; if (options) { if (options->getOptionString().find("UseRandomColorByFeature") != std::string::npos) useRandomColorByFeature = true; if (options->getOptionString().find("useRandomColorByFeature") != std::string::npos) useRandomColorByFeature = true; if (options->getOptionString().find("addGroupPerFeature") != std::string::npos) addGroupPerFeature = true; } osg::Group* group = new osg::Group; for (int i = 0; i < file->GetLayerCount(); i++) { osg::Group* node = readLayer(file->GetLayer(i), file->GetName(), useRandomColorByFeature, addGroupPerFeature); if (node) group->addChild( node ); } OGRDataSource::DestroyDataSource( file ); return group; } osg::Group* readLayer(OGRLayer* ogrLayer, const std::string& name, bool useRandomColorByFeature, bool addGroupPerFeature) const { if (!ogrLayer) return 0; osg::Group* layer = new osg::Group; layer->setName(ogrLayer->GetLayerDefn()->GetName()); ogrLayer->ResetReading(); OGRFeature* ogrFeature = NULL; while ((ogrFeature = ogrLayer->GetNextFeature()) != NULL) { osg::Geode* feature = readFeature(ogrFeature, useRandomColorByFeature); if (feature) { if (addGroupPerFeature) { osg::Group* featureGroup = new osg::Group; featureGroup->addChild(feature); layer->addChild(featureGroup); } else { layer->addChild(feature); } } OGRFeature::DestroyFeature( ogrFeature ); } return layer; } osg::Geometry* pointsToDrawable(const OGRPoint* points) const { osg::Geometry* pointGeom = new osg::Geometry(); osg::Vec3Array* vertices = new osg::Vec3Array(); vertices->push_back(osg::Vec3(points->getX(), points->getY(), points->getZ())); pointGeom->setVertexArray(vertices); pointGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, 1)); return pointGeom; } osg::Geometry* linearRingToDrawable(OGRLinearRing* ring) const { osg::Geometry* contourGeom = new osg::Geometry(); osg::Vec3Array* vertices = new osg::Vec3Array(); OGRPoint point; for(int j = 0; j < ring->getNumPoints(); j++) { ring->getPoint(j, &point); vertices->push_back(osg::Vec3(point.getX(), point.getY(),point.getZ())); } contourGeom->setVertexArray(vertices); contourGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, vertices->size())); return contourGeom; } osg::Geometry* lineStringToDrawable(OGRLineString* lineString) const { osg::Geometry* contourGeom = new osg::Geometry(); osg::Vec3Array* vertices = new osg::Vec3Array(); OGRPoint point; for(int j = 0; j < lineString->getNumPoints(); j++) { lineString->getPoint(j, &point); vertices->push_back(osg::Vec3(point.getX(), point.getY(), point.getZ())); } contourGeom->setVertexArray(vertices); contourGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, vertices->size())); return contourGeom; } osg::Geometry* multiPolygonToDrawable(OGRMultiPolygon* mpolygon) const { osg::Geometry* geom = new osg::Geometry;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -