int QgsWFSData::createMultiPointFromFragments() { mCurrentWKBSize = 0; mCurrentWKBSize += 1 + 2 * sizeof( int ); mCurrentWKBSize += totalWKBFragmentSize(); mCurrentWKB = new unsigned char[mCurrentWKBSize]; int pos = 0; QGis::WkbType type = QGis::WKBMultiPoint; int numPoints = mCurrentWKBFragments.begin()->size(); memcpy( &( mCurrentWKB[pos] ), &mEndian, 1 ); pos += 1; memcpy( &( mCurrentWKB[pos] ), &type, sizeof( int ) ); pos += sizeof( int ); memcpy( &( mCurrentWKB[pos] ), &numPoints, sizeof( int ) ); pos += sizeof( int ); std::list<unsigned char*>::iterator wkbIt = mCurrentWKBFragments.begin()->begin(); std::list<int>::iterator sizeIt = mCurrentWKBFragmentSizes.begin()->begin(); for ( ; wkbIt != mCurrentWKBFragments.begin()->end(); ++wkbIt, ++sizeIt ) { memcpy( &( mCurrentWKB[pos] ), *wkbIt, *sizeIt ); pos += *sizeIt; delete[] *wkbIt; } mCurrentWKBFragments.clear(); mCurrentWKBFragmentSizes.clear(); *mWkbType = QGis::WKBMultiPoint; return 0; }
int QgsGml::createMultiLineFromFragments() { mCurrentWKBSize = 0; mCurrentWKBSize += 1 + 2 * sizeof( int ); mCurrentWKBSize += totalWKBFragmentSize(); mCurrentWKB = new unsigned char[mCurrentWKBSize]; int pos = 0; QGis::WkbType type = QGis::WKBMultiLineString; int numLines = mCurrentWKBFragments.begin()->size(); //add endian memcpy( &( mCurrentWKB[pos] ), &mEndian, 1 ); pos += 1; memcpy( &( mCurrentWKB[pos] ), &type, sizeof( int ) ); pos += sizeof( int ); memcpy( &( mCurrentWKB[pos] ), &numLines, sizeof( int ) ); pos += sizeof( int ); QList<unsigned char*>::iterator wkbIt = mCurrentWKBFragments.begin()->begin(); QList<int>::iterator sizeIt = mCurrentWKBFragmentSizes.begin()->begin(); //copy (and delete) all the wkb fragments for ( ; wkbIt != mCurrentWKBFragments.begin()->end(); ++wkbIt, ++sizeIt ) { memcpy( &( mCurrentWKB[pos] ), *wkbIt, *sizeIt ); pos += *sizeIt; delete[] *wkbIt; } mCurrentWKBFragments.clear(); mCurrentWKBFragmentSizes.clear(); *mWkbType = QGis::WKBMultiLineString; return 0; }
int QgsGml::createMultiPolygonFromFragments() { mCurrentWKBSize = 0; mCurrentWKBSize += 1 + 2 * sizeof( int ); mCurrentWKBSize += totalWKBFragmentSize(); mCurrentWKBSize += mCurrentWKBFragments.size() * ( 1 + 2 * sizeof( int ) ); //fragments are just the rings mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); QgsWkbPtr wkbPtr( mCurrentWKB ); wkbPtr << ( char ) mEndian << QGis::WKBMultiPolygon << mCurrentWKBFragments.size(); //have outer and inner iterators QList< QList<QgsWkbPtr> >::const_iterator outerWkbIt = mCurrentWKBFragments.constBegin(); for ( ; outerWkbIt != mCurrentWKBFragments.constEnd(); ++outerWkbIt ) { //new polygon wkbPtr << ( char ) mEndian << QGis::WKBPolygon << outerWkbIt->size(); QList<QgsWkbPtr>::const_iterator innerWkbIt = outerWkbIt->constBegin(); for ( ; innerWkbIt != outerWkbIt->constEnd(); ++innerWkbIt ) { memcpy( wkbPtr, *innerWkbIt, innerWkbIt->size() ); wkbPtr += innerWkbIt->size(); delete[] *innerWkbIt; } } mCurrentWKBFragments.clear(); *mWkbType = QGis::WKBMultiPolygon; return 0; }
int QgsWFSData::createMultiPolygonFromFragments() { mCurrentWKBSize = 0; mCurrentWKBSize += 1 + 2 * sizeof( int ); mCurrentWKBSize += totalWKBFragmentSize(); mCurrentWKBSize += mCurrentWKBFragments.size() * ( 1 + 2 * sizeof( int ) ); //fragments are just the rings mCurrentWKB = new unsigned char[mCurrentWKBSize]; int pos = 0; QGis::WkbType type = QGis::WKBMultiPolygon; QGis::WkbType polygonType = QGis::WKBPolygon; int numPolys = mCurrentWKBFragments.size(); int numRings; memcpy( &( mCurrentWKB[pos] ), &mEndian, 1 ); pos += 1; memcpy( &( mCurrentWKB[pos] ), &type, sizeof( int ) ); pos += sizeof( int ); memcpy( &( mCurrentWKB[pos] ), &numPolys, sizeof( int ) ); pos += sizeof( int ); //have outer and inner iterators std::list<std::list<unsigned char*> >::iterator outerWkbIt; std::list<std::list<int> >::iterator outerSizeIt; std::list<unsigned char*>::iterator innerWkbIt; std::list<int>::iterator innerSizeIt; outerWkbIt = mCurrentWKBFragments.begin(); outerSizeIt = mCurrentWKBFragmentSizes.begin(); for ( ; outerWkbIt != mCurrentWKBFragments.end(); ++outerWkbIt, ++outerSizeIt ) { //new polygon memcpy( &( mCurrentWKB[pos] ), &mEndian, 1 ); pos += 1; memcpy( &( mCurrentWKB[pos] ), &polygonType, sizeof( int ) ); pos += sizeof( int ); numRings = outerWkbIt->size(); memcpy( &( mCurrentWKB[pos] ), &numRings, sizeof( int ) ); pos += sizeof( int ); innerWkbIt = outerWkbIt->begin(); innerSizeIt = outerSizeIt->begin(); for ( ; innerWkbIt != outerWkbIt->end(); ++innerWkbIt, ++innerSizeIt ) { memcpy( &( mCurrentWKB[pos] ), *innerWkbIt, *innerSizeIt ); pos += *innerSizeIt; delete[] *innerWkbIt; } } mCurrentWKBFragments.clear(); mCurrentWKBFragmentSizes.clear(); *mWkbType = QGis::WKBMultiPolygon; return 0; }
int QgsGml::createPolygonFromFragments() { mCurrentWKBSize = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); QgsWkbPtr wkbPtr( mCurrentWKB ); wkbPtr << mEndian << QGis::WKBPolygon << mCurrentWKBFragments.constBegin()->size(); QList<QgsWkbPtr>::const_iterator wkbIt = mCurrentWKBFragments.constBegin()->constBegin(); for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt ) { memcpy( wkbPtr, *wkbIt, wkbIt->size() ); wkbPtr += wkbIt->size(); delete[] *wkbIt; } mCurrentWKBFragments.clear(); *mWkbType = QGis::WKBPolygon; return 0; }
int QgsGml::createMultiLineFromFragments() { mCurrentWKBSize = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); QgsWkbPtr wkbPtr( mCurrentWKB, mCurrentWKBSize ); wkbPtr << mEndian << QGis::WKBMultiLineString << mCurrentWKBFragments.constBegin()->size(); //copy (and delete) all the wkb fragments QList<QgsWkbPtr>::const_iterator wkbIt = mCurrentWKBFragments.constBegin()->constBegin(); for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt ) { memcpy( wkbPtr, *wkbIt, wkbIt->size() ); wkbPtr += wkbIt->size(); delete[] *wkbIt; } mCurrentWKBFragments.clear(); *mWkbType = QGis::WKBMultiLineString; return 0; }