bool SequenceParser::startElement(const NodeType::XMLNode& node, Attributes& attributes) { // Note that at this point the start tag of the parent element has already been parsed... hence node must be a child element ElementParser* childParser = m_childParserFactory(); setParserForNextElement(childParser); return childParser->startElement(node, attributes); }
void CityObjectElementParser::parseGeometryPropertyElementForLODLevel(int lod, const std::string& id) { setParserForNextElement(new DelayedChoiceElementParser(m_documentParser, m_logger, { new PolygonElementParser(m_documentParser, m_factory, m_logger, [id, lod, this](std::shared_ptr<Polygon> p) { Geometry* geom = m_factory.createGeometry(id, m_model->getType(), lod); geom->addPolygon(p); m_model->addGeometry(geom); }), new LineStringElementParser(m_documentParser, m_factory, m_logger, [id, lod, this](std::shared_ptr<LineString> l) { Geometry* geom = m_factory.createGeometry(id, m_model->getType(), lod); geom->addLineString(l); m_model->addGeometry(geom); }), new GeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](Geometry* geom) { m_model->addGeometry(geom); }) })); }
void PolygonElementParser::parseRingElement(bool interior) { setParserForNextElement(new LinearRingElementParser(m_documentParser, m_factory, m_logger, interior, [this](LinearRing* ring){ m_model->addRing(ring); })); }
void CityObjectElementParser::parseImplicitGeometryForLODLevel(int lod) { setParserForNextElement(new ImplicitGeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](ImplicitGeometry* imp) { m_model->addImplictGeometry(imp); })); }
void CityObjectElementParser::parseGeometryForLODLevel(int lod) { setParserForNextElement(new GeometryElementParser(m_documentParser, m_factory, m_logger, lod, m_model->getType(), [this](Geometry* geom) { m_model->addGeometry(geom); })); }
bool CityObjectElementParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) { initializeAttributesSet(); if (m_model == nullptr) { throw std::runtime_error("CityObjectElementParser::parseChildElementStartTag called before CityObjectElementParser::parseElementStartTag"); } if ( node == NodeType::GEN_StringAttributeNode || node == NodeType::GEN_DoubleAttributeNode || node == NodeType::GEN_IntAttributeNode || node == NodeType::GEN_DateAttributeNode || node == NodeType::GEN_UriAttributeNode) { m_lastAttributeName = attributes.getAttribute("name"); } else if (attributesSet.count(node.typeID()) > 0 || node == NodeType::GEN_ValueNode) { return true; } else if (node == NodeType::BLDG_BoundedByNode || node == NodeType::BLDG_OuterBuildingInstallationNode || node == NodeType::BLDG_InteriorBuildingInstallationNode || node == NodeType::BLDG_InteriorFurnitureNode || node == NodeType::BLDG_RoomInstallationNode || node == NodeType::BLDG_InteriorRoomNode || node == NodeType::BLDG_OpeningNode || node == NodeType::BLDG_ConsistsOfBuildingPartNode || node == NodeType::GRP_GroupMemberNode || node == NodeType::GRP_ParentNode || node == NodeType::TRANS_TrafficAreaNode || node == NodeType::TRANS_AuxiliaryTrafficAreaNode || node == NodeType::WTR_BoundedByNode) { setParserForNextElement(new CityObjectElementParser(m_documentParser, m_factory, m_logger, [this](CityObject* obj) { m_model->addChildCityObject(obj); })); } else if (node == NodeType::APP_AppearanceNode // Compatibility with CityGML 1.0 (in CityGML 2 CityObjects can only contain appearanceMember elements) || node == NodeType::APP_AppearanceMemberNode) { setParserForNextElement(new AppearanceElementParser(m_documentParser, m_factory, m_logger)); } else if (node == NodeType::BLDG_Lod1MultiCurveNode || node == NodeType::BLDG_Lod1MultiSurfaceNode || node == NodeType::BLDG_Lod1SolidNode || node == NodeType::BLDG_Lod1TerrainIntersectionNode || node == NodeType::GEN_Lod1TerrainIntersectionNode || node == NodeType::FRN_Lod1TerrainIntersectionNode || node == NodeType::LUSE_Lod1MultiSurfaceNode || node == NodeType::TRANS_Lod1MultiSurfaceNode || node == NodeType::WTR_Lod1MultiCurveNode || node == NodeType::WTR_Lod1MultiSurfaceNode || node == NodeType::WTR_Lod1SolidNode) { parseGeometryForLODLevel(1); } else if (node == NodeType::BLDG_Lod2MultiCurveNode || node == NodeType::BLDG_Lod2MultiSurfaceNode || node == NodeType::BLDG_Lod2SolidNode || node == NodeType::BLDG_Lod2TerrainIntersectionNode || node == NodeType::GEN_Lod2TerrainIntersectionNode || node == NodeType::FRN_Lod2TerrainIntersectionNode || node == NodeType::LUSE_Lod2MultiSurfaceNode || node == NodeType::TRANS_Lod2MultiSurfaceNode || node == NodeType::WTR_Lod2SolidNode || node == NodeType::WTR_Lod2SurfaceNode) { parseGeometryForLODLevel(2); } else if (node == NodeType::BLDG_Lod3MultiCurveNode || node == NodeType::BLDG_Lod3MultiSurfaceNode || node == NodeType::BLDG_Lod3SolidNode || node == NodeType::BLDG_Lod3TerrainIntersectionNode || node == NodeType::GEN_Lod3TerrainIntersectionNode || node == NodeType::FRN_Lod3TerrainIntersectionNode || node == NodeType::LUSE_Lod3MultiSurfaceNode || node == NodeType::TRANS_Lod3MultiSurfaceNode || node == NodeType::WTR_Lod3SolidNode || node == NodeType::WTR_Lod3SurfaceNode) { parseGeometryForLODLevel(3); } else if (node == NodeType::BLDG_Lod4MultiCurveNode || node == NodeType::BLDG_Lod4MultiSurfaceNode || node == NodeType::BLDG_Lod4SolidNode || node == NodeType::BLDG_Lod4TerrainIntersectionNode || node == NodeType::GEN_Lod4TerrainIntersectionNode || node == NodeType::FRN_Lod4TerrainIntersectionNode || node == NodeType::LUSE_Lod4MultiSurfaceNode || node == NodeType::TRANS_Lod4MultiSurfaceNode || node == NodeType::WTR_Lod4SolidNode || node == NodeType::WTR_Lod4SurfaceNode) { parseGeometryForLODLevel(4); } else if (node == NodeType::GEN_Lod1GeometryNode || node == NodeType::FRN_Lod1GeometryNode || node == NodeType::VEG_Lod1GeometryNode) { parseGeometryPropertyElementForLODLevel(1, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod2GeometryNode || node == NodeType::FRN_Lod2GeometryNode || node == NodeType::BLDG_Lod2GeometryNode || node == NodeType::VEG_Lod2GeometryNode) { parseGeometryPropertyElementForLODLevel(2, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod3GeometryNode || node == NodeType::FRN_Lod3GeometryNode || node == NodeType::BLDG_Lod3GeometryNode || node == NodeType::VEG_Lod3GeometryNode) { parseGeometryPropertyElementForLODLevel(3, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::GEN_Lod4GeometryNode || node == NodeType::FRN_Lod4GeometryNode || node == NodeType::BLDG_Lod4GeometryNode || node == NodeType::VEG_Lod4GeometryNode) { parseGeometryPropertyElementForLODLevel(4, attributes.getCityGMLIDAttribute()); } else if (node == NodeType::VEG_Lod1ImplicitRepresentationNode || node == NodeType::FRN_Lod1ImplicitRepresentationNode || node == NodeType::GEN_Lod1ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(1); } else if (node == NodeType::VEG_Lod2ImplicitRepresentationNode || node == NodeType::FRN_Lod2ImplicitRepresentationNode || node == NodeType::GEN_Lod2ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(2); } else if (node == NodeType::VEG_Lod3ImplicitRepresentationNode || node == NodeType::FRN_Lod3ImplicitRepresentationNode || node == NodeType::GEN_Lod3ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(3); } else if (node == NodeType::VEG_Lod4ImplicitRepresentationNode || node == NodeType::FRN_Lod4ImplicitRepresentationNode || node == NodeType::GEN_Lod4ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(4); } else if (node == NodeType::CORE_GeneralizesToNode || node == NodeType::CORE_ExternalReferenceNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode || node == NodeType::DEM_ReliefComponentNode || node == NodeType::GEN_Lod0GeometryNode || node == NodeType::GEN_Lod0ImplicitRepresentationNode || node == NodeType::GEN_Lod0TerrainIntersectionNode || node == NodeType::TRANS_Lod0NetworkNode || node == NodeType::WTR_Lod0MultiCurveNode || node == NodeType::WTR_Lod0MultiSurfaceNode) { CITYGML_LOG_INFO(m_logger, "Skipping CityObject child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); setParserForNextElement(new SkipElementParser(m_documentParser, m_logger, node)); return true; } else { return GMLFeatureCollectionElementParser::parseChildElementStartTag(node, attributes); } return true; }