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

📄 tabpolyline.cpp

📁 linux下一款GIS程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/********************************************************************** *                   TABPolyline::DumpMIF() * * Dump feature geometry in a format similar to .MIF PLINEs. **********************************************************************/void TABPolyline::DumpMIF(FILE *fpOut /*=NULL*/){    UGKGeometry   *poGeom;    UGKMultiLineString *poMultiLine = NULL;    UGKLineString *poLine = NULL;    int i, numPoints;    if (fpOut == NULL)        fpOut = stdout;    /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)    {        /*-------------------------------------------------------------         * Generate output for simple polyline         *------------------------------------------------------------*/        poLine = (UGKLineString*)poGeom;        numPoints = poLine->getNumPoints();        fprintf(fpOut, "PLINE %d\n", numPoints);        for(i=0; i<numPoints; i++)            fprintf(fpOut, "%g %g\n", poLine->getX(i), poLine->getY(i));    }    else if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbMultiLineString)    {        /*-------------------------------------------------------------         * Generate output for multiple polyline         *------------------------------------------------------------*/        int iLine, numLines;        poMultiLine = (UGKMultiLineString*)poGeom;        numLines = poMultiLine->getNumGeometries();        fprintf(fpOut, "PLINE MULTIPLE %d\n", numLines);        for(iLine=0; iLine < numLines; iLine++)        {            poGeom = poMultiLine->getGeometryRef(iLine);            if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)            {                poLine = (UGKLineString*)poGeom;                numPoints = poLine->getNumPoints();                fprintf(fpOut, " %d\n", numPoints);                for(i=0; i<numPoints; i++)                    fprintf(fpOut, "%g %g\n",poLine->getX(i),poLine->getY(i));            }            else            {                UGKError(ET_Failure, UGKErr_AssertionFailed,                          "TABPolyline: Object contains an invalid Geometry!");                return;            }        }    }    else    {        UGKError(ET_Failure, UGKErr_AssertionFailed,                  "TABPolyline: Missing or Invalid Geometry!");        return;    }    if (m_bCenterIsSet)        fprintf(fpOut, "Center %g %g\n", m_dCenterX, m_dCenterY);    // Finish with PEN/BRUSH/etc. clauses    DumpPenDef();    fflush(fpOut);}/********************************************************************** *                   TABPolyline::GetCenter() * * Returns the center point of the line.  Compute one if it was not  * explicitly set: * * In MapInfo, for a simple or multiple polyline (pline), the center point  * in the object definition is supposed to be either the center point of  * the pline or the first section of a multiple pline (if an odd number of  * points in the pline or first section), or the midway point between the  * two central points (if an even number of points involved).  * * Returns 0 on success, -1 on error. **********************************************************************/int TABPolyline::GetCenter(double &dX, double &dY){    if (!m_bCenterIsSet)    {        UGKGeometry     *poGeom;        UGKLineString   *poLine = NULL;        poGeom = GetGeometryRef();        if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)        {            poLine = (UGKLineString *)poGeom;        }        else if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbMultiLineString)        {            UGKMultiLineString *poMultiLine = (UGKMultiLineString*)poGeom;            if (poMultiLine->getNumGeometries() > 0)                poLine = (UGKLineString *)poMultiLine->getGeometryRef(0);        }        if (poLine && poLine->getNumPoints() > 0)        {            int i = poLine->getNumPoints()/2;            if (poLine->getNumPoints() % 2 == 0)            {                // Return the midway between the 2 center points                m_dCenterX = (poLine->getX(i-1) + poLine->getX(i))/2.0;                m_dCenterY = (poLine->getY(i-1) + poLine->getY(i))/2.0;            }            else            {                // Return the center point                m_dCenterX = poLine->getX(i);                m_dCenterY = poLine->getY(i);            }            m_bCenterIsSet = TRUE;        }    }    if (!m_bCenterIsSet)        return -1;    dX = m_dCenterX;    dY = m_dCenterY;    return 0;}/********************************************************************** *                   TABPolyline::SetCenter() * * Set the X,Y coordinates to use as center point for the line. **********************************************************************/void TABPolyline::SetCenter(double dX, double dY){    m_dCenterX = dX;    m_dCenterY = dY;    m_bCenterIsSet = TRUE;}/********************************************************************** * **********************************************************************/int TABPolyline::ReadGeometryFromMIFFile(MIDDATAFile *fp){    const char          *pszLine;    char               **papszToken;    UGKLineString       *poLine;    UGKMultiLineString  *poMultiLine;    UGKBool                bMultiple = FALSE;    int                  nNumPoints,nNumSec=0,i,j;    UGKEnvelope          sEnvelope;        papszToken = TokenizeString2(fp->GetLastLine(),                                     " \t", 0x0001);        if (CountOfList(papszToken) < 1)    {        FreeStrList(papszToken);        return -1;    }    if (EQUALN(papszToken[0],"LINE",4))    {        if (CountOfList(papszToken) != 5)          return -1;        poLine = new UGKLineString();        poLine->setNumPoints(2);        poLine->setPoint(0, fp->GetXTrans(atof(papszToken[1])),                         fp->GetYTrans(atof(papszToken[2])));        poLine->setPoint(1, fp->GetXTrans(atof(papszToken[3])),                         fp->GetYTrans(atof(papszToken[4])));        SetGeometryDirectly(poLine);        poLine->getEnvelope(&sEnvelope);        SetMBR(sEnvelope.MinX, sEnvelope.MinY,sEnvelope.MaxX,sEnvelope.MaxY);    }    else if (EQUALN(papszToken[0],"PLINE",5))    {        switch (CountOfList(papszToken))        {          case 1:            bMultiple = FALSE;            pszLine = fp->GetLine();            nNumPoints = atoi(pszLine);            break;          case 2:            bMultiple = FALSE;            nNumPoints = atoi(papszToken[1]);            break;          case 3:            if (EQUALN(papszToken[1],"MULTIPLE",8))            {                bMultiple = TRUE;                nNumSec = atoi(papszToken[2]);                pszLine = fp->GetLine();                nNumPoints = atoi(pszLine);                break;            }            else            {              FreeStrList(papszToken);              return -1;            }            break;          case 4:            if (EQUALN(papszToken[1],"MULTIPLE",8))            {                bMultiple = TRUE;                nNumSec = atoi(papszToken[2]);                nNumPoints = atoi(papszToken[3]);                break;            }            else            {                FreeStrList(papszToken);                return -1;            }            break;          default:            FreeStrList(papszToken);            return -1;            break;        }        if (bMultiple)        {            poMultiLine = new UGKMultiLineString();            for (j=0;j<nNumSec;j++)            {                poLine = new UGKLineString();                if (j != 0)                    nNumPoints = atoi(fp->GetLine());                if (nNumPoints < 2)                {                    UGKError(ET_Failure, UGKErr_FileIO,                              "Invalid number of vertices (%d) in PLINE "                              "MULTIPLE segment.", nNumPoints);                    return -1;                }                poLine->setNumPoints(nNumPoints);                for (i=0;i<nNumPoints;i++)                {                    FreeStrList(papszToken);                    papszToken = TokenizeString2(fp->GetLine(),                                                     " \t", 0x0001);                    poLine->setPoint(i,fp->GetXTrans(atof(papszToken[0])),                                     fp->GetYTrans(atof(papszToken[1])));                }                if (poMultiLine->addGeometryDirectly(poLine) != UGKERR_NONE)                {                    assert(FALSE); // Just in case UGK is modified                }            }            if (SetGeometryDirectly(poMultiLine) != UGKERR_NONE)            {                assert(FALSE); // Just in case UGK is modified            }            poMultiLine->getEnvelope(&sEnvelope);            SetMBR(sEnvelope.MinX, sEnvelope.MinY,                   sEnvelope.MaxX,sEnvelope.MaxY);        }        else        {            poLine = new UGKLineString();            poLine->setNumPoints(nNumPoints);            for (i=0;i<nNumPoints;i++)            {                FreeStrList(papszToken);                papszToken = TokenizeString2(fp->GetLine(),                                                 " \t", 0x0001);                    if (CountOfList(papszToken) != 2)                  return -1;                poLine->setPoint(i,fp->GetXTrans(atof(papszToken[0])),                                 fp->GetYTrans(atof(papszToken[1])));            }            SetGeometryDirectly(poLine);            poLine->getEnvelope(&sEnvelope);            SetMBR(sEnvelope.MinX, sEnvelope.MinY,                   sEnvelope.MaxX,sEnvelope.MaxY);        }    }            FreeStrList(papszToken);    papszToken = NULL;        while (((pszLine = fp->GetLine()) != NULL) &&            fp->IsValidFeature(pszLine) == FALSE)    {        papszToken = TokenizeStringComplex(pszLine,"() ,",                                              TRUE,FALSE);                if (CountOfList(papszToken) >= 1)        {            if (EQUALN(papszToken[0],"PEN",3))            {                                if (CountOfList(papszToken) == 4)                {                                       SetPenWidthMIF(atoi(papszToken[1]));                    SetPenPattern(atoi(papszToken[2]));                    SetPenColor(atoi(papszToken[3]));                }                            }            else if (EQUALN(papszToken[0],"SMOOTH",6))            {                m_bSmooth = TRUE;            }                     }        FreeStrList(papszToken);    }    return 0; }/********************************************************************** * **********************************************************************/int TABPolyline::WriteGeometryToMIFFile(MIDDATAFile *fp){     UGKGeometry   *poGeom;    UGKMultiLineString *poMultiLine = NULL;    UGKLineString *poLine = NULL;    int nNumPoints,i;      /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)    {        /*-------------------------------------------------------------         * Simple polyline         *------------------------------------------------------------*/        poLine = (UGKLineString*)poGeom;        nNumPoints = poLine->getNumPoints();        if (nNumPoints == 2)        {            fp->WriteLine("Line %.16g %.16g %.16g %.16g\n",poLine->getX(0),poLine->getY(0),                          poLine->getX(1),poLine->getY(1));        }        else        {                        fp->WriteLine("Pline %d\n",nNumPoints);            for (i=0;i<nNumPoints;i++)            {                fp->WriteLine("%.16g %.16g\n",poLine->getX(i),poLine->getY(i));            }        }    }    else if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbMultiLineString)    {        /*-------------------------------------------------------------         * Multiple polyline... validate all components         *------------------------------------------------------------*/        int iLine, numLines;        poMultiLine = (UGKMultiLineString*)poGeom;        numLines = poMultiLine->getNumGeometries();        fp->WriteLine("PLINE MULTIPLE %d\n", numLines);        for(iLine=0; iLine < numLines; iLine++)        {            poGeom = poMultiLine->getGeometryRef(iLine);            if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)            {                 poLine = (UGKLineString*)poGeom;                nNumPoints = poLine->getNumPoints();                        fp->WriteLine("  %d\n",nNumPoints);                for (i=0;i<nNumPoints;i++)                {                    fp->WriteLine("%.16g %.16g\n",poLine->getX(i),poLine->getY(i));                }            }            else            {                UGKError(ET_Failure, UGKErr_AssertionFailed,                          "TABPolyline: Object contains an invalid Geometry!");            }        }    }    else    {        UGKError(ET_Failure, UGKErr_AssertionFailed,                  "TABPolyline: Missing or Invalid Geometry!");    }        if (GetPenPattern())      fp->WriteLine("    Pen (%d,%d,%d)\n",GetPenWidthMIF(),GetPenPattern(),                    GetPenColor());    if (m_bSmooth)      fp->WriteLine("    Smooth\n");    return 0; }

⌨️ 快捷键说明

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