📄 esrishape.cpp
字号:
#if defined(_MSC_VER) || defined(__MINGW32__) #include <stdio.h> #include <io.h>#else #include <unistd.h>#endif #include "ESRIShape.h"using namespace ESRIShape ;#define SAFE_DELETE_ARRAY( ptr ) delete[] ptr; ptr = 0L;template <class T>inline void swapBytes( T &s ){ if( sizeof( T ) == 1 ) return; T d = s; BytePtr sptr = (BytePtr)&s; BytePtr dptr = &(((BytePtr)&d)[sizeof(T)-1]); for( unsigned int i = 0; i < sizeof(T); i++ ) *(sptr++) = *(dptr--);}inline ByteOrder getByteOrder(){ int one = 1; unsigned char *ptr = (unsigned char *)&one; if( ptr[0] == 1 ) return LittleEndian; else return BigEndian;}template <class T>inline bool readVal( int fd, T &val, ByteOrder bo = LittleEndian ){ int nbytes = 0; if( (nbytes = ::read( fd, &val, sizeof(T))) <= 0 ) return false; if( getByteOrder() != bo ) swapBytes<T>(val); return true;}inline void printType( ShapeType type ){ printf( "%s", type == ShapeTypeNullShape ? "NullShape" : type == ShapeTypePoint ? "Point" : type == ShapeTypePolyLine ? "PolyLine" : type == ShapeTypePolygon ? "Polygon" : type == ShapeTypeMultiPoint ? "MultiPoint" : type == ShapeTypePointZ ? "PointZ" : type == ShapeTypePolyLineZ ? "PolyLineZ" : type == ShapeTypePolygonZ ? "PolygonZ" : type == ShapeTypeMultiPointZ ? "MultiPointZ" : type == ShapeTypePointM ? "PointM" : type == ShapeTypePolyLineM ? "PolyLineM" : type == ShapeTypePolygonM ? "PolygonM" : type == ShapeTypeMultiPointM ? "MultiPointM" : type == ShapeTypeMultiPatch ? "MultiPatch" : "Unknown" );}bool BoundingBox::read( int fd ){ if( readVal<Double>(fd, Xmin, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Ymin, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Xmax, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Ymax, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Zmin, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Zmax, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Mmin, LittleEndian ) == false ) return false; if( readVal<Double>(fd, Mmax, LittleEndian ) == false ) return false; return true;}void BoundingBox::print(){ printf( " Xmin: %G\n", Xmin ); printf( " Ymin: %G\n", Ymin ); printf( " Xmax: %G\n", Xmax ); printf( " Ymax: %G\n", Ymax ); printf( " Zmin: %G\n", Zmin ); printf( " Zmax: %G\n", Zmax ); printf( " Mmin: %G\n", Mmin ); printf( " Mmax: %G\n", Mmax );}bool ShapeHeader::read(int fd){ if( readVal<Integer>( fd, fileCode, BigEndian ) == false ) return false; if( ::read( fd, _unused_0, sizeof(_unused_0)) <= 0 ) return false; if( readVal<Integer>( fd, fileLength, BigEndian ) == false ) return false; if( readVal<Integer>( fd, version, LittleEndian ) == false ) return false; if( readVal<Integer>( fd, shapeType, LittleEndian ) == false ) return false; bbox.read(fd); return true;}void ShapeHeader::print(){ printf( "File Code: %d\n", fileCode ); printf( "File Length: %d\n", fileLength ); printf( "Version: %d\n", version ); printf( "Shape Type: "); printType( ShapeType(shapeType) ); printf( "\n" ); printf( "Bounding Box:\n" ); bbox.print();}RecordHeader::RecordHeader(): recordNumber(-1), contentLength(0) {}bool RecordHeader::read( int fd ){ if( readVal<Integer>( fd, recordNumber, BigEndian ) == false ) return false; if( readVal<Integer>( fd, contentLength, BigEndian ) == false ) return false; return true;}void RecordHeader::print(){ printf( " Record Number: %d\n", recordNumber ); printf( "Content Length: %d\n", contentLength );}NullRecord::NullRecord(): shapeType(ShapeTypeNullShape) {}bool NullRecord::read( int fd ){ if( readVal<Integer>( fd, shapeType, LittleEndian ) == false ) return false; return true;}Box::Box() {}Box::Box(const Box &b ): Xmin(b.Xmin), Ymin(b.Ymin), Xmax(b.Xmax), Ymax(b.Ymax) {}bool Box::read( int fd ){ if( readVal<Double>(fd, Xmin, LittleEndian) == false ) return false; if( readVal<Double>(fd, Ymin, LittleEndian) == false ) return false; if( readVal<Double>(fd, Xmax, LittleEndian) == false ) return false; if( readVal<Double>(fd, Ymax, LittleEndian) == false ) return false; return true;}Range::Range() {}Range::Range( const Range &r ): min(r.min), max(r.max) {}bool Range::read( int fd ){ if( readVal<Double>(fd, min, LittleEndian ) == false ) return false; if( readVal<Double>(fd, max, LittleEndian ) == false ) return false; return true;}ShapeObject::ShapeObject(ShapeType s): shapeType(s) {}ShapeObject::~ShapeObject(){ }Point::Point(): ShapeObject(ShapeTypePoint), x(0.0), y(0.0) {}Point::Point(const Point &p): ShapeObject(ShapeTypePoint), x(p.x), y(p.y) {}Point::~Point() {}bool Point::read( int fd ){ if( readVal<Double>( fd, x, LittleEndian ) == false ) return false; if( readVal<Double>( fd, y, LittleEndian ) == false ) return false; return true;}bool PointRecord::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypePoint ) return false; return point.read(fd);}void Point::print(){ printf( " %G %G\n", x, y );}MultiPoint::MultiPoint(): ShapeObject(ShapeTypeMultiPoint), numPoints(0), points(0L) {}MultiPoint::MultiPoint( const struct MultiPoint &mpoint ): ShapeObject(ShapeTypeMultiPoint), bbox(mpoint.bbox), numPoints(mpoint.numPoints){ points = new Point[numPoints]; for( int i = 0; i < numPoints; i++ ) points[i] = mpoint.points[i];}MultiPoint::~MultiPoint(){ delete[] points;}bool MultiPoint::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; SAFE_DELETE_ARRAY( points ); Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypeMultiPoint ) return false; if( bbox.read(fd) == false ) return false; if( readVal<Integer>(fd, numPoints, LittleEndian ) == false ) return false; points = new struct Point[numPoints]; for( Integer i = 0; i < numPoints; i++ ) { if( points[i].read(fd) == false ) return false; } return true;}void MultiPoint::print(){ printf( "Point - numPoints: %d\n", numPoints ); for( int i= 0; i < numPoints; i++ ) points[i].print();}PolyLine::PolyLine(): ShapeObject(ShapeTypePolyLine), numParts(0), numPoints(0), parts(0L), points(0L) {}PolyLine::PolyLine( const PolyLine &p ): ShapeObject(ShapeTypePolyLine), numParts(p.numParts), numPoints(p.numPoints){ parts = new Integer[numParts]; Integer i; for(i = 0; i < numParts; i++ ) parts[i] = p.parts[i]; points = new Point[numPoints]; for(i = 0; i < numPoints; i++ ) points[i] = p.points[i];}PolyLine::~PolyLine() { delete [] parts; delete [] points;}bool PolyLine::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; SAFE_DELETE_ARRAY( parts ); SAFE_DELETE_ARRAY( points ); Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypePolyLine ) return false; if( bbox.read(fd) == false ) return false; if( readVal<Integer>(fd, numParts, LittleEndian ) == false ) return false; if( readVal<Integer>(fd, numPoints, LittleEndian ) == false ) return false; parts = new Integer[numParts]; int i; for( i = 0; i < numParts; i++ ) { if( readVal<Integer>(fd, parts[i], LittleEndian ) == false ) return false; } points = new struct Point[numPoints]; for( i = 0; i < numPoints; i++ ) { if( points[i].read(fd ) == false ) return false; } return true;}Polygon::Polygon(): ShapeObject(ShapeTypePolygon), numParts(0), numPoints(0), parts(0L), points(0L) {} Polygon::Polygon( const Polygon &p ): ShapeObject(ShapeTypePolygon), numParts(p.numParts), numPoints(p.numPoints){ parts = new Integer[numParts]; Integer i; for( i = 0; i < numParts; i++ ) parts[i] = p.parts[i]; points = new Point[numPoints]; for( i = 0; i < numPoints; i++ ) points[i] = p.points[i];}Polygon::~Polygon(){ delete [] parts; delete [] points;}bool Polygon::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; SAFE_DELETE_ARRAY( parts ); SAFE_DELETE_ARRAY( points ); Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypePolygon ) return false; if( bbox.read(fd) == false ) return false; if( readVal<Integer>(fd, numParts, LittleEndian ) == false ) return false; if( readVal<Integer>(fd, numPoints, LittleEndian ) == false ) return false; parts = new Integer[numParts]; int i; for( i = 0; i < numParts; i++ ) { if( readVal<Integer>(fd, parts[i], LittleEndian ) == false ) return false; } points = new struct Point[numPoints]; for( i = 0; i < numPoints; i++ ) { if( points[i].read(fd ) == false ) return false; } return true;}//////////////////////////////////////////////////////////////////////PointM::PointM(): ShapeObject(ShapeTypePointM), x(0.0), y(0.0), m(0.0) {}PointM::PointM(const PointM &p): ShapeObject(ShapeTypePointM), x(p.x), y(p.y), m(p.m) {}PointM::~PointM() {}bool PointM::read( int fd ){ if( readVal<Double>( fd, x, LittleEndian ) == false ) return false; if( readVal<Double>( fd, y, LittleEndian ) == false ) return false; if( readVal<Double>( fd, m, LittleEndian ) == false ) return false; return true;}void PointM::print(){ printf( " %G %G (%G)\n", x, y, m );}bool PointMRecord::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypePointM ) return false; return pointM.read(fd);}MultiPointM::MultiPointM(): ShapeObject(ShapeTypeMultiPointM), numPoints(0), points(0L), mArray(0L){} MultiPointM::MultiPointM( const struct MultiPointM &mpointm ): ShapeObject(ShapeTypeMultiPointM), bbox(mpointm.bbox), numPoints(mpointm.numPoints), mRange(mpointm.mRange){ points = new Point[numPoints]; mArray = new Double[numPoints]; for( int i = 0; i < numPoints; i++ ) { points[i] = mpointm.points[i]; mArray[i] = mpointm.mArray[i]; }}MultiPointM::~MultiPointM(){ delete [] points; delete [] mArray;}bool MultiPointM::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; SAFE_DELETE_ARRAY( points ); SAFE_DELETE_ARRAY( mArray ); Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypeMultiPointM ) return false; if( bbox.read(fd) == false ) return false; if( readVal<Integer>(fd, numPoints, LittleEndian ) == false ) return false; points = new struct Point[numPoints]; Integer i; for( i = 0; i < numPoints; i++ ) { if( points[i].read(fd) == false ) return false; } int X = 40 + (16 * numPoints); if( rh.contentLength > X ) { if( mRange.read(fd) == false ) return false; mArray = new Double[numPoints]; for( i = 0; i < numPoints; i++ ) { if( readVal<Double>(fd, mArray[i], LittleEndian ) == false ) return false; } } return true;}void MultiPointM::print(){ printf( "Point - numPoints: %d\n", numPoints ); for( int i= 0; i < numPoints; i++ ) points[i].print();}PolyLineM::PolyLineM(): ShapeObject(ShapeTypePolyLineM), numParts(0), numPoints(0), parts(0L), points(0L), mArray(0L) {}PolyLineM::PolyLineM(const PolyLineM &p): ShapeObject(ShapeTypePolyLineM), numParts(p.numParts), numPoints(p.numPoints), parts(0L), points(0L), mArray(0L) { parts = new Integer[numParts]; Integer i; for( i = 0; i < numParts; i++ ) parts[i] = p.parts[i]; points = new Point[numPoints]; mArray = new Double[numPoints]; for( i = 0; i < numPoints; i++ ) { points[i] = p.points[i]; mArray[i] = p.mArray[i]; }}PolyLineM::~PolyLineM(){ delete [] parts; delete [] points; delete [] mArray;}bool PolyLineM::read( int fd ){ RecordHeader rh; if( rh.read(fd) == false ) return false; SAFE_DELETE_ARRAY( parts ); SAFE_DELETE_ARRAY( points ); SAFE_DELETE_ARRAY( mArray ); Integer shapeType; if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) return false; if( shapeType != ShapeTypePolyLineM ) return false; if( bbox.read(fd) == false ) return false; if( readVal<Integer>(fd, numParts, LittleEndian ) == false ) return false; if( readVal<Integer>(fd, numPoints, LittleEndian ) == false ) return false; parts = new Integer[numParts]; int i; for( i = 0; i < numParts; i++ ) { if( readVal<Integer>(fd, parts[i], LittleEndian ) == false ) return false; } points = new struct Point[numPoints]; for( i = 0; i < numPoints; i++ ) { if( points[i].read(fd ) == false ) return false; } int X = 44 + (4 * numParts); int Y = X + (16 * numPoints); if( rh.contentLength > Y ) { mRange.read(fd); mArray = new Double[numPoints]; for( i = 0; i < numPoints; i++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -