void DualWaySplitter::_reconnectEnd(long centerNodeId, shared_ptr<Way> edge) { Coordinate centerNodeC = _result->getNode(centerNodeId)->toCoordinate(); // determine which end of edge we're operating on Coordinate edgeEnd; long edgeEndId; ConstNodePtr first = _result->getNode(edge->getNodeId(0)); ConstNodePtr last = _result->getNode(edge->getLastNodeId()); if (first->toCoordinate().distance(centerNodeC) < last->toCoordinate().distance(centerNodeC)) { edgeEnd = first->toCoordinate(); edgeEndId = first->getId(); } else { edgeEnd = last->toCoordinate(); edgeEndId = last->getId(); } // find all the nodes that are about the right distance from centerNodeId shared_ptr<DistanceNodeFilter> filterOuter(new DistanceNodeFilter(Filter::KeepMatches, centerNodeC, _splitSize * 1.01)); shared_ptr<DistanceNodeFilter> filterInner(new DistanceNodeFilter(Filter::FilterMatches, centerNodeC, _splitSize * .99)); ChainNodeFilter chain(filterOuter, filterInner); vector<long> nids = _result->filterNodes(chain, centerNodeC, _splitSize * 1.02); Radians bestAngle = std::numeric_limits<Radians>::max(); long bestNid = numeric_limits<long>::max(); Radians edgeAngle = WayHeading::calculateHeading(centerNodeC, edgeEnd); // find the smallest angle from edgeEnd to any of the candidate nodes for (size_t i = 0; i < nids.size(); i++) { if (edgeEndId != nids[i]) { Coordinate c = _result->getNode(nids[i])->toCoordinate(); Radians thisAngle = WayHeading::calculateHeading(centerNodeC, c); Radians deltaMagnitude = WayHeading::deltaMagnitude(edgeAngle, thisAngle); if (deltaMagnitude < bestAngle) { bestAngle = deltaMagnitude; bestNid = nids[i]; } } } // if the smallest angle is less than 45 deg, then connect them. if (toDegrees(bestAngle) < 45) { edge->replaceNode(edgeEndId, bestNid); } }
QString OsmApiDbSqlChangesetFileWriter::_getUpdateValuesNodeStr(ConstNodePtr node) const { return QString("latitude=%2, longitude=%3, changeset_id=%4, visible=%5, \"timestamp\"=%8, tile=%6, version=%7 WHERE id=%1;\n") .arg(node->getId()) .arg((qlonglong)OsmApiDb::toOsmApiDbCoord(node->getY())) .arg((qlonglong)OsmApiDb::toOsmApiDbCoord(node->getX())) .arg(node->getChangeset()) .arg(_getVisibleStr(node->getVisible())) .arg(ApiDb::tileForPoint(node->getY(), node->getX())) .arg(node->getVersion()) .arg(OsmApiDb::TIMESTAMP_FUNCTION); }
QString OsmApiDbSqlChangesetFileWriter::_getInsertValuesNodeStr(ConstNodePtr node) const { return QString("latitude, longitude, changeset_id, visible, \"timestamp\", " "tile, version) VALUES (%1, %2, %3, %4, %5, %8, %6, %7);\n") .arg(node->getId()) .arg((qlonglong)OsmApiDb::toOsmApiDbCoord(node->getY())) .arg((qlonglong)OsmApiDb::toOsmApiDbCoord(node->getX())) .arg(node->getChangeset()) .arg(_getVisibleStr(node->getVisible())) .arg(ApiDb::tileForPoint(node->getY(), node->getX())) .arg(node->getVersion()) .arg(OsmApiDb::TIMESTAMP_FUNCTION); }
bool ContainsNodeCriterion::isSatisfied(const ConstElementPtr& e) const { if (e->getElementType() == ElementType::Way) { ConstWayPtr w = boost::dynamic_pointer_cast<const Way>(e); return w->hasNode(_nodeId); } else if (e->getElementType() == ElementType::Relation) { ConstRelationPtr r = boost::dynamic_pointer_cast<const Relation>(e); return r->contains(ElementId(ElementType::Node, _nodeId)); } else if (e->getElementType() == ElementType::Node) { ConstNodePtr n = boost::dynamic_pointer_cast<const Node>(e); return (n->getId() == _nodeId); } return false; }
void ElementCacheLRU::addElement(ConstElementPtr &newElement) { ConstNodePtr newNode; ConstWayPtr newWay; ConstRelationPtr newRelation; switch ( newElement->getElementType().getEnum() ) { case ElementType::Node: newNode = dynamic_pointer_cast<const Node>(newElement); if ( newNode != ConstNodePtr() ) { // Do we have to replace an entry? if ( _nodes.size() == _maxCountPerType ) { _removeOldest(ElementType::Node); } _nodes.insert(std::make_pair(newNode->getId(), std::make_pair(newNode, boost::posix_time::microsec_clock::universal_time()))); //LOG_DEBUG("Added new node with ID " << newNode->getId() ); } break; case ElementType::Way: newWay = dynamic_pointer_cast<const Way>(newElement); if ( newWay != ConstWayPtr() ) { // Do we have to replace an entry? if ( _ways.size() == _maxCountPerType ) { _removeOldest(ElementType::Way); } _ways.insert(std::make_pair(newWay->getId(), std::make_pair(newWay, boost::posix_time::microsec_clock::universal_time()))); } break; case ElementType::Relation: newRelation = dynamic_pointer_cast<const Relation>(newElement); if ( newRelation != ConstRelationPtr() ) { // Do we have to replace an entry? if ( _relations.size() == _maxCountPerType ) { _removeOldest(ElementType::Relation); } _relations.insert(std::make_pair(newRelation->getId(), std::make_pair(newRelation, boost::posix_time::microsec_clock::universal_time()))); } break; default: throw HootException(QString("Unexpected element type: %1").arg( newElement->getElementType().toString())); break; } // Reset all iterators to maintain interface contract resetElementIterators(); }