QString Relation::toString() const { stringstream ss(stringstream::out); ss << "relation(" << getId() << ")" << endl; ss << "type: " << getType() << endl; ss << "members: "; for (size_t i = 0; i < getMembers().size(); i++) { ss << " " << getMembers()[i].toString().toUtf8().data() << endl; } ss << endl; ss << "tags: " << getTags().toString().toUtf8().data(); ss << "status: " << getStatusString().toUtf8().data(); return QString::fromUtf8(ss.str().data()); }
void Relation::visitRw(ElementProvider& map, ElementVisitor& filter) { filter.visit(map.getRelation(getId())); const vector<RelationData::Entry> members = getMembers(); for (size_t i = 0; i < members.size(); i++) { const RelationData::Entry& m = members[i]; if (map.containsElement(m.getElementId())) { if (m.getElementId().getType() == ElementType::Node && map.containsNode(m.getElementId().getId())) { map.getNode(m.getElementId().getId())->visitRw(map, filter); } else if (m.getElementId().getType() == ElementType::Way && map.containsWay(m.getElementId().getId())) { map.getWay(m.getElementId().getId())->visitRw(map, filter); } else if (m.getElementId().getType() == ElementType::Relation && map.containsRelation(m.getElementId().getId())) { map.getRelation(m.getElementId().getId())->visitRw(map, filter); } else { assert(false); } } } }
Envelope* Relation::getEnvelope(const shared_ptr<const ElementProvider> &ep) const { Envelope* result = new Envelope(); const vector<RelationData::Entry>& members = getMembers(); for (size_t i = 0; i < members.size(); i++) { const RelationData::Entry& m = members[i]; // if any of the elements don't exist then return an empty envelope. if (ep->containsElement(m.getElementId()) == false) { result->setToNull(); return result; } const shared_ptr<const Element> e = ep->getElement(m.getElementId()); auto_ptr<Envelope> childEnvelope(e->getEnvelope(ep)); if (childEnvelope->isNull()) { result->setToNull(); return result; } result->expandToInclude(childEnvelope.get()); } return result; }
const Member next() { std::vector<Member> members = getMembers(); long len = members.size(); if (len == 0) { throw exception::IException("const Member& RoundRobinLB::next()", "No member in member list!!"); } for (int i = 0; i < len; i++) { if (members[i].getAddress().getPort() == 5701) { return members[i]; } } return members[0]; }
bool Relation::contains(ElementId eid) const { const vector<RelationData::Entry>& members = getMembers(); for (size_t i = 0; i < members.size(); i++) { if (members[i].getElementId() == eid) { return true; } } return false; }
float InputNetcdf::getValueCore(const Key::Input& iKey) const { float returnValue = Global::MV; std::string filename = getFilename(iKey); int size = getNumOffsets()*getNumLocations()*getNumMembers(); float* values = new float[size]; NcFile ncfile(filename.c_str()); std::string localVariable; bool found = getLocalVariableName(iKey.variable, localVariable); assert(found); if(!ncfile.is_valid() || localVariable == "") { for(int i = 0; i < size; i++) { values[i] = Global::MV; } } else { std::stringstream ss; ss << "InputNetcdf: Loading " << filename << " " << iKey; Global::logger->write(ss.str(), Logger::message); assert(localVariable != ""); NcError q(NcError::silent_nonfatal); NcVar* ncvar = ncfile.get_var(localVariable.c_str()); if(ncvar) { long count[3] = {getNumOffsets(),getNumLocations(),getNumMembers()}; bool status = ncvar->get(values, count); assert(status); } else { std::stringstream ss; ss << "InputNetcdf: File " << filename << " does not contain local variable " << localVariable << ". Is the file corrupts?"; Global::logger->write(ss.str(), Logger::warning); for(int i = 0; i < size; i++) { values[i] = Global::MV; } } } ncfile.close(); std::vector<float> offsets = getOffsets(); std::vector<Member> members = getMembers(); int oC = getOffsetIndex(iKey.offset); int oS = mCacheOtherOffsets ? 0 : oC; int oE = mCacheOtherOffsets ? getNumOffsets()-1 : oC; int lC = iKey.location; int lS = mCacheOtherLocations ? 0 : lC; int lE = mCacheOtherLocations ? getNumLocations()-1 : lC; int iC = iKey.member; int iS = mCacheOtherMembers ? 0 : iC; int iE = mCacheOtherMembers ? getNumMembers()-1 : iC; std::vector<float> vec; vec.assign(values, values + size); delete[] values; Key::Input key = iKey; if(0 && getName() == "rda336") { std::cout << "Date: " << iKey.date << " " << iKey.variable << " " << getName() << " " << mCacheOtherLocations << std::endl; std::cout << oC << " " << oS << " " << oE << std::endl; std::cout << lC << " " << lS << " " << lE << std::endl; std::cout << iC << " " << iS << " " << iE << std::endl; } for(int offsetIndex = oS; offsetIndex <= oE; offsetIndex++) { key.offset = offsets[offsetIndex]; for(key.member = iS; key.member <= iE; key.member++) { for(key.location = lS; key.location <= lE; key.location++) { int index = offsetIndex*getNumLocations()*getNumMembers() + key.location*getNumMembers() + key.member; assert(index < vec.size()); Input::addToCache(key, vec[index]); assert(!std::isinf(vec[index])); if(key == iKey) { returnValue = vec[index]; } } } } if(std::isnan(returnValue)) { returnValue = Global::MV; } return returnValue; }
float InputFlat::getValueCore(const Key::Input& iKey) const { float returnValue = Global::MV; std::string filename = getFilename(iKey); std::vector<float> values; std::vector<float> offsets = getOffsets(); std::vector<Member> members = getMembers(); std::ifstream ifs(filename.c_str(), std::ifstream::in); if(!ifs.good()) { // Missing file std::vector<float> values; Key::Input key = iKey; for(int i = 0; i < offsets.size(); i++) { key.offset = offsets[i]; for(key.member = 0; key.member < members.size(); key.member++) { Input::addToCache(key, Global::MV); } } std::stringstream ss; ss << "InputFlat: File " << filename << " missing"; Global::logger->write(ss.str(), Logger::message); } else { // Loop over each line Key::Input key = iKey; int offsetId = 0; while(ifs.good()) { char line[10000]; ifs.getline(line, 10000, '\n'); if(ifs.good() && line[0] != '#') { if(offsetId >= offsets.size()) { std::stringstream ss; ss << "InputFlat: File '" << filename << "' has too many lines" << std::endl; Global::logger->write(ss.str(), Logger::warning); break; } assert(offsetId < offsets.size()); key.offset = offsets[offsetId]; std::stringstream ss(line); // Loop over each value key.member = 0; while(ss.good()) { float value; if(ss >> value) { Input::addToCache(key, value); } if(key.offset == iKey.offset && key.member == iKey.member) { returnValue = value; } key.member++; } } offsetId++; } offsetId--; // Deal with truncated files if(offsetId < offsets.size()-1) { std::stringstream ss; ss << "InputFlat: File '" << filename << "' has too few rows. Assume last rows are missing values"; Global::logger->write(ss.str(), Logger::warning); while(offsetId < offsets.size()) { key.offset = offsets[offsetId]; for(key.member = 0; key.member < getNumMembers(); key.member++) { Input::addToCache(key, Global::MV); } offsetId++; } } } return returnValue; }
extern int Error_getNumMessages(threadData_t *threadData) { return getMembers(threadData)->errorMessageQueue->size(); }
void Error_setShowErrorMessages(threadData_t *threadData,int show) { getMembers(threadData)->showErrorMessages = show ? 1 : 0; }