OGRErr OGRPolygon::importFromWKTListOnly( char ** ppszInput, int bHasZ, int bHasM, OGRRawPoint*& paoPoints, int& nMaxPoints, double*& padfZ ) { char szToken[OGR_WKT_TOKEN_MAX] = {}; const char *pszInput = *ppszInput; // Skip first '('. pszInput = OGRWktReadToken( pszInput, szToken ); if( EQUAL(szToken, "EMPTY") ) { *ppszInput = (char*) pszInput; return OGRERR_NONE; } if( !EQUAL(szToken, "(") ) return OGRERR_CORRUPT_DATA; /* ==================================================================== */ /* Read each ring in turn. Note that we try to reuse the same */ /* point list buffer from ring to ring to cut down on */ /* allocate/deallocate overhead. */ /* ==================================================================== */ int nMaxRings = 0; double *padfM = NULL; do { const char* pszNext = OGRWktReadToken( pszInput, szToken ); if( EQUAL(szToken, "EMPTY") ) { /* -------------------------------------------------------------------- */ /* Do we need to grow the ring array? */ /* -------------------------------------------------------------------- */ if( oCC.nCurveCount == nMaxRings ) { nMaxRings = nMaxRings * 2 + 1; oCC.papoCurves = static_cast<OGRCurve **>( CPLRealloc(oCC.papoCurves, nMaxRings * sizeof(OGRLinearRing*))); } oCC.papoCurves[oCC.nCurveCount] = new OGRLinearRing(); oCC.nCurveCount++; pszInput = OGRWktReadToken( pszNext, szToken ); if( !EQUAL(szToken, ",") ) break; continue; } /* -------------------------------------------------------------------- */ /* Read points for one ring from input. */ /* -------------------------------------------------------------------- */ int nPoints = 0; int flagsFromInput = flags; if( flagsFromInput == 0 ) { // Flags was not set, this is not called by us. if( bHasM ) flagsFromInput |= OGR_G_MEASURED; if( bHasZ ) flagsFromInput |= OGR_G_3D; } pszInput = OGRWktReadPointsM( pszInput, &paoPoints, &padfZ, &padfM, &flagsFromInput, &nMaxPoints, &nPoints ); if( pszInput == NULL || nPoints == 0 ) { CPLFree(padfM); return OGRERR_CORRUPT_DATA; } if( (flagsFromInput & OGR_G_3D) && !(flags & OGR_G_3D) ) { flags |= OGR_G_3D; bHasZ = TRUE; } if( (flagsFromInput & OGR_G_MEASURED) && !(flags & OGR_G_MEASURED) ) { flags |= OGR_G_MEASURED; bHasM = TRUE; } /* -------------------------------------------------------------------- */ /* Do we need to grow the ring array? */ /* -------------------------------------------------------------------- */ if( oCC.nCurveCount == nMaxRings ) { nMaxRings = nMaxRings * 2 + 1; oCC.papoCurves = static_cast<OGRCurve **>( CPLRealloc(oCC.papoCurves, nMaxRings * sizeof(OGRLinearRing*))); } /* -------------------------------------------------------------------- */ /* Create the new ring, and assign to ring list. */ /* -------------------------------------------------------------------- */ OGRLinearRing* poLR = new OGRLinearRing(); oCC.papoCurves[oCC.nCurveCount] = poLR; if( bHasM && bHasZ ) poLR->setPoints(nPoints, paoPoints, padfZ, padfM); else if( bHasM ) poLR->setPointsM(nPoints, paoPoints, padfM); else if( bHasZ ) poLR->setPoints(nPoints, paoPoints, padfZ); else poLR->setPoints(nPoints, paoPoints); oCC.nCurveCount++; /* -------------------------------------------------------------------- */ /* Read the delimiter following the ring. */ /* -------------------------------------------------------------------- */ pszInput = OGRWktReadToken( pszInput, szToken ); } while( szToken[0] == ',' ); CPLFree( padfM ); /* -------------------------------------------------------------------- */ /* freak if we don't get a closing bracket. */ /* -------------------------------------------------------------------- */ if( szToken[0] != ')' ) return OGRERR_CORRUPT_DATA; *ppszInput = const_cast<char *>(pszInput); return OGRERR_NONE; }