source: ntrip/trunk/BNC/src/bncmap_svg.cpp@ 4670

Last change on this file since 4670 was 4670, checked in by weber, 12 years ago

Keep lat/lon relations in distribution plot

File size: 7.2 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: t_bncMap
30 *
31 * Purpose: Plot map of stations from NTRIP source table
32 *
33 * Author: L. Mervart
34 *
35 * Created: 02-Sep-2012
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <QtSvg>
42
43#include <qwt_symbol.h>
44#include <qwt_plot.h>
45#include <qwt_plot_svgitem.h>
46#include <qwt_plot_curve.h>
47#include <qwt_plot_marker.h>
48#include <qwt_plot_canvas.h>
49#include <qwt_plot_zoomer.h>
50#include <qwt_plot_renderer.h>
51
52#include "bncmap.h"
53
54// Constructor
55/////////////////////////////////////////////////////////////////////////////
56t_bncMap::t_bncMap(QWidget* parent) : QDialog(parent) {
57
58 // Map in Scalable Vector Graphics (svg) Format
59 // --------------------------------------------
60 _mapPlot = new QwtPlot();
61
62 _mapPlot->setAxisScale(QwtPlot::xBottom, -180.0, 180.0);
63 _mapPlot->setAxisScale(QwtPlot::yLeft, -90.0, 90.0);
64
65 _mapPlotZoomer = new QwtPlotZoomer(_mapPlot->canvas());
66
67 _mapPlot->canvas()->setFocusPolicy(Qt::WheelFocus);
68
69 QwtPlotSvgItem* mapItem = new QwtPlotSvgItem();
70 mapItem->loadFile(QRectF(-180.0, -90.0, 360.0, 180.0), ":world.svg");
71 mapItem->attach(_mapPlot);
72
73 // Buttons
74 // -------
75 int ww = QFontMetrics(font()).width('w');
76
77 _buttonClose = new QPushButton(tr("Close"), this);
78 _buttonClose->setMaximumWidth(10*ww);
79 connect(_buttonClose, SIGNAL(clicked()), this, SLOT(slotClose()));
80
81 _buttonPrint = new QPushButton(tr("Print"), this);
82 _buttonPrint->setMaximumWidth(10*ww);
83 connect(_buttonPrint, SIGNAL(clicked()), this, SLOT(slotPrint()));
84
85 // Layout
86 // ------
87 QHBoxLayout* buttonLayout = new QHBoxLayout;
88 buttonLayout->addWidget(_buttonClose);
89 buttonLayout->addWidget(_buttonPrint);
90
91 QVBoxLayout* mainLayout = new QVBoxLayout(this);
92 mainLayout->addWidget(_mapPlot);
93 mainLayout->addLayout(buttonLayout);
94
95 // Minimal and Maximal Coordinates
96 // -------------------------------
97 _minPointLat = 0.0;
98 _maxPointLat = 0.0;
99 _minPointLon = 0.0;
100 _maxPointLon = 0.0;
101
102 // Important
103 // ---------
104 _mapPlot->replot();
105}
106
107// Destructor
108/////////////////////////////////////////////////////////////////////////////
109t_bncMap::~t_bncMap() {
110 delete _mapPlot;
111}
112
113//
114/////////////////////////////////////////////////////////////////////////////
115void t_bncMap::slotNewPoint(const QString& name, double latDeg, double lonDeg) {
116
117 if (lonDeg > 180.0) lonDeg -= 360.0;
118
119 QColor red(220,20,60);
120 QwtSymbol* symbol = new QwtSymbol(QwtSymbol::Rect, QBrush(red),
121 QPen(red), QSize(2,2));
122 QwtPlotMarker* marker = new QwtPlotMarker();
123 marker->setValue(lonDeg, latDeg);
124 if (lonDeg > 170.0) {
125 marker->setLabelAlignment(Qt::AlignLeft);
126 }
127 else {
128 marker->setLabelAlignment(Qt::AlignRight);
129 }
130 QwtText text(name.left(4));
131 QFont font = text.font();
132 font.setPointSize(font.pointSize()*0.8);
133 text.setFont(font);
134 marker->setLabel(text);
135 marker->setSymbol(symbol);
136 marker->attach(_mapPlot);
137
138 // Remeber minimal and maximal coordinates
139 // ---------------------------------------
140 if (_minPointLat == 0.0 && _maxPointLat == 0.0 &&
141 _minPointLon == 0.0 && _maxPointLon == 0.0) {
142 _minPointLat = latDeg;
143 _maxPointLat = latDeg;
144 _minPointLon = lonDeg;
145 _maxPointLon = lonDeg;
146 }
147 else {
148 if (_maxPointLat < latDeg) {
149 _maxPointLat = latDeg;
150 }
151 else if (_minPointLat > latDeg) {
152 _minPointLat = latDeg;
153 }
154 if (_maxPointLon < lonDeg) {
155 _maxPointLon = lonDeg;
156 }
157 else if (_minPointLon > lonDeg) {
158 _minPointLon = lonDeg;
159 }
160 }
161}
162
163// Close
164////////////////////////////////////////////////////////////////////////////
165void t_bncMap::slotClose() {
166 done(0);
167}
168
169// Close Dialog gracefully
170////////////////////////////////////////////////////////////////////////////
171void t_bncMap::closeEvent(QCloseEvent* event) {
172 QDialog::closeEvent(event);
173}
174
175//
176////////////////////////////////////////////////////////////////////////////
177void t_bncMap::showEvent(QShowEvent* event) {
178 double width = _maxPointLon - _minPointLon;
179 double height = _maxPointLat - _minPointLat;
180 if (width > 0 && height > 0) {
181
182 // Extend plot area by 10 percent
183 // ------------------------------
184 double eps = 0.1;
185 double epsLon = eps * (_maxPointLon - _minPointLon);
186 double epsLat = eps * (_maxPointLat - _minPointLat);
187 double widthExt = width + 2 * epsLon;
188 double heightExt = height + 2 * epsLat;
189 double minLon = _minPointLon - epsLon;
190 double minLat = _minPointLat - epsLat;
191
192 // Keep lat/lon relations
193 // ----------------------
194 double widthBorder = widthExt;
195 double heightBorder = heightExt;
196 double scale = widthExt/heightExt/2.;
197 if ( scale < 1.) {
198 widthBorder = widthExt / scale;
199 minLon = minLon - (widthBorder - widthExt)/2.;
200 }
201 else {
202 heightBorder = heightExt * scale;
203 minLat = minLat - (heightBorder - heightExt)/2.;
204 }
205
206 // Borders shall not exceed min or max values
207 // ------------------------------------------
208 if (minLon < -180.) minLon = -180.;
209 if (minLat < -90.) minLat = -90.;
210 double maxLat = minLat + heightBorder;
211 if ( maxLat > 90) minLat = minLat - (maxLat - 90.);
212 double maxLon = minLon + widthBorder;
213 if ( maxLon > 180) minLon = minLon - (maxLon - 180.);
214
215 // Area large enough to justify world map
216 // --------------------------------------
217 if (widthBorder < 270.0 && heightBorder < 135.0) {
218 QRectF rect(minLon, minLat, widthBorder, heightBorder);
219 _mapPlotZoomer->zoom(rect);
220 }
221 }
222 QDialog::showEvent(event);
223}
224
225// Print the widget
226////////////////////////////////////////////////////////////////////////////
227void t_bncMap::slotPrint() {
228
229 QPrinter printer;
230 QPrintDialog* dialog = new QPrintDialog(&printer, this);
231 dialog->setWindowTitle(tr("Print Map"));
232 if (dialog->exec() != QDialog::Accepted) {
233 return;
234 }
235 else {
236 QwtPlotRenderer renderer;
237 renderer.setDiscardFlag(QwtPlotRenderer::DiscardBackground, false);
238 renderer.setLayoutFlag(QwtPlotRenderer::KeepFrames, true);
239 renderer.renderTo(_mapPlot, printer);
240 }
241}
Note: See TracBrowser for help on using the repository browser.