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

📄 mitab_feature_mif.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        char               **papszToken;    const char *pszLine;    double dfX,dfY;    papszToken = CSLTokenizeString2(fp->GetSavedLine(),                                     " \t", CSLT_HONOURSTRINGS);         if (CSLCount(papszToken) !=3)    {        CSLDestroy(papszToken);        return -1;    }        dfX = fp->GetXTrans(atof(papszToken[1]));    dfY = fp->GetYTrans(atof(papszToken[2]));    CSLDestroy(papszToken);    papszToken = NULL;    // Read optional SYMBOL line...    pszLine = fp->GetLastLine();    if( pszLine != NULL )        papszToken = CSLTokenizeStringComplex(pszLine," ,()\t",                                              TRUE,FALSE);    if (CSLCount(papszToken) == 4 && EQUAL(papszToken[0], "SYMBOL") )    {        SetSymbolNo(atoi(papszToken[1]));        SetSymbolColor(atoi(papszToken[2]));        SetSymbolSize(atoi(papszToken[3]));    }    CSLDestroy(papszToken);     papszToken = NULL;    // scan until we reach 1st line of next feature    // Since SYMBOL is optional, we have to test IsValidFeature() on that    // line as well.    while (pszLine && fp->IsValidFeature(pszLine) == FALSE)    {        pszLine = fp->GetLine();    }        poGeometry = new OGRPoint(dfX, dfY);        SetGeometryDirectly(poGeometry);    SetMBR(dfX, dfY, dfX, dfY);        return 0; }/********************************************************************** * **********************************************************************/int TABPoint::WriteGeometryToMIFFile(MIDDATAFile *fp){     OGRGeometry         *poGeom;    OGRPoint            *poPoint;     /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)        poPoint = (OGRPoint*)poGeom;    else    {        CPLError(CE_Failure, CPLE_AssertionFailed,                 "TABPoint: Missing or Invalid Geometry!");        return -1;    }    fp->WriteLine("Point %.16g %.16g\n",poPoint->getX(),poPoint->getY());    fp->WriteLine("    Symbol (%d,%d,%d)\n",GetSymbolNo(),GetSymbolColor(),                  GetSymbolSize());    return 0; }/********************************************************************** * **********************************************************************/int TABFontPoint::ReadGeometryFromMIFFile(MIDDATAFile *fp){       OGRGeometry         *poGeometry;        char               **papszToken;    const char *pszLine;    double dfX,dfY;    papszToken = CSLTokenizeString2(fp->GetSavedLine(),                                     " \t", CSLT_HONOURSTRINGS);    if (CSLCount(papszToken) !=3)    {        CSLDestroy(papszToken);        return -1;    }    dfX = fp->GetXTrans(atof(papszToken[1]));    dfY = fp->GetYTrans(atof(papszToken[2]));        CSLDestroy(papszToken);        papszToken = CSLTokenizeStringComplex(fp->GetLastLine()," ,()\t",                                          TRUE,FALSE);    if (CSLCount(papszToken) !=7)    {        CSLDestroy(papszToken);        return -1;    }        SetSymbolNo(atoi(papszToken[1]));    SetSymbolColor(atoi(papszToken[2]));    SetSymbolSize(atoi(papszToken[3]));    SetFontName(papszToken[4]);    SetFontStyleMIFValue(atoi(papszToken[5]));    SetSymbolAngle(atof(papszToken[6]));    CSLDestroy(papszToken);        poGeometry = new OGRPoint(dfX, dfY);        SetGeometryDirectly(poGeometry);    SetMBR(dfX, dfY, dfX, dfY);    /* Go to the first line of the next feature */    while (((pszLine = fp->GetLine()) != NULL) &&            fp->IsValidFeature(pszLine) == FALSE)      ;    return 0; }/********************************************************************** * **********************************************************************/int TABFontPoint::WriteGeometryToMIFFile(MIDDATAFile *fp){     OGRGeometry         *poGeom;    OGRPoint            *poPoint;     /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)        poPoint = (OGRPoint*)poGeom;    else    {        CPLError(CE_Failure, CPLE_AssertionFailed,                 "TABFontPoint: Missing or Invalid Geometry!");        return -1;    }    fp->WriteLine("Point %.16g %.16g\n",poPoint->getX(),poPoint->getY());    fp->WriteLine("    Symbol (%d,%d,%d,\"%s\",%d,%.16g)\n",                  GetSymbolNo(),GetSymbolColor(),                  GetSymbolSize(),GetFontNameRef(),GetFontStyleMIFValue(),                  GetSymbolAngle());    return 0; }/********************************************************************** * **********************************************************************/int TABCustomPoint::ReadGeometryFromMIFFile(MIDDATAFile *fp){       OGRGeometry         *poGeometry;        char               **papszToken;    const char          *pszLine;    double               dfX,dfY;    papszToken = CSLTokenizeString2(fp->GetSavedLine(),                                     " \t", CSLT_HONOURSTRINGS);        if (CSLCount(papszToken) !=3)    {        CSLDestroy(papszToken);        return -1;    }    dfX = fp->GetXTrans(atof(papszToken[1]));    dfY = fp->GetYTrans(atof(papszToken[2]));    CSLDestroy(papszToken);        papszToken = CSLTokenizeStringComplex(fp->GetLastLine()," ,()\t",                                          TRUE,FALSE);    if (CSLCount(papszToken) !=5)    {                CSLDestroy(papszToken);        return -1;    }        SetFontName(papszToken[1]);    SetSymbolColor(atoi(papszToken[2]));    SetSymbolSize(atoi(papszToken[3]));    m_nCustomStyle = atoi(papszToken[4]);        CSLDestroy(papszToken);        poGeometry = new OGRPoint(dfX, dfY);        SetGeometryDirectly(poGeometry);    SetMBR(dfX, dfY, dfX, dfY);    /* Go to the first line of the next feature */    while (((pszLine = fp->GetLine()) != NULL) &&            fp->IsValidFeature(pszLine) == FALSE)      ;     return 0; }/********************************************************************** * **********************************************************************/int TABCustomPoint::WriteGeometryToMIFFile(MIDDATAFile *fp){     OGRGeometry         *poGeom;    OGRPoint            *poPoint;     /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)        poPoint = (OGRPoint*)poGeom;    else    {        CPLError(CE_Failure, CPLE_AssertionFailed,                 "TABCustomPoint: Missing or Invalid Geometry!");        return -1;    }     fp->WriteLine("Point %.16g %.16g\n",poPoint->getX(),poPoint->getY());    fp->WriteLine("    Symbol (\"%s\",%d,%d,%d)\n",GetFontNameRef(),                  GetSymbolColor(), GetSymbolSize(),m_nCustomStyle);    return 0; }/********************************************************************** * **********************************************************************/int TABPolyline::ReadGeometryFromMIFFile(MIDDATAFile *fp){    const char          *pszLine;    char               **papszToken;    OGRLineString       *poLine;    OGRMultiLineString  *poMultiLine;    GBool                bMultiple = FALSE;    int                  nNumPoints,nNumSec=0,i,j;    OGREnvelope          sEnvelope;        papszToken = CSLTokenizeString2(fp->GetLastLine(),                                     " \t", CSLT_HONOURSTRINGS);        if (CSLCount(papszToken) < 1)    {        CSLDestroy(papszToken);        return -1;    }    if (EQUALN(papszToken[0],"LINE",4))    {        if (CSLCount(papszToken) != 5)          return -1;        poLine = new OGRLineString();        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 (CSLCount(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            {              CSLDestroy(papszToken);              return -1;            }            break;          case 4:            if (EQUALN(papszToken[1],"MULTIPLE",8))            {                bMultiple = TRUE;                nNumSec = atoi(papszToken[2]);                nNumPoints = atoi(papszToken[3]);                break;            }            else            {                CSLDestroy(papszToken);                return -1;            }            break;          default:            CSLDestroy(papszToken);            return -1;            break;        }        if (bMultiple)        {            poMultiLine = new OGRMultiLineString();            for (j=0;j<nNumSec;j++)            {                poLine = new OGRLineString();                if (j != 0)                    nNumPoints = atoi(fp->GetLine());                if (nNumPoints < 2)                {                    CPLError(CE_Failure, CPLE_FileIO,                             "Invalid number of vertices (%d) in PLINE "                             "MULTIPLE segment.", nNumPoints);                    return -1;                }                poLine->setNumPoints(nNumPoints);                for (i=0;i<nNumPoints;i++)                {                    CSLDestroy(papszToken);                    papszToken = CSLTokenizeString2(fp->GetLine(),                                                     " \t", CSLT_HONOURSTRINGS);                    poLine->setPoint(i,fp->GetXTrans(atof(papszToken[0])),                                     fp->GetYTrans(atof(papszToken[1])));                }                if (poMultiLine->addGeometryDirectly(poLine) != OGRERR_NONE)                {                    CPLAssert(FALSE); // Just in case OGR is modified                }            }            if (SetGeometryDirectly(poMultiLine) != OGRERR_NONE)            {                CPLAssert(FALSE); // Just in case OGR is modified            }            poMultiLine->getEnvelope(&sEnvelope);            SetMBR(sEnvelope.MinX, sEnvelope.MinY,                   sEnvelope.MaxX,sEnvelope.MaxY);        }        else        {            poLine = new OGRLineString();            poLine->setNumPoints(nNumPoints);            for (i=0;i<nNumPoints;i++)            {                CSLDestroy(papszToken);                papszToken = CSLTokenizeString2(fp->GetLine(),                                                 " \t", CSLT_HONOURSTRINGS);                    if (CSLCount(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,

⌨️ 快捷键说明

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