コード例 #1
0
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));
        }
    }
}
コード例 #2
0
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));
    }
  }
}
コード例 #3
0
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;
}