File: overpassql-cli.cpp

package info (click to toggle)
kosmindoormap 25.12.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,024 kB
  • sloc: cpp: 22,135; xml: 554; yacc: 490; lex: 176; sh: 166; makefile: 24; java: 15
file content (109 lines) | stat: -rw-r--r-- 3,933 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
    SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>

    SPDX-License-Identifier: LGPL-2.0-or-later
*/

#include <overpassquery.h>
#include <overpassquerymanager.h>
#include <io.h>

#include <QCommandLineParser>
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QJsonDocument>

#include <iostream>

#define S(x) QStringLiteral(x)

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    QCommandLineParser parser;
    parser.setApplicationDescription(S("overpassql-cli"));
    parser.addHelpOption();
    QCommandLineOption queryOption({ S("q"), S("query") }, S("Overpass QL query to run"), S("query-string"));
    parser.addOption(queryOption);
    QCommandLineOption queryFileOption({ S("f"), S("query-file") }, S("File to read Overpass QL query from"), S("query-file"));
    parser.addOption(queryFileOption);
    QCommandLineOption bboxOption({ S("b"), S("bbox") }, S("Query bounding box"), S("x,y,w,h"));
    parser.addOption(bboxOption);
    QCommandLineOption tileSizeOption({ S("t"), S("tile-size") }, S("Query tile size"), S("w,h"));
    parser.addOption(tileSizeOption);
    QCommandLineOption minTileSizeOption({ S("m"), S("minimum-tile-size") }, S("Minimum query tile size"), S("w,h"));
    parser.addOption(minTileSizeOption);
    QCommandLineOption outFileOption( { S("o"), S("output") }, S("Output file name"), S("out"));
    parser.addOption(outFileOption);
    parser.process(app);

    OSM::OverpassQueryManager mgr;
    OSM::OverpassQuery query;

    if (parser.isSet(queryFileOption)) {
        QFile f(parser.value(queryFileOption));
        if (!f.open(QFile::ReadOnly)) {
            std::cerr << "failed to read query file: " << qPrintable(f.errorString()) << std::endl;
            return 1;
        }
        query.setQuery(QString::fromUtf8(f.readAll()));
    } else {
        query.setQuery(parser.value(queryOption));
    }

    if (parser.isSet(bboxOption)) {
        const auto s = parser.value(bboxOption).split(QLatin1Char(','));
        if (s.size() != 4) {
            std::cerr << "invalid bbox format" << std::endl;
            return 1;
        }
        QRectF bbox(s[0].toDouble(), s[1].toDouble(), s[2].toDouble(), s[3].toDouble());
        query.setBoundingBox(bbox);
    }

    if (parser.isSet(tileSizeOption)) {
        const auto s = parser.value(tileSizeOption).split(QLatin1Char(','));
        if (s.size() != 2) {
            std::cerr << "invalid tile size format" << std::endl;
            return 1;
        }
        QSizeF tileSize(s[0].toDouble(), s[1].toDouble());
        query.setTileSize(tileSize);
    }
    if (parser.isSet(minTileSizeOption)) {
        const auto s = parser.value(minTileSizeOption).split(QLatin1Char(','));
        if (s.size() != 2) {
            std::cerr << "invalid minimum tile size format" << std::endl;
            return 1;
        }
        QSizeF minTileSize(s[0].toDouble(), s[1].toDouble());
        query.setMinimumTileSize(minTileSize);
    }

    QObject::connect(&query, &OSM::OverpassQuery::finished, &app, [&]() {
        if (query.error() != OSM::OverpassQuery::NoError) {
            std::cerr << "query error" << std::endl;
            app.exit(1);
        }

        const auto outFileName = parser.value(outFileOption);
        QFile outFile(outFileName);
        std::unique_ptr<OSM::AbstractWriter> writer;
        if (!outFileName.isEmpty() && outFile.open(QFile::WriteOnly)) {
            writer = OSM::IO::writerForFileName(outFile.fileName());
        } else if (outFile.open(stdout, QFile::WriteOnly)) {
            writer = OSM::IO::writerForMimeType(u"application/vnd.openstreetmap.data+xml");
        }
        if (!writer) {
            std::cerr << "unsupported output file format" << std::endl;
            app.exit(1);
        }
        writer->write(query.result(), &outFile);

        app.quit();
    });
    mgr.execute(&query);

    return app.exec();
}