Ejemplo n.º 1
0
void OpenRouteServiceRunner::retrieveRoute( const RouteRequest *route )
{
    if ( route->size() < 2 ) {
        return;
    }

    GeoDataCoordinates source = route->source();
    GeoDataCoordinates destination = route->destination();
    QHash<QString, QVariant> settings = route->routingProfile().pluginSettings()["openrouteservice"];

    QUrlQuery queries;
    queries.addQueryItem("api_key", "ee0b8233adff52ce9fd6afc2a2859a28");

    QString unit = "KM";
    QString preference = "Fastest";
    if (settings.contains(QStringLiteral("preference"))) {
        preference = settings[QStringLiteral("preference")].toString();
    }
    if (preference == QLatin1String("Pedestrian")) {
        unit = QStringLiteral("M");
    }

    queries.addQueryItem("start", formatCoordinates(source));
    QStringList via;
    for (int i = 1; i < route->size()-1; ++i) {
        via << formatCoordinates(route->at(i));
    }
    queries.addQueryItem("via", via.join(' '));
    queries.addQueryItem("end", formatCoordinates(destination));

    queries.addQueryItem("distunit", unit);
    if (preference == "Fastest" || preference == "Shortest" || preference == "Recommended") {
        queries.addQueryItem("routepref", "Car");
        queries.addQueryItem("weighting", preference);
    } else {
        queries.addQueryItem("routepref", preference);
        queries.addQueryItem("weighting", "Recommended");
    }

    QString const motorways = settings.value("noMotorways").toInt() == 0 ? "false" : "true";
    queries.addQueryItem("noMotorways", motorways);
    QString const tollways = settings.value("noTollways").toInt() == 0 ? "false" : "true";
    queries.addQueryItem("noTollways", tollways);
    queries.addQueryItem("noUnpavedroads", "false");
    queries.addQueryItem("noSteps", "false");
    QString const ferries = settings.value("noFerries").toInt() == 0 ? "false" : "true";
    queries.addQueryItem("noFerries", ferries);
    queries.addQueryItem("instructions", "true");
    queries.addQueryItem("lang", "en");

    QUrl url = QUrl( "http://openls.geog.uni-heidelberg.de/route" );
    // QUrlQuery strips empty value pairs, but OpenRouteService does not work without
    QString const trailer = route->size() == 2 ? "&via=" : QString();
    url.setQuery(queries.toString() + trailer);

    m_request = QNetworkRequest( url );

    QEventLoop eventLoop;
    QTimer timer;
    timer.setSingleShot( true );
    timer.setInterval( 15000 );

    connect( &timer, SIGNAL(timeout()),
             &eventLoop, SLOT(quit()));
    connect( this, SIGNAL(routeCalculated(GeoDataDocument*)),
             &eventLoop, SLOT(quit()));

    // @todo FIXME Must currently be done in the main thread, see bug 257376
    QTimer::singleShot( 0, this, SLOT(get()));
    timer.start();

    eventLoop.exec();
}
Ejemplo n.º 2
0
bool Cube::save(QString const& filePath, Data::Bank& bank)
{
   // Make sure we have the required data
   QList<Data::Geometry*> geometries(bank.findData<Data::Geometry>());
   if (geometries.isEmpty()) {
      m_errors.append("No geometry information found");
      return false;
   }else if (geometries.size() > 1) {
      QLOG_WARN() << "Ambiguous geometry information found in Cube parser";
   }
   Data::Geometry* geometry(geometries.first());

   QList<Data::GridData*> grids(bank.findData<Data::GridData>()); 
   if (grids.isEmpty()) {
      m_errors.append("No grid data found");
      return false;
   }else if (grids.size() > 1) {
      QLOG_WARN() << "More than one grid specified in Cube parser";
   }
   Data::GridData* grid(grids.first());
  
   QFile file(filePath);
   if (file.exists() || !file.open(QIODevice::WriteOnly)) {
      m_errors.append("Failed to open file for write");
      return false;
   }

   QStringList header;
   header << "Cube file for " + grid->surfaceType().toString();
   header << "Generated using IQmol";
   
   QStringList coords(formatCoordinates(*geometry));

   unsigned nx, ny, nz;
   grid->getNumberOfPoints(nx, ny, nz);
   qglviewer::Vec delta(grid->delta());
   qglviewer::Vec origin(grid->origin());
   origin *= Constants::AngstromToBohr;

   header << QString("%1 %2 %3 %4").arg(coords.size(), 5)
                                   .arg(origin.x, 13, 'f', 6)
                                   .arg(origin.y, 13, 'f', 6)
                                   .arg(origin.z, 13, 'f', 6);

   header << QString("%1 %2 %3 %4").arg(nx, 5).arg(delta.x, 13, 'f', 6)
                                              .arg(0.0,     13, 'f', 6)
                                              .arg(0.0,     13, 'f', 6);
   header << QString("%1 %2 %3 %4").arg(ny, 5).arg(0.0,     13, 'f', 6)
                                              .arg(delta.y, 13, 'f', 6)
                                              .arg(0.0,     13, 'f', 6);
   header << QString("%1 %2 %3 %4").arg(nz, 5).arg(0.0,     13, 'f', 6)
                                              .arg(0.0,     13, 'f', 6)
                                              .arg(delta.z, 13, 'f', 6);
   header << coords;

   QByteArray buffer;
   buffer.append(header.join("\n"));
   buffer.append("\n");
   file.write(buffer);
   buffer.clear();

   double w;
   unsigned col(0);

   for (unsigned i = 0; i < nx; ++i) {
       for (unsigned j = 0; j < ny; ++j) {
           for (unsigned k = 0; k < nz; ++k, ++col) {
               w = (*grid)(i, j, k);
               if (w >= 0.0) buffer += " ";
               buffer += QString::number(w, 'E', 5);
               if (col == 5) {
                  col = -1;
                  buffer += "\n";
               }else {
                  buffer += " ";
               }
           }
           file.write(buffer); 
           buffer.clear();
       }
   }

   buffer += "\n";
   file.write(buffer); 
   file.flush();
   file.close();

   return true;
}