The attached code (from the 3.6 branch) adds a keepSeparatePoints option to the SHP plugin which makes it possible to avoid merging point features into multi-points, in case you e.g. need to keep separate point attributes.
It also contains a fix in the Xbase DBF parser, converting a numeric shape attribute to double instead of integer. As stated in e.g. https://en.wikipedia.org/wiki/.dbf the numeric field can contain decimals.
This commit is contained in:
parent
3450b9fee8
commit
e888e9621c
@ -12,9 +12,10 @@
|
||||
|
||||
using namespace ESRIShape;
|
||||
|
||||
ESRIShapeParser::ESRIShapeParser( const std::string fileName, bool useDouble ):
|
||||
ESRIShapeParser::ESRIShapeParser(const std::string fileName, bool useDouble, bool keepSeparatePoints) :
|
||||
_valid(false),
|
||||
_useDouble(useDouble)
|
||||
_useDouble(useDouble),
|
||||
_keepSeparatePoints(keepSeparatePoints)
|
||||
{
|
||||
int fd = 0;
|
||||
if( !fileName.empty() )
|
||||
@ -215,7 +216,7 @@ osg::Geode *ESRIShapeParser::getGeode()
|
||||
|
||||
void ESRIShapeParser::_combinePointToMultipoint()
|
||||
{
|
||||
if( !_valid ) return;
|
||||
if (!_valid || _keepSeparatePoints) return;
|
||||
|
||||
OSG_NOTICE<<"_combinePointToMultipoint()"<<std::endl;
|
||||
|
||||
|
@ -61,7 +61,7 @@ class ESRIShapeParser
|
||||
{
|
||||
public:
|
||||
|
||||
ESRIShapeParser( const std::string fileName, bool useDouble);
|
||||
ESRIShapeParser( const std::string fileName, bool useDouble, bool keepSeparatePoints);
|
||||
|
||||
osg::Geode *getGeode();
|
||||
|
||||
@ -81,6 +81,7 @@ class ESRIShapeParser
|
||||
|
||||
bool _valid;
|
||||
bool _useDouble;
|
||||
bool _keepSeparatePoints;
|
||||
|
||||
osg::ref_ptr<osg::Geode> _geode;
|
||||
|
||||
|
@ -20,6 +20,7 @@ class ESRIShapeReaderWriter : public osgDB::ReaderWriter
|
||||
{
|
||||
supportsExtension("shp","Geospatial Shape file format");
|
||||
supportsOption("double","Read x,y,z data as double an stored as geometry in osg::Vec3dArray's.");
|
||||
supportsOption("keepSeparatePoints", "Avoid combining point features into multi-point.");
|
||||
}
|
||||
|
||||
virtual const char* className() const { return "ESRI Shape ReaderWriter"; }
|
||||
@ -47,8 +48,14 @@ class ESRIShapeReaderWriter : public osgDB::ReaderWriter
|
||||
useDouble = true;
|
||||
}
|
||||
|
||||
bool keepSeparatePoints = false;
|
||||
if (options && options->getOptionString().find("keepSeparatePoints") != std::string::npos)
|
||||
{
|
||||
keepSeparatePoints = true;
|
||||
}
|
||||
|
||||
ESRIShape::ESRIShapeParser sp(fileName, useDouble);
|
||||
|
||||
ESRIShape::ESRIShapeParser sp(fileName, useDouble, keepSeparatePoints);
|
||||
|
||||
|
||||
std::string xbaseFileName(osgDB::getNameLessExtension(fileName) + ".dbf");
|
||||
|
@ -184,7 +184,7 @@ bool XBaseParser::parse(int fd)
|
||||
char* number = new char[it->_fieldLength + 1];
|
||||
memcpy(number, recordPtr, it->_fieldLength);
|
||||
number[it->_fieldLength] = 0;
|
||||
shapeAttributeList->push_back(osgSim::ShapeAttribute((const char *) it->_name, (int) atoi(number)));
|
||||
shapeAttributeList->push_back(osgSim::ShapeAttribute((const char *) it->_name, atof(number)));
|
||||
delete [] number;
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user