⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwriterogr.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -*- 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 + -