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);
398 Brean 29
//    cb_Maps->removeItem(3);
30
//    cb_Maps->removeItem(2);
334 KeyOz 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()));
398 Brean 49
    connect(pb_LoadPic,   SIGNAL(clicked()), this, SLOT(slot_LoadMapPic()));
361 KeyOz 50
 
51
    connect(pb_Load,   SIGNAL(clicked()), this, SLOT(slot_LoadWayPoints()));
52
    connect(pb_Save,   SIGNAL(clicked()), this, SLOT(slot_SaveWayPoints()));
53
 
305 KeyOz 54
    connect(cb_Maps,   SIGNAL(currentIndexChanged(int)), this, SLOT(slot_ChangeMap(int)));
361 KeyOz 55
    connect(cb_ShowWPs, SIGNAL(toggled(bool)), this, SLOT(slot_ShowWayPoints(bool)));
56
 
306 KeyOz 57
    connect(this,      SIGNAL(rejected()), this, SLOT(slot_Close()));
305 KeyOz 58
 
59
    o_Map = new MapControl(w_Map->size());
306 KeyOz 60
    o_Map->enablePersistentCache(o_Settings->DIR.Cache);
61
    o_Map->showScale(true);
305 KeyOz 62
 
63
    o_Adapter = new OSMMapAdapter();
64
 
65
    o_Layer = new MapLayer("MapLayer", o_Adapter);
66
    o_Click = new GeometryLayer("Click", o_Adapter);
67
    o_Route = new GeometryLayer("Poute", o_Adapter);
68
 
69
    o_Map->addLayer(o_Layer);
70
    o_Map->addLayer(o_Click);
71
    o_Map->addLayer(o_Route);
72
 
73
    o_Map->setZoom(17);
74
    o_Map->setView(QPointF(13.5,52.5));
75
 
76
    connect(o_Map, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)), this, SLOT(slot_Click(const QMouseEvent*, const QPointF)));
77
 
78
    l_Map->addWidget(o_Map);
79
 
80
    sl_Zoom->setValue(17);
81
 
82
    Pen[0] = new QPen(QColor(0,0,255,255));
83
    Pen[0]->setWidth(2);
84
    Pen[1] = new QPen(QColor(255,0,0,255));
85
    Pen[1]->setWidth(2);
86
}
87
 
361 KeyOz 88
QList<sWayPoint> dlg_Map::parse_WayPointKML(QString s_File)
89
{
90
    QList<sWayPoint> tmp_WayPoints;
91
    sWayPoint tmp_WayPoint;
92
 
93
    QFile f_KML(s_File);
94
    f_KML.open(QIODevice::ReadOnly | QIODevice::Text);
95
 
96
    QByteArray s_KML;
97
 
98
    while (!f_KML.atEnd())
99
    {
100
        s_KML.append(f_KML.readLine());
101
     }
102
 
103
    f_KML.close();
104
 
105
    QDomDocument *UserXML;
106
    UserXML = new QDomDocument;
107
 
108
    UserXML->setContent(s_KML);
109
 
110
    QDomElement Root       = UserXML->firstChildElement("kml");
111
    QDomElement Document   = Root.firstChildElement("Document");
112
    QDomElement Placemark  = Document.firstChildElement("Placemark");
113
    QDomElement Linestring = Placemark.firstChildElement("LineString");
114
 
115
    QString Name = Placemark.firstChildElement("name").toElement().text();
116
 
117
    QString Route = Linestring.firstChildElement("coordinates").toElement().text();
118
 
119
    QStringList s_Points = Route.split(" ");
120
 
121
    QStringList Position;
122
 
123
    for (int z = 0; z < s_Points.count() - 1; z++)
124
    {
125
        if (z != 20)
126
        {
127
           Position = s_Points[z].split(",");
128
           tmp_WayPoint.Longitude = Position[0].toDouble();
129
           tmp_WayPoint.Latitude  = Position[1].toDouble();
130
           tmp_WayPoint.Altitude  = Position[2].toDouble();
131
           tmp_WayPoint.Time      = sb_Time->value();
132
 
133
           tmp_WayPoints.append(tmp_WayPoint);
134
        }
135
        else
136
        {
137
            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);
138
 
139
            pb_Add->setEnabled(false);
140
 
141
            z = s_Points.count();
142
        }
143
    }
144
    return tmp_WayPoints;
145
}
146
 
147
QList<sWayPoint> dlg_Map::parse_WayPointMKW(QString s_File)
148
{
149
    QList<sWayPoint> tmp_WayPoints;
150
    sWayPoint tmp_WayPoint;
151
 
152
    QFile f_MKW(s_File);
153
    f_MKW.open(QIODevice::ReadOnly | QIODevice::Text);
154
 
155
    QString s_MKW;
156
 
157
    while (!f_MKW.atEnd())
158
    {
159
        s_MKW.append(f_MKW.readLine());
160
     }
161
 
162
    f_MKW.close();
163
 
164
    QStringList s_Points = s_MKW.split(" ");
165
 
166
    QStringList Position;
167
 
168
    for (int z = 0; z < s_Points.count() - 1; z++)
169
    {
170
        if (z != 20)
171
        {
172
           Position = s_Points[z].split(",");
173
           tmp_WayPoint.Longitude = Position[0].toDouble();
174
           tmp_WayPoint.Latitude  = Position[1].toDouble();
175
           tmp_WayPoint.Altitude  = Position[2].toDouble();
176
           tmp_WayPoint.Time      = Position[3].toInt();
177
 
178
           tmp_WayPoints.append(tmp_WayPoint);
179
        }
180
        else
181
        {
182
            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);
183
 
184
            pb_Add->setEnabled(false);
185
 
186
            z = s_Points.count();
187
        }
188
    }
189
    return tmp_WayPoints;
190
}
191
 
192
void dlg_Map::show_WayPoints(QList<sWayPoint> WayPoints)
193
{
194
    Point* p_Point;
195
 
196
    o_Route->removeGeometry(l_RouteWP);
197
    p_RouteWP.clear();
198
    l_WayPoints.clear();
199
 
200
    l_WayPoints = WayPoints;
201
 
202
    for (int z = 0; z < WayPoints.count(); z++)
203
    {
204
        p_Point = new Point(WayPoints[z].Longitude, WayPoints[z].Latitude);
205
 
206
        p_RouteWP.append(p_Point);
207
    }
208
 
209
    l_RouteWP = new LineString(p_RouteWP, "", Pen[0]);
210
    o_Route->addGeometry(l_RouteWP);
211
 
212
    o_Map->setView(p_Point);
213
 
214
    o_Map->updateRequestNew();    
215
}
216
 
217
void dlg_Map::save_WayPointsMKW(QString s_File)
218
{
219
    QFile *f_MKW = new QFile(s_File);
220
 
221
    f_MKW->open(QIODevice::ReadWrite | QIODevice::Text);
222
 
223
    QTextStream out(f_MKW);
224
 
225
    out.setRealNumberPrecision(9);
226
 
227
    for (int z = 0; z < l_WayPoints.count(); z++)
228
    {
229
        out << l_WayPoints[z].Longitude << "," << l_WayPoints[z].Latitude << "," << l_WayPoints[z].Altitude << "," << l_WayPoints[z].Time << " \n";
230
    }
231
 
232
    f_MKW->close();
233
}
234
 
235
void dlg_Map::slot_LoadWayPoints()
236
{
237
    QString Filename = QFileDialog::getOpenFileName(this, "WayPoint-Route laden",  o_Settings->DIR.Logging, "Mikrokopter WayPoints(*.mkw);;KML-Datei(*.kml);;Alle Dateien (*)");
238
 
239
    if (!Filename.isEmpty())
240
    {
241
        if (Filename.endsWith(".kml", Qt::CaseInsensitive))
242
        {
243
            cb_ShowWPs->setChecked(true);
244
            pb_SendWaypoints->setEnabled(true);
245
 
246
            show_WayPoints(parse_WayPointKML(Filename));
247
        }
248
        if (Filename.endsWith(".mkw", Qt::CaseInsensitive))
249
        {
250
            cb_ShowWPs->setChecked(true);
251
            pb_SendWaypoints->setEnabled(true);
252
 
253
            show_WayPoints(parse_WayPointMKW(Filename));
254
        }
255
    }
256
}
257
 
258
void dlg_Map::slot_SaveWayPoints()
259
{
260
    QString Filename = QFileDialog::getSaveFileName(this, "WayPoint-Route speichern",  o_Settings->DIR.Logging, "Mikrokopter WayPoints(*.mkw);;Alle Dateien (*)");
261
 
262
    if (!Filename.isEmpty())
263
    {
264
        if (!(Filename.endsWith(".mkw", Qt::CaseInsensitive)))
265
        {
266
            Filename = Filename + QString(".mkw");
267
        }
268
 
269
        save_WayPointsMKW(Filename);
270
    }
271
}
272
 
273
void dlg_Map::slot_ShowWayPoints(bool Show)
274
{
275
    if (Show == true)
276
    {
277
        qDebug("An");
278
        o_Route->addGeometry(l_RouteWP);
279
        o_Map->updateRequestNew();
280
    }
281
    else
282
    {
283
        qDebug("Aus");
284
        o_Route->removeGeometry(l_RouteWP);
285
        o_Map->updateRequestNew();
286
    }
287
}
288
 
306 KeyOz 289
// Position zum Flug-Track hinzufügen
305 KeyOz 290
void dlg_Map::add_Position(double x, double y)
291
{
306 KeyOz 292
    sWayPoint WayPoint;
293
 
294
    WayPoint.Longitude = x;
295
    WayPoint.Latitude = y;
358 KeyOz 296
//    WayPoint.Time = sb_Time->value();
306 KeyOz 297
 
358 KeyOz 298
    l_Track.append(WayPoint);
306 KeyOz 299
 
305 KeyOz 300
    o_Route->removeGeometry(l_RouteFL);
301
    p_RouteFL.append(new Point(x,y));
302
 
303
    o_Click->removeGeometry(LastPos);
304
 
305
    Point* P = new CirclePoint(x, y, "P1", Point::Middle, Pen[0]);
306
    LastPos = P;
307
    P->setBaselevel(17);
308
    o_Click->addGeometry(P);
309
 
310
    if (cb_CenterPos->isChecked())
311
    {
312
        o_Map->setView(QPointF(x, y));
313
    }
314
 
315
    if (cb_ShowRoute->isChecked())
316
    {
317
        l_RouteFL = new LineString(p_RouteFL, "", Pen[1]);
318
 
319
        o_Route->addGeometry(l_RouteFL);
320
    }
321
    o_Map->updateRequestNew();
322
}
323
 
306 KeyOz 324
// Zoom der Karte ändern
325
void dlg_Map::slot_Zoom(int t_Zoom)
305 KeyOz 326
{
306 KeyOz 327
    o_Map->setZoom(t_Zoom);
305 KeyOz 328
}
329
 
306 KeyOz 330
// Waypoint zur Liste hinzufügen
331
void dlg_Map::slot_AddWayPoint()
305 KeyOz 332
{
361 KeyOz 333
    cb_ShowWPs->setChecked(true);
334
 
358 KeyOz 335
    sWayPoint WayPoint;
336
 
337
    WayPoint.Longitude = LastClick->longitude();
338
    WayPoint.Latitude = LastClick->latitude();
339
    WayPoint.Time = sb_Time->value();
340
 
341
    l_WayPoints.append(WayPoint);
342
 
305 KeyOz 343
    o_Route->removeGeometry(l_RouteWP);
344
 
345
    p_RouteWP.append(LastClick);
346
    l_RouteWP = new LineString(p_RouteWP, "", Pen[0]);
347
 
348
    o_Route->addGeometry(l_RouteWP);
349
    o_Map->updateRequestNew();
358 KeyOz 350
 
351
    pb_SendWaypoints->setEnabled(true);
361 KeyOz 352
 
353
    if (l_WayPoints.count() == 20)
354
    {
355
        QMessageBox::warning(this, QA_NAME,trUtf8("Wegpunkt-Liste ist voll. Es können maximal 20 Wegpunkte benutzt werden."), QMessageBox::Ok);
356
        pb_Add->setEnabled(false);
357
    }
358
 
305 KeyOz 359
}
360
 
306 KeyOz 361
// Waypoint-Liste löschen
362
void dlg_Map::slot_DeleteWayPoints()
305 KeyOz 363
{
364
    o_Route->removeGeometry(l_RouteWP);
365
    p_RouteWP.clear();
358 KeyOz 366
    l_WayPoints.clear();
305 KeyOz 367
    o_Map->updateRequestNew();
361 KeyOz 368
 
369
    pb_Add->setEnabled(pb_Goto->isEnabled());
305 KeyOz 370
}
371
 
358 KeyOz 372
void dlg_Map::slot_SendWayPoints()
373
{
374
    emit(set_WayPoints(l_WayPoints));
375
}
376
 
306 KeyOz 377
// Zum Zielpunkt fliegen
378
void dlg_Map::slot_GotoTarget()
379
{
380
    sWayPoint Target;
381
 
382
    Target.Longitude = LastClick->longitude();
383
    Target.Latitude = LastClick->latitude();
384
    Target.Time = sb_Time->value();
385
 
386
    emit(set_Target(Target));
387
}
388
 
389
// Click in der Karte
305 KeyOz 390
void dlg_Map::slot_Click(const QMouseEvent* Event, const QPointF Coord)
391
{
392
    if ((Event->type() == QEvent::MouseButtonPress) && ((Event->button() == Qt::RightButton) || (Event->button() == Qt::MidButton)))
393
    {
394
        sl_Zoom->setValue(o_Adapter->adaptedZoom());
395
    }
396
 
306 KeyOz 397
    // Überwachen ob Karte verschoben wird
305 KeyOz 398
    if ((Event->type() == QEvent::MouseButtonPress) && (Event->button() == Qt::LeftButton))
399
    {
306 KeyOz 400
        MapCenter = o_Map->currentCoordinate();
401
    }
305 KeyOz 402
 
306 KeyOz 403
    // Nur wenn nicht Verschoben dann einen Punkt setzen
404
    if ((Event->type() == QEvent::MouseButtonRelease) && (Event->button() == Qt::LeftButton))
405
    {
406
        if (o_Map->currentCoordinate() == MapCenter)
407
        {
361 KeyOz 408
            if (l_WayPoints.count() < 20)
409
            {
410
                pb_Add->setEnabled(true);
411
            }
306 KeyOz 412
            pb_Goto->setEnabled(true);
305 KeyOz 413
 
306 KeyOz 414
            o_Click->removeGeometry(ClickPoint);
305 KeyOz 415
 
306 KeyOz 416
            ClickPoint = new CirclePoint(Coord.x(), Coord.y(), 6, "P1", Point::Middle, Pen[1]);
417
 
418
            LastClick = new Point(Coord.x(), Coord.y());
419
 
420
            ClickPoint->setBaselevel(o_Adapter->adaptedZoom());
421
            o_Click->addGeometry(ClickPoint);
422
        }
305 KeyOz 423
    }
306 KeyOz 424
 
305 KeyOz 425
    o_Map->updateRequestNew();
398 Brean 426
 
306 KeyOz 427
//    qDebug(QString("%1").arg(Coord.x()).toLatin1().data());
428
//    qDebug(QString("%1").arg(Coord.y()).toLatin1().data());
305 KeyOz 429
}
430
 
398 Brean 431
 
432
void dlg_Map::slot_LoadMapPic()
433
{
434
    QString Filename = QFileDialog::getOpenFileName(this, "Bild als Karte",  o_Settings->DIR.Logging, "Bilddatei(*.jpg *.png *.gif);;Alle Dateien (*)");
435
 
436
    if (!Filename.isEmpty())
437
    {
438
        QFile f_Points(Filename + ".pos");
439
 
440
        if (f_Points.exists())
441
        {
442
            f_Points.open(QIODevice::ReadOnly | QIODevice::Text);
443
 
444
            QString s_Points;
445
 
446
            while (!f_Points.atEnd())
447
            {
448
                s_Points.append(f_Points.readLine());
449
            }
450
 
451
            f_Points.close();
452
 
453
            QStringList s_Pos = s_Points.split(",");
454
 
455
            FixedImageOverlay* fip = new FixedImageOverlay(s_Pos[0].toDouble(), s_Pos[1].toDouble(), s_Pos[2].toDouble(), s_Pos[3].toDouble(), Filename);
456
 
457
            o_Layer->addGeometry(fip);
458
            o_Map->updateRequestNew();
459
        }
460
    }
461
}
462
 
306 KeyOz 463
// auf Veränderung der Fenstergröße reagieren
305 KeyOz 464
void dlg_Map::resizeEvent ( QResizeEvent * event )
465
{
306 KeyOz 466
    event = event;
305 KeyOz 467
    o_Map->resize(w_Map->size() - QSize(20,20));
468
}
469
 
306 KeyOz 470
// Karte wechseln
471
void dlg_Map::slot_ChangeMap(int t_Set)
305 KeyOz 472
{
306 KeyOz 473
    int zoom = o_Adapter->adaptedZoom();
474
    QPointF a = o_Map->currentCoordinate();
305 KeyOz 475
 
306 KeyOz 476
    o_Map->setZoom(0);
477
 
478
    switch(t_Set)
479
    {
480
        case 0 : // OpenStreetMap
481
        {
305 KeyOz 482
            o_Adapter = new OSMMapAdapter();
306 KeyOz 483
        }
484
        break;
334 KeyOz 485
        case 1 : // Yahoo Sat
306 KeyOz 486
        {
338 KeyOz 487
            o_Adapter = new TileMapAdapter("tile.openaerialmap.org", "/tiles/1.0.0/openaerialmap-900913/%1/%2/%3.png", 256, 0, 17);
334 KeyOz 488
        }
489
        break;
490
        case 2 : // Google Maps
491
        {
306 KeyOz 492
            o_Adapter = new GoogleMapAdapter();
493
        }
494
        break;
334 KeyOz 495
        case 3 : // Google Sat
306 KeyOz 496
        {
497
            o_Adapter = new GoogleSatMapAdapter();
498
        }
499
        break;
334 KeyOz 500
        case 4 : // Yahoo Maps
306 KeyOz 501
        {
305 KeyOz 502
            o_Adapter = new YahooMapAdapter();
306 KeyOz 503
        }
504
        break;
334 KeyOz 505
        case 5 : // Yahoo Sat
306 KeyOz 506
        {
305 KeyOz 507
            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 508
        }
509
        break;
510
    }
305 KeyOz 511
 
306 KeyOz 512
    o_Layer->setMapAdapter(o_Adapter);
513
    o_Click->setMapAdapter(o_Adapter);
514
    o_Route->setMapAdapter(o_Adapter);
305 KeyOz 515
 
306 KeyOz 516
    o_Map->updateRequestNew();
517
    o_Map->setZoom(zoom);
518
}
305 KeyOz 519
 
306 KeyOz 520
// Fenster wird geschlossen.
521
void dlg_Map::slot_Close()
522
{
523
    o_Settings->Map.GotoPosition = cb_CenterPos->isChecked();
524
    o_Settings->Map.ShowTrack    = cb_ShowRoute->isChecked();
525
    emit set_Settings(o_Settings);
526
}
305 KeyOz 527