bool LinearCriterion::isSatisfied(const ConstElementPtr& e) const { bool result = false; if (e->getElementType() == ElementType::Node) { return false; } const Tags& t = e->getTags(); if (e->getElementType() == ElementType::Relation) { ConstRelationPtr r = boost::dynamic_pointer_cast<const Relation>(e); result |= r->getType() == MetadataTags::RelationMultilineString(); result |= r->getType() == MetadataTags::RelationRoute(); result |= r->getType() == MetadataTags::RelationBoundary(); } for (Tags::const_iterator it = t.constBegin(); it != t.constEnd(); ++it) { const SchemaVertex& tv = OsmSchema::getInstance().getTagVertex(it.key() + "=" + it.value()); uint16_t g = tv.geometries; if (g & (OsmGeometries::LineString | OsmGeometries::ClosedWay) && !(g & OsmGeometries::Area)) { result = true; break; } } return result; }
void MaximalSublineStringMatcher::_validateElement(const ConstOsmMapPtr& map, ElementId eid) const { ConstElementPtr e = map->getElement(eid); if (e->getElementType() == ElementType::Relation) { ConstRelationPtr r = dynamic_pointer_cast<const Relation>(e); if (OsmSchema::getInstance().isMultiLineString(*r) == false) { throw NeedsReviewException("Internal Error: When matching sublines expected a multilinestring " "relation not a " + r->getType() + ". A non-multilinestring should never be found here. " "Please report this to [email protected]"); } const vector<RelationData::Entry>& entries = r->getMembers(); for (size_t i = 0; i < entries.size(); i++) { if (entries[i].getElementId().getType() != ElementType::Way) { throw NeedsReviewException("MultiLineString relations can only contain ways when matching " "sublines."); } } } if (e->getElementType() == ElementType::Way) { ConstWayPtr w = dynamic_pointer_cast<const Way>(e); if (w->getNodeCount() <= 1) { throw NeedsReviewException("Internal Error: Attempting to match against a zero length way."); } } }
void MaximalSublineStringMatcher::_validateElement(const ConstOsmMapPtr& map, ElementId eid) const { ConstElementPtr e = map->getElement(eid); if (e->getElementType() == ElementType::Relation) { ConstRelationPtr r = dynamic_pointer_cast<const Relation>(e); if (OsmSchema::getInstance().isMultiLineString(*r) == false) { throw NeedsReviewException("When matching sublines expected a multilinestring relation not" " a " + r->getType()); } const vector<RelationData::Entry>& entries = r->getMembers(); for (size_t i = 0; i < entries.size(); i++) { if (entries[i].getElementId().getType() != ElementType::Way) { throw NeedsReviewException("MultiLineString relations can only contain ways when matching " "sublines."); } } } }
void OsmApiDbSqlChangesetFileWriter::_createTags(ConstElementPtr element) { LOG_TRACE("Creating tags for: " << element->getElementId()); QStringList tableNames = _tagTableNamesForElement(element->getElementId()); Tags tags = element->getTags(); if (_includeDebugTags) { tags.set(MetadataTags::HootStatus(), QString::number(element->getStatus().getEnum())); } LOG_VART(tags); if (element->getElementType().getEnum() == ElementType::Relation && !tags.contains("type")) { ConstRelationPtr tmp = boost::dynamic_pointer_cast<const Relation>(element); tags.appendValue("type", tmp->getType()); } for (Tags::const_iterator it = tags.begin(); it != tags.end(); ++it) { QString k = it.key(); QString v = it.value(); if (k != MetadataTags::HootHash()) { const QString currentTagValues = QString("(%1_id, k, v) VALUES (%2, '%3', '%4');\n") .arg(element->getElementId().getType().toString().toLower()) .arg(element->getElementId().getId()) .arg(k.replace('\'', "''")) .arg(v.replace('\'', "''")); const QString tagValues = QString("(%1_id, k, v, version) VALUES (%2, '%3', '%4', %5);\n") .arg(element->getElementId().getType().toString().toLower()) .arg(element->getElementId().getId()) .arg(k.replace('\'', "''")) .arg(v.replace('\'', "''")) .arg(element->getVersion()); _outputSql.write( (QString("INSERT INTO %1 ").arg(tableNames.at(0)) + currentTagValues).toUtf8()); _outputSql.write((QString("INSERT INTO %1 ").arg(tableNames.at(1)) + tagValues).toUtf8()); } } }