void QgsWFSData::endElement( const XML_Char* el ) { QString elementName( el ); QString localName = elementName.section( NS_SEPARATOR, 1, 1 ); if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( localName == mAttributeName ) //add a thematic attribute to the feature { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } //find index with attribute name QMap<QString, QPair<int, QgsField> >::const_iterator att_it = mThematicAttributes.find( mAttributeName ); if ( att_it != mThematicAttributes.constEnd() ) { QVariant var; switch ( att_it.value().second.type() ) { case QVariant::Double: var = QVariant( mStringCash.toDouble() ); break; case QVariant::Int: var = QVariant( mStringCash.toInt() ); break; case QVariant::LongLong: var = QVariant( mStringCash.toLongLong() ); break; default: //string type is default var = QVariant( mStringCash ); break; } mCurrentFeature->addAttribute( att_it.value().first, QVariant( mStringCash ) ); } } else if ( localName == mGeometryAttribute ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" && mParseModeStack.top() == QgsWFSData::boundingBox ) { //create bounding box from mStringCash if ( createBBoxFromCoordinateString( mExtent, mStringCash ) != 0 ) { QgsDebugMsg( "creation of bounding box failed" ); } if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" ) { //MH090531: Check if all feature attributes are initialised, sometimes attribute values are missing. //We fill the not initialized ones with empty strings, otherwise the feature cannot be exported to shp later QgsAttributeMap currentFeatureAttributes = mCurrentFeature->attributeMap(); QMap<QString, QPair<int, QgsField> >::const_iterator att_it = mThematicAttributes.constBegin(); for ( ; att_it != mThematicAttributes.constEnd(); ++att_it ) { int attIndex = att_it.value().first; QgsAttributeMap::const_iterator findIt = currentFeatureAttributes.find( attIndex ); if ( findIt == currentFeatureAttributes.constEnd() ) { mCurrentFeature->addAttribute( attIndex, QVariant( "" ) ); } } mCurrentFeature->setGeometryAndOwnership( mCurrentWKB, mCurrentWKBSize ); mFeatures.insert( mCurrentFeature->id(), mCurrentFeature ); if ( !mCurrentFeatureId.isEmpty() ) { mIdMap.insert( mCurrentFeature->id(), mCurrentFeatureId ); } ++mFeatureCount; mParseModeStack.pop(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Point" ) { std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } if ( mParseModeStack.top() != QgsWFSData::multiPoint ) { //directly add WKB point to the feature if ( getPointWKB( &mCurrentWKB, &mCurrentWKBSize, *( pointList.begin() ) ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiPoint ) //keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPoint; } } else //multipoint, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; if ( getPointWKB( &wkb, &wkbSize, *( pointList.begin() ) ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LineString" ) { //add WKB point to the feature std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } if ( mParseModeStack.top() != QgsWFSData::multiLine ) { if ( getLineWKB( &mCurrentWKB, &mCurrentWKBSize, pointList ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiLineString )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBLineString; } } else //multiline, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; if ( getLineWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LinearRing" ) { std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } unsigned char* wkb; int wkbSize; if ( getRingWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { if ( *mWkbType != QGis::WKBMultiPolygon )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPolygon; } if ( mParseModeStack.top() != QgsWFSData::multiPolygon ) { createPolygonFromFragments(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { *mWkbType = QGis::WKBMultiPoint; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPointFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { *mWkbType = QGis::WKBMultiLineString; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiLineFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { *mWkbType = QGis::WKBMultiPolygon; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPolygonFromFragments(); } }
void QgsGml::endElement( const XML_Char* el ) { QString elementName( QString::fromUtf8( el ) ); ParseMode theParseMode( mParseModeStack.isEmpty() ? none : mParseModeStack.top() ); QStringList splitName = elementName.split( NS_SEPARATOR ); QString localName = splitName.last(); QString ns = splitName.size() > 1 ? splitName.first() : ""; if (( theParseMode == coordinate && elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) || ( theParseMode == posList && ( elementName == GML_NAMESPACE + NS_SEPARATOR + "pos" || elementName == GML_NAMESPACE + NS_SEPARATOR + "posList" ) ) ) { mParseModeStack.pop(); } else if ( theParseMode == attribute && localName == mAttributeName ) //add a thematic attribute to the feature { mParseModeStack.pop(); setAttribute( mAttributeName, mStringCash ); } else if ( theParseMode == geometry && localName == mGeometryAttribute ) { mParseModeStack.pop(); } else if ( theParseMode == boundingBox && elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { //create bounding box from mStringCash if ( createBBoxFromCoordinateString( mCurrentExtent, mStringCash ) != 0 ) { QgsDebugMsg( "creation of bounding box failed" ); } mParseModeStack.pop(); } else if ( theParseMode == feature && localName == mTypeName ) { Q_ASSERT( mCurrentFeature ); if ( mCurrentWKBSize > 0 ) { mCurrentFeature->setGeometryAndOwnership( mCurrentWKB, mCurrentWKBSize ); } else if ( !mCurrentExtent.isEmpty() ) { mCurrentFeature->setGeometry( QgsGeometry::fromRect( mCurrentExtent ) ); } else { mCurrentFeature->setGeometry( 0 ); } mCurrentFeature->setValid( true ); mFeatures.insert( mCurrentFeature->id(), mCurrentFeature ); if ( !mCurrentFeatureId.isEmpty() ) { mIdMap.insert( mCurrentFeature->id(), mCurrentFeatureId ); } mCurrentFeature = 0; ++mFeatureCount; mParseModeStack.pop(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Point" ) { QList<QgsPoint> pointList; if ( pointsFromString( pointList, mStringCash ) != 0 ) { //error } if ( pointList.count() == 0 ) return; // error if ( theParseMode == QgsGml::geometry ) { //directly add WKB point to the feature if ( getPointWKB( &mCurrentWKB, &mCurrentWKBSize, *( pointList.begin() ) ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiPoint ) //keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPoint; } } else //multipoint, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; QList<unsigned char*> wkbList; QList<int> wkbSizeList; if ( getPointWKB( &wkb, &wkbSize, *( pointList.begin() ) ) != 0 ) { //error } if ( !mCurrentWKBFragments.isEmpty() ) { mCurrentWKBFragments.last().push_back( wkb ); mCurrentWKBFragmentSizes.last().push_back( wkbSize ); } else { QgsDebugMsg( "No wkb fragments" ); } } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LineString" ) { //add WKB point to the feature QList<QgsPoint> pointList; if ( pointsFromString( pointList, mStringCash ) != 0 ) { //error } if ( theParseMode == QgsGml::geometry ) { if ( getLineWKB( &mCurrentWKB, &mCurrentWKBSize, pointList ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiLineString )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBLineString; } } else //multiline, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; QList<unsigned char*> wkbList; QList<int> wkbSizeList; if ( getLineWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } if ( !mCurrentWKBFragments.isEmpty() ) { mCurrentWKBFragments.last().push_back( wkb ); mCurrentWKBFragmentSizes.last().push_back( wkbSize ); } else { QgsDebugMsg( "no wkb fragments" ); } } } else if (( theParseMode == geometry || theParseMode == multiPolygon ) && elementName == GML_NAMESPACE + NS_SEPARATOR + "LinearRing" ) { QList<QgsPoint> pointList; if ( pointsFromString( pointList, mStringCash ) != 0 ) { //error } unsigned char* wkb = 0; int wkbSize = 0; if ( getRingWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } if ( !mCurrentWKBFragments.isEmpty() ) { mCurrentWKBFragments.last().push_back( wkb ); mCurrentWKBFragmentSizes.last().push_back( wkbSize ); } else { QgsDebugMsg( "no wkb fragments" ); } } else if (( theParseMode == geometry || theParseMode == multiPolygon ) && elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { if ( *mWkbType != QGis::WKBMultiPolygon )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPolygon; } if ( theParseMode == geometry ) { createPolygonFromFragments(); } } else if ( theParseMode == multiPoint && elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { *mWkbType = QGis::WKBMultiPoint; mParseModeStack.pop(); createMultiPointFromFragments(); } else if ( theParseMode == multiLine && elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { *mWkbType = QGis::WKBMultiLineString; mParseModeStack.pop(); createMultiLineFromFragments(); } else if ( theParseMode == multiPolygon && elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { *mWkbType = QGis::WKBMultiPolygon; mParseModeStack.pop(); createMultiPolygonFromFragments(); } }
void QgsWFSData::endElement( const XML_Char* el ) { QString elementName( el ); QString localName = elementName.section( NS_SEPARATOR, 1, 1 ); if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( localName == mAttributeName ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } mCurrentFeature->addAttribute( mAttributeIndex, QVariant( mStringCash ) ); ++mAttributeIndex; } else if ( localName == mGeometryAttribute ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" && mParseModeStack.top() == QgsWFSData::boundingBox ) { //create bounding box from mStringCash if ( createBBoxFromCoordinateString( mExtent, mStringCash ) != 0 ) { qWarning( "creation of bounding box failed" ); } if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" ) { mCurrentFeature->setGeometryAndOwnership( mCurrentWKB, mCurrentWKBSize ); mFeatures << mCurrentFeature; ++mFeatureCount; //qWarning("Removing featureMember from stack"); mParseModeStack.pop(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Point" ) { std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash, mCoordinateSeparator, mTupleSeparator ) != 0 ) { //error } if ( mParseModeStack.top() != QgsWFSData::multiPoint ) { //directly add WKB point to the feature if ( getPointWKB( &mCurrentWKB, &mCurrentWKBSize, *( pointList.begin() ) ) != 0 ) { //error } *mWkbType = QGis::WKBPoint; } else //multipoint, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; if ( getPointWKB( &wkb, &wkbSize, *( pointList.begin() ) ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LineString" ) { //add WKB point to the feature std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash, mCoordinateSeparator, mTupleSeparator ) != 0 ) { //error } if ( mParseModeStack.top() != QgsWFSData::multiLine ) { if ( getLineWKB( &mCurrentWKB, &mCurrentWKBSize, pointList ) != 0 ) { //error } *mWkbType = QGis::WKBLineString; } else //multiline, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; if ( getLineWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LinearRing" ) { std::list<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash, mCoordinateSeparator, mTupleSeparator ) != 0 ) { //error } unsigned char* wkb; int wkbSize; if ( getRingWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.rbegin()->push_back( wkb ); mCurrentWKBFragmentSizes.rbegin()->push_back( wkbSize ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { *mWkbType = QGis::WKBPolygon; if ( mParseModeStack.top() != QgsWFSData::multiPolygon ) { createPolygonFromFragments(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPointFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiLineFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPolygonFromFragments(); } }
void QgsGml::endElement( const XML_Char* el ) { QString elementName( el ); QStringList splitName = elementName.split( NS_SEPARATOR ); QString localName = splitName.last(); QString ns = splitName.size() > 1 ? splitName.first() : ""; if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( localName == mAttributeName ) //add a thematic attribute to the feature { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } //find index with attribute name QMap<QString, QPair<int, QgsField> >::const_iterator att_it = mThematicAttributes.find( mAttributeName ); if ( att_it != mThematicAttributes.constEnd() ) { QVariant var; switch ( att_it.value().second.type() ) { case QVariant::Double: var = QVariant( mStringCash.toDouble() ); break; case QVariant::Int: var = QVariant( mStringCash.toInt() ); break; case QVariant::LongLong: var = QVariant( mStringCash.toLongLong() ); break; default: //string type is default var = QVariant( mStringCash ); break; } mCurrentFeature->setAttribute( att_it.value().first, QVariant( mStringCash ) ); } } else if ( localName == mGeometryAttribute ) { if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { //create bounding box from mStringCash if ( createBBoxFromCoordinateString( mCurrentExtent, mStringCash ) != 0 ) { QgsDebugMsg( "creation of bounding box failed" ); } if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } //else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" ) else if ( localName == mTypeName ) { if ( mCurrentWKBSize > 0 ) { mCurrentFeature->setGeometryAndOwnership( mCurrentWKB, mCurrentWKBSize ); } else if ( !mCurrentExtent.isEmpty() ) { mCurrentFeature->setGeometry( QgsGeometry::fromRect( mCurrentExtent ) ); } else { mCurrentFeature->setGeometry( 0 ); } mCurrentFeature->setValid( true ); mFeatures.insert( mCurrentFeature->id(), mCurrentFeature ); if ( !mCurrentFeatureId.isEmpty() ) { mIdMap.insert( mCurrentFeature->id(), mCurrentFeatureId ); } ++mFeatureCount; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Point" ) { QList<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } if ( mParseModeStack.top() != QgsGml::multiPoint ) { //directly add WKB point to the feature if ( getPointWKB( &mCurrentWKB, &mCurrentWKBSize, *( pointList.begin() ) ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiPoint ) //keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPoint; } } else //multipoint, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; QList<unsigned char*> wkbList; QList<int> wkbSizeList; if ( getPointWKB( &wkb, &wkbSize, *( pointList.begin() ) ) != 0 ) { //error } mCurrentWKBFragments.begin()->push_back( wkb ); mCurrentWKBFragmentSizes.begin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LineString" ) { //add WKB point to the feature QList<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } if ( mParseModeStack.top() != QgsGml::multiLine ) { if ( getLineWKB( &mCurrentWKB, &mCurrentWKBSize, pointList ) != 0 ) { //error } if ( *mWkbType != QGis::WKBMultiLineString )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBLineString; } } else //multiline, add WKB as fragment { unsigned char* wkb = 0; int wkbSize = 0; QList<unsigned char*> wkbList; QList<int> wkbSizeList; if ( getLineWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.begin()->push_back( wkb ); mCurrentWKBFragmentSizes.begin()->push_back( wkbSize ); //wkbList.push_back(wkb); //wkbSizeList.push_back(wkbSize); //mCurrentWKBFragments.push_back(wkbList); //mCurrentWKBFragmentSizes.push_back(wkbSizeList); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "LinearRing" ) { QList<QgsPoint> pointList; if ( pointsFromCoordinateString( pointList, mStringCash ) != 0 ) { //error } unsigned char* wkb; int wkbSize; if ( getRingWKB( &wkb, &wkbSize, pointList ) != 0 ) { //error } mCurrentWKBFragments.begin()->push_back( wkb ); mCurrentWKBFragmentSizes.begin()->push_back( wkbSize ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { if ( *mWkbType != QGis::WKBMultiPolygon )//keep multitype in case of geometry type mix { *mWkbType = QGis::WKBPolygon; } if ( mParseModeStack.top() != QgsGml::multiPolygon ) { createPolygonFromFragments(); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { *mWkbType = QGis::WKBMultiPoint; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPointFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { *mWkbType = QGis::WKBMultiLineString; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiLineFromFragments(); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { *mWkbType = QGis::WKBMultiPolygon; if ( !mParseModeStack.empty() ) { mParseModeStack.pop(); } createMultiPolygonFromFragments(); } }