本文整理汇总了C++中Tags::begin方法的典型用法代码示例。如果您正苦于以下问题:C++ Tags::begin方法的具体用法?C++ Tags::begin怎么用?C++ Tags::begin使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Tags
的用法示例。
在下文中一共展示了Tags::begin方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _promoteToCommonAncestor
void TagComparator::_promoteToCommonAncestor(Tags& t1, Tags& t2, Tags& result)
{
OsmSchema& schema = OsmSchema::getInstance();
// we're deleting as we iterate so be careful making changes.
for (Tags::iterator it1 = t1.begin(); it1 != t1.end(); )
{
for (Tags::iterator it2 = t2.begin(); it2 != t2.end(); )
{
const SchemaVertex& ancestor = schema.getFirstCommonAncestor(it1.key() + "=" + it1.value(),
it2.key() + "=" + it2.value());
if (ancestor.isEmpty() == false)
{
// erase from the iterators in a safe way
t1.erase(it1++);
t2.erase(it2++);
if (ancestor.value.isEmpty() == false)
{
result[ancestor.key] = ancestor.value;
}
}
else
{
// if we didn't erase anything then increment the iterators.
++it2;
}
}
if (it1 != t1.end())
{
++it1;
}
}
}
示例2: _addNonConflictingTags
void TagComparator::_addNonConflictingTags(Tags& t1, const Tags& t2, Tags& result)
{
OsmSchema& schema = OsmSchema::getInstance();
// we're deleting as we iterate so be careful making changes.
for (Tags::iterator it1 = t1.begin(); it1 != t1.end(); )
{
QString kvp1 = it1.key() + "=" + it1.value();
bool conflict = false;
for (Tags::const_iterator it2 = t2.begin(); it2 != t2.end(); ++it2)
{
QString kvp2 = it2.key() + "=" + it2.value();
if (schema.score(kvp1, kvp2) > 0.0)
{
conflict = true;
break;
}
}
if (conflict)
{
++it1;
}
else
{
result[it1.key()] = it1.value();
t1.erase(it1++);
}
}
}
示例3: _overwriteUnrecognizedTags
void TagComparator::_overwriteUnrecognizedTags(Tags& t1, Tags& t2, Tags& result)
{
OsmSchema& schema = OsmSchema::getInstance();
const Tags t1Copy = t1;
for (Tags::ConstIterator it1 = t1Copy.begin(); it1 != t1Copy.end(); ++it1)
{
// if this is an unknown type
if (schema.getTagVertex(it1.key() + "=" + it1.value()).isEmpty() &&
schema.getTagVertex(it1.key()).isEmpty())
{
// if this is also in t2.
if (t2.contains(it1.key()))
{
result[it1.key()] = it1.value();
t1.remove(it1.key());
t2.remove(it1.key());
}
}
}
// go through any remaining tags in t2
const Tags t2Copy = t2;
for (Tags::ConstIterator it2 = t2Copy.begin(); it2 != t2Copy.end(); ++it2)
{
// if this is an unknown type
if (schema.getTagVertex(it2.key() + "=" + it2.value()).isEmpty())
{
// we know it isn't in t1, or it would have been handled in the above loop so just deal with
// t2
t2.remove(it2.key());
result[it2.key()] = it2.value();
}
}
}
示例4: _mergeText
void TagComparator::_mergeText(Tags& t1, Tags& t2, Tags& result)
{
OsmSchema& schema = OsmSchema::getInstance();
const Tags t1Copy = t1;
for (Tags::ConstIterator it1 = t1Copy.begin(); it1 != t1Copy.end(); ++it1)
{
const SchemaVertex& tv = schema.getTagVertex(it1.key());
// if this is a text field and it exists in both tag sets.
if (tv.valueType == Text && t2.contains(it1.key()))
{
// only keep the unique text fields
QStringList values = t1.getList(it1.key());
values.append(t2.getList(it1.key()));
// append all unique values in the existing order.
for (int i = 0; i < values.size(); i++)
{
if (values[i].isEmpty() == false)
{
result.appendValueIfUnique(it1.key(), values[i]);
}
}
t1.remove(it1.key());
t2.remove(it1.key());
}
}
}
示例5: _mergeUnrecognizedTags
void TagComparator::_mergeUnrecognizedTags(Tags& t1, Tags& t2, Tags& result)
{
OsmSchema& schema = OsmSchema::getInstance();
const Tags t1Copy = t1;
for (Tags::ConstIterator it1 = t1Copy.begin(); it1 != t1Copy.end(); ++it1)
{
// if this is an unknown type
if (schema.getTagVertex(it1.key() + "=" + it1.value()).isEmpty() &&
schema.getTagVertex(it1.key()).isEmpty())
{
// if this is also in t2.
if (t2.contains(it1.key()))
{
// get the set of all values.
QSet<QString> values = _toSet(t1, it1.key());
values.unite(_toSet(t2, it1.key()));
QList<QString> sortEm = values.toList();
qSort(sortEm);
// remove it from the inputs
t1.remove(it1.key());
t2.remove(it1.key());
// set the united set in the output
result.set(it1.key(), sortEm.begin(), sortEm.end());
}
else
{
result[it1.key()] = it1.value();
}
}
}
// go through any remaining tags in t2
const Tags t2Copy = t2;
for (Tags::ConstIterator it2 = t2Copy.begin(); it2 != t2Copy.end(); ++it2)
{
// if this is an unknown type
if (schema.getTagVertex(it2.key() + "=" + it2.value()).isEmpty())
{
// we know it isn't in t1, or it would have been handled in the above loop so just deal with
// t2
t2.remove(it2.key());
result[it2.key()] = it2.value();
}
}
}
示例6: nonNameTagsExactlyMatch
bool TagComparator::nonNameTagsExactlyMatch(const Tags& t1, const Tags& t2)
{
const Qt::CaseSensitivity caseSensitivity =
_caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
Tags t1Filtered;
for (Tags::const_iterator it1 = t1.begin(); it1 != t1.end(); it1++)
{
QString key = it1.key();
QString value = it1.value();
if (!Tags::getNameKeys().contains(key, caseSensitivity) &&
//Metadata keys are controlled by hoot and, therefore, should always be lower case, so no
//case check needed.
!OsmSchema::getInstance().isMetaData(key, value))
{
if (!_caseSensitive)
{
key = key.toUpper();
value = value.toUpper();
}
t1Filtered.insert(key, value);
}
}
Tags t2Filtered;
for (Tags::const_iterator it2 = t2.begin(); it2 != t2.end(); it2++)
{
QString key = it2.key();
QString value = it2.value();
if (!Tags::getNameKeys().contains(key, caseSensitivity) &&
!OsmSchema::getInstance().isMetaData(key, value))
{
if (!_caseSensitive)
{
key = key.toUpper();
value = value.toUpper();
}
t2Filtered.insert(key, value);
}
}
return t1Filtered == t2Filtered;
}
示例7: _escapeTags
QString ServicesDb::_escapeTags(const Tags& tags) const
{
QStringList l;
static QChar f1('\\'), f2('"'), f3('\'');
static QChar to('_');
for (Tags::const_iterator it = tags.begin(); it != tags.end(); ++it)
{
// this doesn't appear to be working, but I think it is implementing the spec as described here:
// http://www.postgresql.org/docs/9.0/static/hstore.html
// The spec described above does seem to work on the psql command line. Curious.
QString k = QString(it.key()).replace(f1, "\\\\").replace(f2, "\\\"");
QString v = QString(it.value()).replace(f1, "\\\\").replace(f2, "\\\"");
l << QString("\"%1\"=>\"%2\"").arg(k).arg(v);
}
return l.join(",");
}
示例8: compareTags
void compareTags(const Tags& t1, const Tags& t2)
{
if (t1.size() != t2.size())
{
LOG_WARN("t1: " << t1.toString());
LOG_WARN("t2: " << t2.toString());
CPPUNIT_ASSERT_EQUAL(t1.size(), t2.size());
}
for (Tags::const_iterator it = t1.begin(); it != t1.end(); it++)
{
if (t1[it.key()] != t2[it.key()])
{
LOG_WARN("t1: " << t1.toString());
LOG_WARN("t2: " << t2.toString());
CPPUNIT_ASSERT_EQUAL(t1[it.key()].toStdString(), t2[it.key()].toStdString());
}
}
}
示例9: visit
void SplitNameVisitor::visit(const shared_ptr<Element>& e)
{
Tags& t = e->getTags();
QStringList extraNames;
Tags copy = t;
for (Tags::const_iterator it = copy.begin(); it != copy.end(); ++it)
{
const QString& k = it.key();
const QString& v = it.value();
if (v.size() > _maxSize &&
OsmSchema::getInstance().getCategories(it.key()).intersects(OsmSchemaCategory::name()))
{
QStringList l = _splitNames(v, extraNames);
t.setList(k, l);
}
}
_addExtraNames(t, extraNames);
}
示例10: compareTextTags
void TagComparator::compareTextTags(const Tags& t1, const Tags& t2, double& score, double& weight)
{
OsmSchema& schema = OsmSchema::getInstance();
score = 1.0;
weight = 0.0;
for (Tags::const_iterator it = t1.begin(); it != t1.end(); it++)
{
const SchemaVertex& tv = schema.getTagVertex(it.key());
if (schema.isAncestor(it.key(), "abstract_name") == false &&
tv.valueType == Text && t2.contains(it.key()))
{
score *= LevenshteinDistance::score(it.value(), t2[it.key()]);
weight += tv.influence;
}
}
// if the weight is zero don't confuse things with a low score.
if (weight == 0.0)
{
score = 1;
}
}
示例11: if
shared_ptr<Relation> BuildingPartMergeOp::combineParts(const OsmMapPtr& map,
const vector< shared_ptr<Element> >& parts)
{
assert(parts.size() > 0);
shared_ptr<Relation> building(new Relation(parts[0]->getStatus(),
map->createNextRelationId(), -1, "building"));
OsmSchema& schema = OsmSchema::getInstance();
Tags& t = building->getTags();
for (size_t i = 0; i < parts.size(); i++)
{
building->addElement("part", parts[i]);
Tags pt = parts[i]->getTags();
Tags tCopy = t;
Tags names;
TagComparator::getInstance().mergeNames(tCopy, pt, names);
t.set(names);
// go through all the tags.
for (Tags::const_iterator it = pt.begin(); it != pt.end(); it++)
{
// ignore all keys that are building:part specific.
if (_buildingPartTagNames.find(it.key()) == _buildingPartTagNames.end())
{
// if the tag isn't already in the relation
if (t.contains(it.key()) == false)
{
t[it.key()] = it.value();
}
// if this is an arbitrary text value, then concatenate the values.
else if (schema.isTextTag(it.key()))
{
t.appendValueIfUnique(it.key(), it.value());
}
// if the tag is in the relation and the tags differ.
else if (t[it.key()] != it.value())
{
t[it.key()] = "";
}
}
}
}
// go through all the keys that were consistent for each of the parts and move them into the
// relation.
Tags tCopy = t;
for (Tags::const_iterator it = tCopy.begin(); it != tCopy.end(); it++)
{
// if the value is empty, then the tag isn't needed, or it wasn't consistent between multiple
// parts.
if (it.value() == "")
{
t.remove(it.key());
}
// if the tag isn't empty, remove it from each of the parts.
else
{
for (size_t i = 0; i < parts.size(); i++)
{
parts[i]->getTags().remove(it.key());
}
}
}
if (t.contains("building") == false)
{
t["building"] = "yes";
}
// replace the building tag with building:part tags.
for (size_t i = 0; i < parts.size(); i++)
{
parts[i]->getTags().remove("building");
parts[i]->getTags()["building:part"] = "yes";
}
map->addRelation(building);
return building;
}
示例12: mergeNames
void TagComparator::mergeNames(Tags& t1, Tags& t2, Tags& result)
{
set<QString> altNames, nonAltNames;
set<QString> toRemove;
toRemove.insert("alt_name");
for (Tags::const_iterator it1 = t1.begin(); it1 != t1.end(); it1++)
{
if (it1.key() == "alt_name")
{
QStringList sl = Tags::split(it1.value());
altNames.insert(sl.begin(), sl.end());
}
else
{
if (OsmSchema::getInstance().isAncestor(it1.key(), "abstract_name"))
{
result[it1.key()] = it1.value();
QStringList sl = Tags::split(it1.value());
// keep track of all the names we've used
nonAltNames.insert(sl.begin(), sl.end());
toRemove.insert(it1.key());
}
}
}
for (Tags::const_iterator it2 = t2.begin(); it2 != t2.end(); it2++)
{
if (it2.key() == "alt_name")
{
QStringList sl = Tags::split(it2.value());
altNames.insert(sl.begin(), sl.end());
}
else if (result.contains(it2.key()))
{
const Qt::CaseSensitivity caseSensitivity =
_caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
if (result[it2.key()].compare(it2.value(), caseSensitivity) != 0)
{
QStringList sl = Tags::split(it2.value());
altNames.insert(sl.begin(), sl.end());
}
}
else
{
if (OsmSchema::getInstance().isAncestor(it2.key(), "abstract_name"))
{
result[it2.key()] = it2.value();
QStringList sl = Tags::split(it2.value());
nonAltNames.insert(sl.begin(), sl.end());
toRemove.insert(it2.key());
}
}
}
for (set<QString>::const_iterator it = toRemove.begin(); it != toRemove.end(); it++)
{
t1.remove(*it);
t2.remove(*it);
}
// add all the altNames that don't exist in nonAltNames
QStringList l;
for (set<QString>::const_iterator it = altNames.begin(); it != altNames.end(); it++)
{
if (nonAltNames.find(*it) == nonAltNames.end())
{
l.append(*it);
}
}
if (l.size() > 0)
{
result.setList("alt_name", l);
}
}