📄 tabpolyline.cpp
字号:
/********************************************************************** * 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 + -