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

📄 esrishape.cpp

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