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

📄 esrishapereaderwriter.cpp

📁 最新osg包
💻 CPP
字号:
#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/fstream>#include <osgDB/Registry>#include <osgTerrain/Locator>#include "ESRIType.h"#include "ESRIShape.h"#include "ESRIShapeParser.h"#include "XBaseParser.h"class ESRIShapeReaderWriter : public osgDB::ReaderWriter{    public:        ESRIShapeReaderWriter()        {            supportsExtension("shp","Geospatial Shape file format");            supportsOption("double","Read x,y,z data as double an stored as geometry in osg::Vec3dArray's.");        }        virtual const char* className() { return "ESRI Shape ReaderWriter"; }                virtual bool acceptsExtension(const std::string& extension) const        {            return osgDB::equalCaseInsensitive(extension,"shp");        }        virtual ReadResult readObject(const std::string& fileName, const Options* opt) const        { return readNode(fileName,opt); }        virtual ReadResult readNode(const std::string& file, const Options* options) const        {            std::string ext = osgDB::getFileExtension(file);            if (!acceptsExtension(ext))                 return ReadResult::FILE_NOT_HANDLED;            std::string fileName = osgDB::findDataFile(file, options);            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;            bool useDouble = false;            if (options && options->getOptionString().find("double")!=std::string::npos)            {                useDouble = true;            }                                    ESRIShape::ESRIShapeParser sp(fileName, useDouble);                        std::string xbaseFileName(osgDB::getNameLessExtension(fileName) + ".dbf");            ESRIShape::XBaseParser xbp(xbaseFileName);                                    if (sp.getGeode() && (xbp.getAttributeList().empty() == false))            {                if (sp.getGeode()->getNumDrawables() != xbp.getAttributeList().size())                {                    osg::notify(osg::WARN) << "ESRIShape loader : .dbf file containe different record number that .shp file." << std::endl                                           << "                   .dbf record skipped." << std::endl;                }                else                {                    osg::Geode * geode = sp.getGeode();                    unsigned int i = 0;                                        ESRIShape::XBaseParser::ShapeAttributeListList::iterator it, end = xbp.getAttributeList().end();                    for (it = xbp.getAttributeList().begin(); it != end; ++it, ++i)                    {                        geode->getDrawable(i)->setUserData(it->get());                    }                }            }                if (sp.getGeode())            {                            std::string projFileName(osgDB::getNameLessExtension(fileName) + ".prj");                if (osgDB::fileExists(projFileName))                {                    osgDB::ifstream fin(projFileName.c_str());                    if (fin)                    {                        std::string projstring;                        while(!fin.eof())                        {                            char readline[4096];                            *readline = 0;                            fin.getline(readline, sizeof(readline));                            if (!projstring.empty() && !fin.eof())                            {                                projstring += '\n';                            }                            projstring += readline;                        }                                                if (!projstring.empty())                        {                            osgTerrain::Locator* locator = new osgTerrain::Locator;                            sp.getGeode()->setUserData(locator);                            locator->setFormat("WKT");                            locator->setCoordinateSystem(projstring);                            locator->setDefinedInFile(false);                        }                    }                                    }            }            return sp.getGeode();        }};REGISTER_OSGPLUGIN(shp, ESRIShapeReaderWriter)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -