void terrama2::core::DataAccessorDcpToa5::adapt(DataSetPtr dataset, std::shared_ptr<te::da::DataSetTypeConverter> converter) const { //only one timestamp column te::dt::DateTimeProperty* dtProperty = new te::dt::DateTimeProperty("DateTime", te::dt::TIME_INSTANT_TZ); //Find the rigth column to adapt std::vector<te::dt::Property*> properties = converter->getConvertee()->getProperties(); for(size_t i = 0, size = properties.size(); i < size; ++i) { te::dt::Property* property = properties.at(i); if (property->getName() == getRecordPropertyName(dataset)) { te::dt::Property* property = properties.at(i); std::string name = property->getName(); te::dt::SimpleProperty* newProperty = new te::dt::SimpleProperty(name, te::dt::INT32_TYPE); converter->add(i, newProperty, boost::bind(&terrama2::core::DataAccessor::stringToInt, this, _1, _2, _3)); } else if (property->getName() == getStationPropertyName(dataset)) { te::dt::Property* property = properties.at(i); converter->add(i, property->clone()); } else if(property->getName() == getTimestampPropertyName(dataset)) { // datetime column found converter->add(i, dtProperty, boost::bind(&terrama2::core::DataAccessorDcpToa5::stringToTimestamp, this, _1, _2, _3, getTimeZone(dataset))); } else { // DCP-TOA5 dataset columns have the name of the dcp before every column, // remove the name and keep only the column name te::dt::Property* property = properties.at(i); std::string name = property->getName(); te::dt::SimpleProperty* newProperty = new te::dt::SimpleProperty(name, te::dt::DOUBLE_TYPE); converter->add(i, newProperty, boost::bind(&terrama2::core::DataAccessor::stringToDouble, this, _1, _2, _3)); } } }
void terrama2::core::DataAccessorOccurrenceLightning::adapt(DataSetPtr dataSet, std::shared_ptr<te::da::DataSetTypeConverter> converter) const { // only one timestamp column size_t lonPos = std::numeric_limits<size_t>::max(); size_t latPos = std::numeric_limits<size_t>::max(); Srid srid = getSrid(dataSet); auto timestampPropertyName = terrama2::core::simplifyString(getTimestampPropertyName(dataSet)); te::dt::DateTimeProperty* timestampProperty = new te::dt::DateTimeProperty(timestampPropertyName, te::dt::TIME_INSTANT); te::dt::SimpleProperty* latProperty = new te::dt::SimpleProperty(getLatitudePropertyName(dataSet), te::dt::DOUBLE_TYPE); te::dt::SimpleProperty* lonProperty = new te::dt::SimpleProperty(getLongitudePropertyName(dataSet), te::dt::DOUBLE_TYPE); te::gm::GeometryProperty* geomProperty = new te::gm::GeometryProperty("geom", srid, te::gm::PointType); // Find the right column to adapt std::vector<te::dt::Property*> properties = converter->getConvertee()->getProperties(); for(size_t i = 0, size = properties.size(); i < size; ++i) { te::dt::Property* property = properties.at(i); if(property->getName() == getTimestampPropertyName(dataSet)) { // datetime column found converter->add(i, timestampProperty, boost::bind(&terrama2::core::DataAccessorOccurrenceLightning::stringToTimestamp, this, _1, _2, _3, getTimeZone(dataSet))); } else if(property->getName() == getLatitudePropertyName(dataSet) || property->getName() == getLongitudePropertyName(dataSet)) { // update latitude column index if(property->getName() == getLatitudePropertyName(dataSet)) { latPos = i; converter->add(i, latProperty, boost::bind(&terrama2::core::DataAccessor::stringToDouble, this, _1, _2, _3)); } // update longitude column index if(property->getName() == getLongitudePropertyName(dataSet)) { lonPos = i; converter->add(i, lonProperty, boost::bind(&terrama2::core::DataAccessor::stringToDouble, this, _1, _2, _3)); } if(!isValidColumn(latPos) || !isValidColumn(lonPos)) continue; std::vector<size_t> latLonAttributes; latLonAttributes.push_back(lonPos); latLonAttributes.push_back(latPos); converter->add(latLonAttributes, geomProperty, boost::bind(&terrama2::core::DataAccessorOccurrenceLightning::stringToPoint, this, _1, _2, _3, srid)); } else { auto newName = terrama2::core::simplifyString(converter->getConvertee()->getProperty(i)->getName()); te::dt::SimpleProperty* property = new te::dt::SimpleProperty(newName, te::dt::DOUBLE_TYPE); converter->add(i, property, boost::bind(&terrama2::core::DataAccessor::stringToDouble, this, _1, _2, _3)); } } }
terrama2::core::DataSetSeries terrama2::core::DataAccessorJsonCemaden::getSeries( const std::string& uri, const Filter& filter, DataSetPtr dataSet, std::shared_ptr<terrama2::core::FileRemover> /*remover*/) const { QString codestacao = QString::fromStdString(getCodePropertyName(dataSet)); QString inputTimestampProperty = QString::fromStdString(getInputTimestampPropertyName(dataSet)); std::string timestampProperty = getTimestampPropertyName(dataSet); QStringList staticData = QString::fromStdString(getStaticDataProperties(dataSet)).split(','); QString code = QString::fromStdString(getDCPCode(dataSet)); auto dataSetType = std::make_shared<te::da::DataSetType>(code.toStdString()); dataSetType->add(new te::dt::DateTimeProperty(timestampProperty, te::dt::TIME_INSTANT_TZ, true)); auto teDataSet = std::make_shared<te::mem::DataSet>(dataSetType.get()); te::core::URI teUri(uri); std::string filePath = getFolderMask(dataSet) + "/" + getDataMask(dataSet); auto jsonStr = readFileContents(teUri.path()+filePath); QJsonDocument doc = QJsonDocument::fromJson(jsonStr.c_str()); auto readingsArray = doc.object()["cemaden"].toArray(); // iterate over readings // and populate the dataset for(auto reading : readingsArray) { auto obj = reading.toObject(); //check if this is the DCP we want if(obj[codestacao].toString() != code) continue; auto timestampStr = obj[inputTimestampProperty].toString().toStdString(); auto timestamp = terrama2::core::TimeUtils::stringToTimestamp(timestampStr, "%Y-%m-%d %H:%M:%S%F"); // filter by timestamp if((filter.discardBefore && (*filter.discardBefore > *timestamp)) || (filter.discardAfter && (*filter.discardAfter < *timestamp))) continue; // create new item auto item = std::unique_ptr<te::mem::DataSetItem>(new te::mem::DataSetItem(teDataSet.get())); // add item to the end of the dataset teDataSet->moveLast(); teDataSet->add(item.get()); // check if the item has data bool hasData = false; // add timestamp to dataset item->setDateTime(timestampProperty, static_cast<te::dt::TimeInstantTZ*>(timestamp->clone())); for(auto val = obj.begin(); val != obj.end(); ++val) { auto key = val.key(); // ignore static data if(staticData.contains(key) || key == codestacao || key.toStdString() == timestampProperty) continue; // property name auto keyStr = key.toStdString(); // check if the property is already registered in the dataset auto properties = dataSetType->getProperties(); auto it = std::find_if(properties.cbegin(), properties.cend(), [&keyStr](te::dt::Property* property){ return property->getName() == keyStr; }); if(it == properties.cend()) { // update dataSetType te::dt::SimpleProperty* property = new te::dt::SimpleProperty(keyStr, te::dt::DOUBLE_TYPE, false); dataSetType->add(property); // update memory dataset structure teDataSet->add(keyStr, te::dt::DOUBLE_TYPE); } // add property value item->setDouble(keyStr, val.value().toDouble()); hasData = true; } if(!hasData) { // remove the item if no data was inserted teDataSet->remove(item.get()); } item.release(); } terrama2::core::DataSetSeries serie; serie.dataSet = dataSet; serie.syncDataSet = std::make_shared<terrama2::core::SynchronizedDataSet>(teDataSet); serie.teDataSetType = dataSetType; return serie; }