root/OpenSceneGraph/trunk/src/osgPlugins/shp/ESRIShapeReaderWriter.cpp @ 13041

Revision 13041, 4.0 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <osgDB/FileNameUtils>
2#include <osgDB/FileUtils>
3#include <osgDB/fstream>
4#include <osgDB/Registry>
5
6#include <osgTerrain/Locator>
7
8#include "ESRIType.h"
9
10#include "ESRIShape.h"
11#include "ESRIShapeParser.h"
12
13#include "XBaseParser.h"
14
15
16class ESRIShapeReaderWriter : public osgDB::ReaderWriter
17{
18    public:
19        ESRIShapeReaderWriter()
20        {
21            supportsExtension("shp","Geospatial Shape file format");
22            supportsOption("double","Read x,y,z data as double an stored as geometry in osg::Vec3dArray's.");
23        }
24
25        virtual const char* className() { return "ESRI Shape ReaderWriter"; }
26
27        virtual bool acceptsExtension(const std::string& extension) const
28        {
29            return osgDB::equalCaseInsensitive(extension,"shp");
30        }
31
32        virtual ReadResult readObject(const std::string& fileName, const Options* opt) const
33        { return readNode(fileName,opt); }
34
35        virtual ReadResult readNode(const std::string& file, const Options* options) const
36        {
37            std::string ext = osgDB::getFileExtension(file);
38            if (!acceptsExtension(ext))
39                return ReadResult::FILE_NOT_HANDLED;
40
41            std::string fileName = osgDB::findDataFile(file, options);
42            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
43
44            bool useDouble = false;
45            if (options && options->getOptionString().find("double")!=std::string::npos)
46            {
47                useDouble = true;
48            }
49
50
51            ESRIShape::ESRIShapeParser sp(fileName, useDouble);
52
53
54            std::string xbaseFileName(osgDB::getNameLessExtension(fileName) + ".dbf");
55            ESRIShape::XBaseParser xbp(xbaseFileName);
56
57
58            if (sp.getGeode() && (xbp.getAttributeList().empty() == false))
59            {
60                if (sp.getGeode()->getNumDrawables() != xbp.getAttributeList().size())
61                {
62                    OSG_WARN << "ESRIShape loader : .dbf file containe different record number that .shp file." << std::endl
63                                           << "                   .dbf record skipped." << std::endl;
64                }
65                else
66                {
67                    osg::Geode * geode = sp.getGeode();
68                    unsigned int i = 0;
69
70                    ESRIShape::XBaseParser::ShapeAttributeListList::iterator it, end = xbp.getAttributeList().end();
71                    for (it = xbp.getAttributeList().begin(); it != end; ++it, ++i)
72                    {
73                        geode->getDrawable(i)->setUserData(it->get());
74                    }
75                }
76            }
77
78            if (sp.getGeode())
79            {
80
81                std::string projFileName(osgDB::getNameLessExtension(fileName) + ".prj");
82                if (osgDB::fileExists(projFileName))
83                {
84                    osgDB::ifstream fin(projFileName.c_str());
85                    if (fin)
86                    {
87                        std::string projstring;
88                        while(!fin.eof())
89                        {
90                            char readline[4096];
91                            *readline = 0;
92                            fin.getline(readline, sizeof(readline));
93                            if (!projstring.empty() && !fin.eof())
94                            {
95                                projstring += '\n';
96                            }
97                            projstring += readline;
98
99                        }
100
101                        if (!projstring.empty())
102                        {
103                            osgTerrain::Locator* locator = new osgTerrain::Locator;
104                            sp.getGeode()->setUserData(locator);
105
106                            locator->setFormat("WKT");
107                            locator->setCoordinateSystem(projstring);
108                            locator->setDefinedInFile(false);
109                        }
110                    }
111
112                }
113
114
115            }
116            return sp.getGeode();
117        }
118};
119
120REGISTER_OSGPLUGIN(shp, ESRIShapeReaderWriter)
Note: See TracBrowser for help on using the browser.