void QgsWFSData::startElement( const XML_Char* el, const XML_Char** attr ) { QString elementName( el ); QString localName = elementName.section( NS_SEPARATOR, 1, 1 ); if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { mParseModeStack.push( QgsWFSData::coordinate ); mStringCash.clear(); mCoordinateSeparator = readAttribute( "cs", attr ); if ( mCoordinateSeparator.isEmpty() ) { mCoordinateSeparator = ","; } mTupleSeparator = readAttribute( "ts", attr ); if ( mTupleSeparator.isEmpty() ) { mTupleSeparator = " "; } } else if ( localName == mGeometryAttribute ) { mParseModeStack.push( QgsWFSData::geometry ); } else if ( mParseModeStack.size() == 0 && elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { mParseModeStack.push( QgsWFSData::boundingBox ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" ) { mCurrentFeature = new QgsFeature( mFeatureCount ); mParseModeStack.push( QgsWFSData::featureMember ); } else if ( localName == mTypeName ) { mCurrentFeatureId = readAttribute( "fid", attr ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Box" && mParseModeStack.top() == QgsWFSData::boundingBox ) { //read attribute srsName="EPSG:26910" int epsgNr; if ( readEpsgFromAttribute( epsgNr, attr ) != 0 ) { QgsDebugMsg( "error, could not get epsg id" ); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { mParseModeStack.push( QgsWFSData::multiPoint ); //we need one nested list for intermediate WKB std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { mParseModeStack.push( QgsWFSData::multiLine ); //we need one nested list for intermediate WKB std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { mParseModeStack.push( QgsWFSData::multiPolygon ); } else if ( mParseModeStack.size() == 1 && mParseModeStack.top() == QgsWFSData::featureMember && mThematicAttributes.find( localName ) != mThematicAttributes.end() ) { mParseModeStack.push( QgsWFSData::attribute ); mAttributeName = localName; mStringCash.clear(); } }
void QgsGml::startElement( const XML_Char* el, const XML_Char** attr ) { 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 ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { mParseModeStack.push( QgsGml::coordinate ); mCoorMode = QgsGml::coordinate; mStringCash.clear(); mCoordinateSeparator = readAttribute( "cs", attr ); if ( mCoordinateSeparator.isEmpty() ) { mCoordinateSeparator = ","; } mTupleSeparator = readAttribute( "ts", attr ); if ( mTupleSeparator.isEmpty() ) { mTupleSeparator = " "; } } if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "pos" || elementName == GML_NAMESPACE + NS_SEPARATOR + "posList" ) { mParseModeStack.push( QgsGml::posList ); mCoorMode = QgsGml::posList; mStringCash.clear(); QString dimension = readAttribute( "srsDimension", attr ); bool ok; mDimension = dimension.toInt( &ok ); if ( dimension.isEmpty() || !ok ) { mDimension = 2; } } else if ( localName == mGeometryAttribute ) { mParseModeStack.push( QgsGml::geometry ); } //else if ( mParseModeStack.size() == 0 && elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { mParseModeStack.push( QgsGml::boundingBox ); } else if ( theParseMode == none && localName == mTypeName ) { Q_ASSERT( !mCurrentFeature ); mCurrentFeature = new QgsFeature( mFeatureCount ); QgsAttributes attributes( mThematicAttributes.size() ); //add empty attributes mCurrentFeature->setAttributes( attributes ); mParseModeStack.push( QgsGml::feature ); mCurrentFeatureId = readAttribute( "fid", attr ); } else if ( theParseMode == boundingBox && elementName == GML_NAMESPACE + NS_SEPARATOR + "Box" ) { //read attribute srsName="EPSG:26910" int epsgNr; if ( readEpsgFromAttribute( epsgNr, attr ) != 0 ) { QgsDebugMsg( "error, could not get epsg id" ); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { mParseModeStack.push( QgsGml::multiPoint ); //we need one nested list for intermediate WKB mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { mParseModeStack.push( QgsGml::multiLine ); //we need one nested list for intermediate WKB mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { mParseModeStack.push( QgsGml::multiPolygon ); } else if ( theParseMode == feature && mThematicAttributes.contains( localName ) ) { mParseModeStack.push( QgsGml::attribute ); mAttributeName = localName; mStringCash.clear(); } // QGIS server (2.2) is using: // <Attribute value="My description" name="desc"/> else if ( theParseMode == feature && localName.compare( "attribute", Qt::CaseInsensitive ) == 0 ) { QString name = readAttribute( "name", attr ); if ( mThematicAttributes.contains( name ) ) { QString value = readAttribute( "value", attr ); setAttribute( name, value ); } } if ( mEpsg == 0 && ( localName == "Point" || localName == "MultiPoint" || localName == "LineString" || localName == "MultiLineString" || localName == "Polygon" || localName == "MultiPolygon" ) ) { if ( readEpsgFromAttribute( mEpsg, attr ) != 0 ) { QgsDebugMsg( "error, could not get epsg id" ); } else { QgsDebugMsg( QString( "mEpsg = %1" ).arg( mEpsg ) ); } } }
void QgsWFSData::startElement( const XML_Char* el, const XML_Char** attr ) { QString elementName( el ); QString localName = elementName.section( NS_SEPARATOR, 1, 1 ); if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { mParseModeStack.push( QgsWFSData::coordinate ); mStringCash.clear(); mCoordinateSeparator = readCsFromAttribute( attr ); mTupleSeparator = readTsFromAttribute( attr ); } else if ( localName == mGeometryAttribute ) { mParseModeStack.push( QgsWFSData::geometry ); } else if ( mParseModeStack.size() == 0 && elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { mParseModeStack.push( QgsWFSData::boundingBox ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" ) { mCurrentFeature = new QgsFeature( mFeatureCount ); mAttributeIndex = 0; mParseModeStack.push( QgsWFSData::featureMember ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Box" && mParseModeStack.top() == QgsWFSData::boundingBox ) { //read attribute srsName="EPSG:26910" int epsgNr; if ( readEpsgFromAttribute( epsgNr, attr ) != 0 ) { qWarning( "error, could not get epsg id" ); } //qWarning(("epsg id is: " + QString::number(epsgNr)).toLocal8Bit().data()); if ( mSrs ) { if ( !mSrs->createFromEpsg( epsgNr ) ) { qWarning( "Creation of srs from epsg failed" ); } } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { mParseModeStack.push( QgsWFSData::multiPoint ); //we need one nested list for intermediate WKB std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { mParseModeStack.push( QgsWFSData::multiLine ); //we need one nested list for intermediate WKB std::list<unsigned char*> wkbList; std::list<int> wkbSizeList; mCurrentWKBFragments.push_back( wkbList ); mCurrentWKBFragmentSizes.push_back( wkbSizeList ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { mParseModeStack.push( QgsWFSData::multiPolygon ); } else if ( mParseModeStack.size() == 1 && mParseModeStack.top() == QgsWFSData::featureMember && mThematicAttributes.find( localName ) != mThematicAttributes.end() ) { mParseModeStack.push( QgsWFSData::attribute ); mAttributeName = localName; mStringCash.clear(); } }
void QgsGml::startElement( const XML_Char* el, const XML_Char** attr ) { 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 ( elementName == GML_NAMESPACE + NS_SEPARATOR + "coordinates" ) { mParseModeStack.push( QgsGml::coordinate ); mStringCash.clear(); mCoordinateSeparator = readAttribute( "cs", attr ); if ( mCoordinateSeparator.isEmpty() ) { mCoordinateSeparator = ","; } mTupleSeparator = readAttribute( "ts", attr ); if ( mTupleSeparator.isEmpty() ) { mTupleSeparator = " "; } } else if ( localName == mGeometryAttribute ) { mParseModeStack.push( QgsGml::geometry ); } //else if ( mParseModeStack.size() == 0 && elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "boundedBy" ) { mParseModeStack.push( QgsGml::boundingBox ); } else if ( theParseMode == none && localName == mTypeName ) { Q_ASSERT( !mCurrentFeature ); mCurrentFeature = new QgsFeature( mFeatureCount ); QgsAttributes attributes( mThematicAttributes.size() ); //add empty attributes mCurrentFeature->setAttributes( attributes ); mParseModeStack.push( QgsGml::feature ); mCurrentFeatureId = readAttribute( "fid", attr ); } else if ( theParseMode == boundingBox && elementName == GML_NAMESPACE + NS_SEPARATOR + "Box" ) { //read attribute srsName="EPSG:26910" int epsgNr; if ( readEpsgFromAttribute( epsgNr, attr ) != 0 ) { QgsDebugMsg( "error, could not get epsg id" ); } } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "Polygon" ) { mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPoint" ) { mParseModeStack.push( QgsGml::multiPoint ); //we need one nested list for intermediate WKB mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiLineString" ) { mParseModeStack.push( QgsGml::multiLine ); //we need one nested list for intermediate WKB mCurrentWKBFragments.push_back( QList<unsigned char*>() ); mCurrentWKBFragmentSizes.push_back( QList<int>() ); } else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "MultiPolygon" ) { mParseModeStack.push( QgsGml::multiPolygon ); } else if ( theParseMode == feature && mThematicAttributes.contains( localName ) ) { mParseModeStack.push( QgsGml::attribute ); mAttributeName = localName; mStringCash.clear(); } }