Subversion Repositories Projects

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
305 KeyOz 1
/***************************************************************************
2
 *   Copyright (C) 2009 by Manuel Schrape                                  *
3
 *   manuel.schrape@gmx.de                                                 *
4
 *                                                                         *
5
 *   This program is free software; you can redistribute it and/or modify  *
6
 *   it under the terms of the GNU General Public License as published by  *
7
 *   the Free Software Foundation; either version 2 of the License.        *
8
 *                                                                         *
9
 *   This program is distributed in the hope that it will be useful,       *
10
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12
 *   GNU General Public License for more details.                          *
13
 *                                                                         *
14
 *   You should have received a copy of the GNU General Public License     *
15
 *   along with this program; if not, write to the                         *
16
 *   Free Software Foundation, Inc.,                                       *
17
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18
 ***************************************************************************/
19
#include "dlg_Map.h"
361 KeyOz 20
#include <QDomDocument>
21
#include <QFile>
305 KeyOz 22
 
23
dlg_Map::dlg_Map(QWidget *parent) : QDialog(parent)
24
{
25
    setupUi(this);
26
 
334 KeyOz 27
    cb_Maps->removeItem(5);
28
    cb_Maps->removeItem(4);
29
    cb_Maps->removeItem(3);
30
    cb_Maps->removeItem(2);
31
 
306 KeyOz 32
    pb_Add->setEnabled(false);
33
    pb_Goto->setEnabled(false);
34
}
35
 
36
// Karte erstellen und anzeigen
37
void dlg_Map::create_Map(cSettings *t_Settings)
38
{
39
    o_Settings = t_Settings;
40
 
41
    cb_CenterPos->setChecked(o_Settings->Map.GotoPosition);
42
    cb_ShowRoute->setChecked(o_Settings->Map.ShowTrack);
43
 
305 KeyOz 44
    connect(sl_Zoom,   SIGNAL(valueChanged(int)), this, SLOT(slot_Zoom(int)));
306 KeyOz 45
    connect(pb_Add,    SIGNAL(clicked()), this, SLOT(slot_AddWayPoint()));
46
    connect(pb_Delete, SIGNAL(clicked()), this, SLOT(slot_DeleteWayPoints()));
47
    connect(pb_Goto,   SIGNAL(clicked()), this, SLOT(slot_GotoTarget()));
358 KeyOz 48
    connect(pb_SendWaypoints, SIGNAL(clicked()), this, SLOT(slot_SendWayPoints()));
361 KeyOz 49
 
50
    connect(pb_Load,   SIGNAL(clicked()), this, SLOT(slot_LoadWayPoints()));
51
    connect(pb_Save,   SIGNAL(clicked()), this, SLOT(slot_SaveWayPoints()));
52
 
305 KeyOz 53
    connect(cb_Maps,   SIGNAL(currentIndexChanged(int)), this, SLOT(slot_ChangeMap(int)));
361 KeyOz 54
    connect(cb_ShowWPs, SIGNAL(toggled(bool)), this, SLOT(slot_ShowWayPoints(bool)));
55
 
306 KeyOz 56
    connect(this,      SIGNAL(rejected()), this, SLOT(slot_Close()));
305 KeyOz 57
 
58
    o_Map = new MapControl(w_Map->size());
306 KeyOz 59
    o_Map->enablePersistentCache(o_Settings->DIR.Cache);
60
    o_Map->showScale(true);
305 KeyOz 61
 
62
    o_Adapter = new OSMMapAdapter();
63
 
64
    o_Layer = new MapLayer("MapLayer", o_Adapter);
65
    o_Click = new GeometryLayer("Click", o_Adapter);
66
    o_Route = new GeometryLayer("Poute", o_Adapter);
67
 
68
    o_Map->addLayer(o_Layer);
69
    o_Map->addLayer(o_Click);
70
    o_Map->addLayer(o_Route);
71
 
72
    o_Map->setZoom(17);
73
    o_Map->setView(QPointF(13.5,52.5));
74
 
75
    connect(o_Map, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)), this, SLOT(slot_Click(const QMouseEvent*, const QPointF)));
76
 
77
    l_Map->addWidget(o_Map);
78
 
79
    sl_Zoom->setValue(17);
80
 
81
    Pen[0] = new QPen(QColor(0,0,255,255));
82
    Pen[0]->setWidth(2);
83
    Pen[1] = new QPen(QColor(255,0,0,255));
84
    Pen[1]->setWidth(2);
85
}
86
 
361 KeyOz 87
QList<sWayPoint> dlg_Map::parse_WayPointKML(QString s_File)
88
{
89
    QList<sWayPoint> tmp_WayPoints;
90
    sWayPoint tmp_WayPoint;
91
 
92
    QFile f_KML(s_File);
93
    f_KML.open(QIODevice::ReadOnly | QIODevice::Text);
94
 
95
    QByteArray s_KML;
96
 
97
    while (!f_KML.atEnd())
98
    {
99
        s_KML.append(f_KML.readLine());
100
     }
101
 
102
    f_KML.close();
103
 
104
    QDomDocument *UserXML;
105
    UserXML = new QDomDocument;
106
 
107
    UserXML->setContent(s_KML);
108
 
109
    QDomElement Root       = UserXML->firstChildElement("kml");
110
    QDomElement Document   = Root.firstChildElement("Document");
111
    QDomElement Placemark  = Document.firstChildElement("Placemark");
112
    QDomElement Linestring = Placemark.firstChildElement("LineString");
113
 
114
    QString Name = Placemark.firstChildElement("name").toElement().text();
115
 
116
    QString Route = Linestring.firstChildElement("coordinates").toElement().text();
117
 
118
    QStringList s_Points = Route.split(" ");
119
 
120
    QStringList Position;
121
 
122
    for (int z = 0; z < s_Points.count() - 1; z++)
123
    {
124
        if (z != 20)
125
        {
126
           Position = s_Points[z].split(",");
127
           tmp_WayPoint.Longitude = Position[0].toDouble();
128
           tmp_WayPoint.Latitude  = Position[1].toDouble();
129
           tmp_WayPoint.Altitude  = Position[2].toDouble();
130
           tmp_WayPoint.Time      = sb_Time->value();
131
 
132
           tmp_WayPoints.append(tmp_WayPoint);
133
        }
134
        else
135
        {
136
            QMessageBox::warning(this, QA_NAME,trUtf8("Die Wegpunkt-Liste umfasst mehr als 20 Einträge. Es werden nur die ersten 20 Einträge übernommen."), QMessageBox::Ok);
137
 
138
            pb_Add->setEnabled(false);
139
 
140
            z = s_Points.count();
141
        }
142
    }
143
    return tmp_WayPoints;
144
}
145
 
146
QList<sWayPoint> dlg_Map::parse_WayPointMKW(QString s_File)
147
{
148
    QList<sWayPoint> tmp_WayPoints;
149
    sWayPoint tmp_WayPoint;
150
 
151
    QFile f_MKW(s_File);
152
    f_MKW.open(QIODevice::ReadOnly | QIODevice::Text);
153
 
154
    QString s_MKW;
155
 
156
    while (!f_MKW.atEnd())
157
    {
158
        s_MKW.append(f_MKW.readLine());
159
     }
160
 
161
    f_MKW.close();
162
 
163
    QStringList s_Points = s_MKW.split(" ");
164
 
165
    QStringList Position;
166
 
167
    for (int z = 0; z < s_Points.count() - 1; z++)
168
    {
169
        if (z != 20)
170
        {
171
           Position = s_Points[z].split(",");
172
           tmp_WayPoint.Longitude = Position[0].toDouble();
173
           tmp_WayPoint.Latitude  = Position[1].toDouble();
174
           tmp_WayPoint.Altitude  = Position[2].toDouble();
175
           tmp_WayPoint.Time      = Position[3].toInt();
176
 
177
           tmp_WayPoints.append(tmp_WayPoint);
178
        }
179
        else
180
        {
181
            QMessageBox::warning(this, QA_NAME,trUtf8("Die Wegpunkt-Liste umfasst mehr als 20 Einträge. Es werden nur die ersten 20 Einträge übernommen."), QMessageBox::Ok);
182
 
183
            pb_Add->setEnabled(false);
184
 
185
            z = s_Points.count();
186
        }
187
    }
188
    return tmp_WayPoints;
189
}
190
 
191
void dlg_Map::show_WayPoints(QList<sWayPoint> WayPoints)
192
{
193
    Point* p_Point;
194
 
195
    o_Route->removeGeometry(l_RouteWP);
196
    p_RouteWP.clear();
197
    l_WayPoints.clear();
198
 
199
    l_WayPoints = WayPoints;
200
 
201
    for (int z = 0; z < WayPoints.count(); z++)
202
    {
203
        p_Point = new Point(WayPoints[z].Longitude, WayPoints[z].Latitude);
204
 
205
        p_RouteWP.append(p_Point);
206
    }
207
 
208
    l_RouteWP = new LineString(p_RouteWP, "", Pen[0]);
209
    o_Route->addGeometry(l_RouteWP);
210
 
211
    o_Map->setView(p_Point);
212
 
213
    o_Map->updateRequestNew();    
214
}
215
 
216
void dlg_Map::save_WayPointsMKW(QString s_File)
217
{
218
    QFile *f_MKW = new QFile(s_File);
219
 
220
    f_MKW->open(QIODevice::ReadWrite | QIODevice::Text);
221
 
222
    QTextStream out(f_MKW);
223
 
224
    out.setRealNumberPrecision(9);
225
 
226
    for (int z = 0; z < l_WayPoints.count(); z++)
227
    {
228
        out << l_WayPoints[z].Longitude << "," << l_WayPoints[z].Latitude << "," << l_WayPoints[z].Altitude << "," << l_WayPoints[z].Time << " \n";
229
    }
230
 
231
    f_MKW->close();
232
}
233
 
234
void dlg_Map::slot_LoadWayPoints()
235
{
236
    QString Filename = QFileDialog::getOpenFileName(this, "WayPoint-Route laden",  o_Settings->DIR.Logging, "Mikrokopter WayPoints(*.mkw);;KML-Datei(*.kml);;Alle Dateien (*)");
237
 
238
    if (!Filename.isEmpty())
239
    {
240
        if (Filename.endsWith(".kml", Qt::CaseInsensitive))
241
        {
242
            cb_ShowWPs->setChecked(true);
243
            pb_SendWaypoints->setEnabled(true);
244
 
245
            show_WayPoints(parse_WayPointKML(Filename));
246
        }
247
        if (Filename.endsWith(".mkw", Qt::CaseInsensitive))
248
        {
249
            cb_ShowWPs->setChecked(true);
250
            pb_SendWaypoints->setEnabled(true);
251
 
252
            show_WayPoints(parse_WayPointMKW(Filename));
253
        }
254
    }
255
}
256
 
257
void dlg_Map::slot_SaveWayPoints()
258
{
259
    QString Filename = QFileDialog::getSaveFileName(this, "WayPoint-Route speichern",  o_Settings->DIR.Logging, "Mikrokopter WayPoints(*.mkw);;Alle Dateien (*)");
260
 
261
    if (!Filename.isEmpty())
262
    {
263
        if (!(Filename.endsWith(".mkw", Qt::CaseInsensitive)))
264
        {
265
            Filename = Filename + QString(".mkw");
266
        }
267
 
268
        save_WayPointsMKW(Filename);
269
    }
270
}
271
 
272
void dlg_Map::slot_ShowWayPoints(bool Show)
273
{
274
    if (Show == true)
275
    {
276
        qDebug("An");
277
        o_Route->addGeometry(l_RouteWP);
278
        o_Map->updateRequestNew();
279
    }
280
    else
281
    {
282
        qDebug("Aus");
283
        o_Route->removeGeometry(l_RouteWP);
284
        o_Map->updateRequestNew();
285
    }
286
}
287
 
306 KeyOz 288
// Position zum Flug-Track hinzufügen
305 KeyOz 289
void dlg_Map::add_Position(double x, double y)
290
{
306 KeyOz 291
    sWayPoint WayPoint;
292
 
293
    WayPoint.Longitude = x;
294
    WayPoint.Latitude = y;
358 KeyOz 295
//    WayPoint.Time = sb_Time->value();
306 KeyOz 296
 
358 KeyOz 297
    l_Track.append(WayPoint);
306 KeyOz 298
 
305 KeyOz 299
    o_Route->removeGeometry(l_RouteFL);
300
    p_RouteFL.append(new Point(x,y));
301
 
302
    o_Click->removeGeometry(LastPos);
303
 
304
    Point* P = new CirclePoint(x, y, "P1", Point::Middle, Pen[0]);
305
    LastPos = P;
306
    P->setBaselevel(17);
307
    o_Click->addGeometry(P);
308
 
309
    if (cb_CenterPos->isChecked())
310
    {
311
        o_Map->setView(QPointF(x, y));
312
    }
313
 
314
    if (cb_ShowRoute->isChecked())
315
    {
316
        l_RouteFL = new LineString(p_RouteFL, "", Pen[1]);
317
 
318
        o_Route->addGeometry(l_RouteFL);
319
    }
320
    o_Map->updateRequestNew();
321
}
322
 
306 KeyOz 323
// Zoom der Karte ändern
324
void dlg_Map::slot_Zoom(int t_Zoom)
305 KeyOz 325
{
306 KeyOz 326
    o_Map->setZoom(t_Zoom);
305 KeyOz 327
}
328
 
306 KeyOz 329
// Waypoint zur Liste hinzufügen
330
void dlg_Map::slot_AddWayPoint()
305 KeyOz 331
{
361 KeyOz 332
    cb_ShowWPs->setChecked(true);
333
 
358 KeyOz 334
    sWayPoint WayPoint;
335
 
336
    WayPoint.Longitude = LastClick->longitude();
337
    WayPoint.Latitude = LastClick->latitude();
338
    WayPoint.Time = sb_Time->value();
339
 
340
    l_WayPoints.append(WayPoint);
341
 
305 KeyOz 342
    o_Route->removeGeometry(l_RouteWP);
343
 
344
    p_RouteWP.append(LastClick);
345
    l_RouteWP = new LineString(p_RouteWP, "", Pen[0]);
346
 
347
    o_Route->addGeometry(l_RouteWP);
348
    o_Map->updateRequestNew();
358 KeyOz 349
 
350
    pb_SendWaypoints->setEnabled(true);
361 KeyOz 351
 
352
    if (l_WayPoints.count() == 20)
353
    {
354
        QMessageBox::warning(this, QA_NAME,trUtf8("Wegpunkt-Liste ist voll. Es können maximal 20 Wegpunkte benutzt werden."), QMessageBox::Ok);
355
        pb_Add->setEnabled(false);
356
    }
357
 
305 KeyOz 358
}
359
 
306 KeyOz 360
// Waypoint-Liste löschen
361
void dlg_Map::slot_DeleteWayPoints()
305 KeyOz 362
{
363
    o_Route->removeGeometry(l_RouteWP);
364
    p_RouteWP.clear();
358 KeyOz 365
    l_WayPoints.clear();
305 KeyOz 366
    o_Map->updateRequestNew();
361 KeyOz 367
 
368
    pb_Add->setEnabled(pb_Goto->isEnabled());
305 KeyOz 369
}
370
 
358 KeyOz 371
void dlg_Map::slot_SendWayPoints()
372
{
373
    emit(set_WayPoints(l_WayPoints));
374
}
375
 
306 KeyOz 376
// Zum Zielpunkt fliegen
377
void dlg_Map::slot_GotoTarget()
378
{
379
    sWayPoint Target;
380
 
381
    Target.Longitude = LastClick->longitude();
382
    Target.Latitude = LastClick->latitude();
383
    Target.Time = sb_Time->value();
384
 
385
    emit(set_Target(Target));
386
}
387
 
388
// Click in der Karte
305 KeyOz 389
void dlg_Map::slot_Click(const QMouseEvent* Event, const QPointF Coord)
390
{
391
    if ((Event->type() == QEvent::MouseButtonPress) && ((Event->button() == Qt::RightButton) || (Event->button() == Qt::MidButton)))
392
    {
393
        sl_Zoom->setValue(o_Adapter->adaptedZoom());
394
    }
395
 
306 KeyOz 396
    // Überwachen ob Karte verschoben wird
305 KeyOz 397
    if ((Event->type() == QEvent::MouseButtonPress) && (Event->button() == Qt::LeftButton))
398
    {
306 KeyOz 399
        MapCenter = o_Map->currentCoordinate();
400
    }
305 KeyOz 401
 
306 KeyOz 402
    // Nur wenn nicht Verschoben dann einen Punkt setzen
403
    if ((Event->type() == QEvent::MouseButtonRelease) && (Event->button() == Qt::LeftButton))
404
    {
405
        if (o_Map->currentCoordinate() == MapCenter)
406
        {
361 KeyOz 407
            if (l_WayPoints.count() < 20)
408
            {
409
                pb_Add->setEnabled(true);
410
            }
306 KeyOz 411
            pb_Goto->setEnabled(true);
305 KeyOz 412
 
306 KeyOz 413
            o_Click->removeGeometry(ClickPoint);
305 KeyOz 414
 
306 KeyOz 415
            ClickPoint = new CirclePoint(Coord.x(), Coord.y(), 6, "P1", Point::Middle, Pen[1]);
416
 
417
            LastClick = new Point(Coord.x(), Coord.y());
418
 
419
            ClickPoint->setBaselevel(o_Adapter->adaptedZoom());
420
            o_Click->addGeometry(ClickPoint);
421
        }
305 KeyOz 422
    }
306 KeyOz 423
 
305 KeyOz 424
    o_Map->updateRequestNew();
306 KeyOz 425
//    qDebug(QString("%1").arg(Coord.x()).toLatin1().data());
426
//    qDebug(QString("%1").arg(Coord.y()).toLatin1().data());
305 KeyOz 427
}
428
 
306 KeyOz 429
// auf Veränderung der Fenstergröße reagieren
305 KeyOz 430
void dlg_Map::resizeEvent ( QResizeEvent * event )
431
{
306 KeyOz 432
    event = event;
305 KeyOz 433
    o_Map->resize(w_Map->size() - QSize(20,20));
434
}
435
 
306 KeyOz 436
// Karte wechseln
437
void dlg_Map::slot_ChangeMap(int t_Set)
305 KeyOz 438
{
306 KeyOz 439
    int zoom = o_Adapter->adaptedZoom();
440
    QPointF a = o_Map->currentCoordinate();
305 KeyOz 441
 
306 KeyOz 442
    o_Map->setZoom(0);
443
 
444
    switch(t_Set)
445
    {
446
        case 0 : // OpenStreetMap
447
        {
305 KeyOz 448
            o_Adapter = new OSMMapAdapter();
306 KeyOz 449
        }
450
        break;
334 KeyOz 451
        case 1 : // Yahoo Sat
306 KeyOz 452
        {
338 KeyOz 453
            o_Adapter = new TileMapAdapter("tile.openaerialmap.org", "/tiles/1.0.0/openaerialmap-900913/%1/%2/%3.png", 256, 0, 17);
334 KeyOz 454
        }
455
        break;
456
        case 2 : // Google Maps
457
        {
306 KeyOz 458
            o_Adapter = new GoogleMapAdapter();
459
        }
460
        break;
334 KeyOz 461
        case 3 : // Google Sat
306 KeyOz 462
        {
463
            o_Adapter = new GoogleSatMapAdapter();
464
        }
465
        break;
334 KeyOz 466
        case 4 : // Yahoo Maps
306 KeyOz 467
        {
305 KeyOz 468
            o_Adapter = new YahooMapAdapter();
306 KeyOz 469
        }
470
        break;
334 KeyOz 471
        case 5 : // Yahoo Sat
306 KeyOz 472
        {
305 KeyOz 473
            o_Adapter = new YahooMapAdapter("us.maps3.yimg.com", "/aerial.maps.yimg.com/png?v=1.7&t=a&s=256&x=%2&y=%3&z=%1");
306 KeyOz 474
        }
475
        break;
476
    }
305 KeyOz 477
 
306 KeyOz 478
    o_Layer->setMapAdapter(o_Adapter);
479
    o_Click->setMapAdapter(o_Adapter);
480
    o_Route->setMapAdapter(o_Adapter);
305 KeyOz 481
 
306 KeyOz 482
    o_Map->updateRequestNew();
483
    o_Map->setZoom(zoom);
484
}
305 KeyOz 485
 
306 KeyOz 486
// Fenster wird geschlossen.
487
void dlg_Map::slot_Close()
488
{
489
    o_Settings->Map.GotoPosition = cb_CenterPos->isChecked();
490
    o_Settings->Map.ShowTrack    = cb_ShowRoute->isChecked();
491
    emit set_Settings(o_Settings);
492
}
305 KeyOz 493