mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-05 15:34:57 -04:00
Map updates.
Add support for different map types (street/satellite) and different map providers. Support finding real world addresses on the map. Add Maidenhead locator converter. Add Beacons. Allow data sources to be selected by a user. Add context menu to allow setting an object as a target, setting center frequency and adjusting display order.
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2021 Jon Beniston, M7RCE //
|
||||
// //
|
||||
// This program is free software; you can redistribute it and/or modify //
|
||||
// it under the terms of the GNU General Public License as published by //
|
||||
// the Free Software Foundation as version 3 of the License, or //
|
||||
// (at your option) any later version. //
|
||||
// //
|
||||
// This program is distributed in the hope that it will be useful, //
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||
// GNU General Public License V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QDebug>
|
||||
#include <QGeoCoordinate>
|
||||
#include <QGeoCodingManager>
|
||||
#include <QGeoServiceProvider>
|
||||
|
||||
#include "util/units.h"
|
||||
#include "util/maidenhead.h"
|
||||
|
||||
#include "mapmaidenheaddialog.h"
|
||||
#include "maplocationdialog.h"
|
||||
|
||||
MapMaidenheadDialog::MapMaidenheadDialog(QWidget* parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::MapMaidenheadDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
MapMaidenheadDialog::~MapMaidenheadDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void MapMaidenheadDialog::on_address_returnPressed()
|
||||
{
|
||||
QString address = ui->address->text().trimmed();
|
||||
if (!address.isEmpty())
|
||||
{
|
||||
ui->latAndLong->setText("");
|
||||
ui->error->setText("");
|
||||
QGeoServiceProvider* geoSrv = new QGeoServiceProvider("osm");
|
||||
if (geoSrv != nullptr)
|
||||
{
|
||||
QLocale qLocaleC(QLocale::C, QLocale::AnyCountry);
|
||||
geoSrv->setLocale(qLocaleC);
|
||||
QGeoCodeReply *pQGeoCode = geoSrv->geocodingManager()->geocode(address);
|
||||
if (pQGeoCode)
|
||||
QObject::connect(pQGeoCode, &QGeoCodeReply::finished, this, &MapMaidenheadDialog::geoReply);
|
||||
else
|
||||
ui->error->setText("GeoCoding failed");
|
||||
}
|
||||
else
|
||||
ui->error->setText("OpenStreetMap Location services not available");
|
||||
}
|
||||
}
|
||||
|
||||
void MapMaidenheadDialog::on_latAndLong_returnPressed()
|
||||
{
|
||||
float latitude, longitude;
|
||||
QString coords = ui->latAndLong->text();
|
||||
|
||||
if (Units::stringToLatitudeAndLongitude(coords, latitude, longitude))
|
||||
{
|
||||
ui->error->setText("");
|
||||
ui->maidenhead->setText(Maidenhead::toMaidenhead(latitude, longitude));
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->error->setText("Not a valid latitude and longitude");
|
||||
ui->maidenhead->setText("");
|
||||
QApplication::beep();
|
||||
}
|
||||
ui->address->setText("");
|
||||
}
|
||||
|
||||
void MapMaidenheadDialog::on_maidenhead_returnPressed()
|
||||
{
|
||||
float latitude, longitude;
|
||||
QString locator = ui->maidenhead->text();
|
||||
|
||||
if (Maidenhead::fromMaidenhead(locator, latitude, longitude))
|
||||
{
|
||||
ui->error->setText("");
|
||||
ui->latAndLong->setText(QString("%1,%2").arg(latitude).arg(longitude));
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->error->setText("Not a valid Maidenhead locator");
|
||||
ui->latAndLong->setText("");
|
||||
QApplication::beep();
|
||||
}
|
||||
ui->address->setText("");
|
||||
}
|
||||
|
||||
void MapMaidenheadDialog::geoReply()
|
||||
{
|
||||
QGeoCodeReply *pQGeoCode = dynamic_cast<QGeoCodeReply*>(sender());
|
||||
|
||||
if ((pQGeoCode != nullptr) && (pQGeoCode->error() == QGeoCodeReply::NoError))
|
||||
{
|
||||
QList<QGeoLocation> qGeoLocs = pQGeoCode->locations();
|
||||
if (qGeoLocs.size() == 0)
|
||||
{
|
||||
ui->error->setText("No location found for address");
|
||||
QApplication::beep();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (qGeoLocs.size() == 1)
|
||||
{
|
||||
QGeoCoordinate c = qGeoLocs.at(0).coordinate();
|
||||
ui->latAndLong->setText(QString("%1,%2").arg(c.latitude()).arg(c.longitude()));
|
||||
ui->maidenhead->setText(Maidenhead::toMaidenhead(c.latitude(), c.longitude()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Show dialog allowing user to select from the results
|
||||
MapLocationDialog dialog(qGeoLocs, this);
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
QGeoCoordinate c = dialog.m_selectedLocation.coordinate();
|
||||
ui->latAndLong->setText(QString("%1,%2").arg(c.latitude()).arg(c.longitude()));
|
||||
ui->maidenhead->setText(Maidenhead::toMaidenhead(c.latitude(), c.longitude()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ui->error->setText(QString("GeoCode error: %1").arg(pQGeoCode->error()));
|
||||
pQGeoCode->deleteLater();
|
||||
}
|
||||
|
||||
// Use a custom close button, so pressing enter doesn't close the dialog
|
||||
void MapMaidenheadDialog::on_close_clicked()
|
||||
{
|
||||
QDialog::accept();
|
||||
}
|
||||
Reference in New Issue
Block a user