Commit b6edd922 authored by DonLakeFlyer's avatar DonLakeFlyer

Support for detailed Geo and UTM position editing

parent 9a74c077
...@@ -487,8 +487,9 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin { ...@@ -487,8 +487,9 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin {
HEADERS += \ HEADERS += \
src/AnalyzeView/ExifParser.h \ src/AnalyzeView/ExifParser.h \
src/AnalyzeView/ULogParser.h \ src/AnalyzeView/LogDownloadController.h \
src/AnalyzeView/PX4LogParser.h \ src/AnalyzeView/PX4LogParser.h \
src/AnalyzeView/ULogParser.h \
src/Audio/AudioOutput.h \ src/Audio/AudioOutput.h \
src/Camera/QGCCameraControl.h \ src/Camera/QGCCameraControl.h \
src/Camera/QGCCameraIO.h \ src/Camera/QGCCameraIO.h \
...@@ -553,6 +554,7 @@ HEADERS += \ ...@@ -553,6 +554,7 @@ HEADERS += \
src/QGCToolbox.h \ src/QGCToolbox.h \
src/QmlControls/AppMessages.h \ src/QmlControls/AppMessages.h \
src/QmlControls/CoordinateVector.h \ src/QmlControls/CoordinateVector.h \
src/QmlControls/EditPositionDialogController.h \
src/QmlControls/MavlinkQmlSingleton.h \ src/QmlControls/MavlinkQmlSingleton.h \
src/QmlControls/ParameterEditorController.h \ src/QmlControls/ParameterEditorController.h \
src/QmlControls/QGCFileDialogController.h \ src/QmlControls/QGCFileDialogController.h \
...@@ -586,7 +588,7 @@ HEADERS += \ ...@@ -586,7 +588,7 @@ HEADERS += \
src/uas/UAS.h \ src/uas/UAS.h \
src/uas/UASInterface.h \ src/uas/UASInterface.h \
src/uas/UASMessageHandler.h \ src/uas/UASMessageHandler.h \
src/AnalyzeView/LogDownloadController.h \ src/UTM.h \
AndroidBuild { AndroidBuild {
HEADERS += \ HEADERS += \
...@@ -679,8 +681,9 @@ AndroidBuild { ...@@ -679,8 +681,9 @@ AndroidBuild {
SOURCES += \ SOURCES += \
src/AnalyzeView/ExifParser.cc \ src/AnalyzeView/ExifParser.cc \
src/AnalyzeView/ULogParser.cc \ src/AnalyzeView/LogDownloadController.cc \
src/AnalyzeView/PX4LogParser.cc \ src/AnalyzeView/PX4LogParser.cc \
src/AnalyzeView/ULogParser.cc \
src/Audio/AudioOutput.cc \ src/Audio/AudioOutput.cc \
src/Camera/QGCCameraControl.cc \ src/Camera/QGCCameraControl.cc \
src/Camera/QGCCameraIO.cc \ src/Camera/QGCCameraIO.cc \
...@@ -741,6 +744,7 @@ SOURCES += \ ...@@ -741,6 +744,7 @@ SOURCES += \
src/QGCToolbox.cc \ src/QGCToolbox.cc \
src/QmlControls/AppMessages.cc \ src/QmlControls/AppMessages.cc \
src/QmlControls/CoordinateVector.cc \ src/QmlControls/CoordinateVector.cc \
src/QmlControls/EditPositionDialogController.cc \
src/QmlControls/ParameterEditorController.cc \ src/QmlControls/ParameterEditorController.cc \
src/QmlControls/QGCFileDialogController.cc \ src/QmlControls/QGCFileDialogController.cc \
src/QmlControls/QGCImageProvider.cc \ src/QmlControls/QGCImageProvider.cc \
...@@ -772,7 +776,7 @@ SOURCES += \ ...@@ -772,7 +776,7 @@ SOURCES += \
src/main.cc \ src/main.cc \
src/uas/UAS.cc \ src/uas/UAS.cc \
src/uas/UASMessageHandler.cc \ src/uas/UASMessageHandler.cc \
src/AnalyzeView/LogDownloadController.cc \ src/UTM.cpp \
DebugBuild { DebugBuild {
SOURCES += \ SOURCES += \
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
<file alias="QGroundControl/Controls/CameraSection.qml">src/PlanView/CameraSection.qml</file> <file alias="QGroundControl/Controls/CameraSection.qml">src/PlanView/CameraSection.qml</file>
<file alias="QGroundControl/Controls/ClickableColor.qml">src/QmlControls/ClickableColor.qml</file> <file alias="QGroundControl/Controls/ClickableColor.qml">src/QmlControls/ClickableColor.qml</file>
<file alias="QGroundControl/Controls/DropButton.qml">src/QmlControls/DropButton.qml</file> <file alias="QGroundControl/Controls/DropButton.qml">src/QmlControls/DropButton.qml</file>
<file alias="QGroundControl/Controls/EditPositionDialog.qml">src/QmlControls/EditPositionDialog.qml</file>
<file alias="QGroundControl/Controls/ExclusiveGroupItem.qml">src/QmlControls/ExclusiveGroupItem.qml</file> <file alias="QGroundControl/Controls/ExclusiveGroupItem.qml">src/QmlControls/ExclusiveGroupItem.qml</file>
<file alias="QGroundControl/Controls/FactSliderPanel.qml">src/QmlControls/FactSliderPanel.qml</file> <file alias="QGroundControl/Controls/FactSliderPanel.qml">src/QmlControls/FactSliderPanel.qml</file>
<file alias="QGroundControl/Controls/FileButton.qml">src/QmlControls/FileButton.qml</file> <file alias="QGroundControl/Controls/FileButton.qml">src/QmlControls/FileButton.qml</file>
...@@ -211,6 +212,7 @@ ...@@ -211,6 +212,7 @@
<file alias="CameraSpec.FactMetaData.json">src/MissionManager/CameraSpec.FactMetaData.json</file> <file alias="CameraSpec.FactMetaData.json">src/MissionManager/CameraSpec.FactMetaData.json</file>
<file alias="SpeedSection.FactMetaData.json">src/MissionManager/SpeedSection.FactMetaData.json</file> <file alias="SpeedSection.FactMetaData.json">src/MissionManager/SpeedSection.FactMetaData.json</file>
<file alias="MissionSettings.FactMetaData.json">src/MissionManager/MissionSettings.FactMetaData.json</file> <file alias="MissionSettings.FactMetaData.json">src/MissionManager/MissionSettings.FactMetaData.json</file>
<file alias="EditPositionDialog.FactMetaData.json">src/QmlControls/EditPositionDialog.FactMetaData.json</file>
<file alias="Vehicle/VehicleFact.json">src/Vehicle/VehicleFact.json</file> <file alias="Vehicle/VehicleFact.json">src/Vehicle/VehicleFact.json</file>
<file alias="Vehicle/BatteryFact.json">src/Vehicle/BatteryFact.json</file> <file alias="Vehicle/BatteryFact.json">src/Vehicle/BatteryFact.json</file>
<file alias="Vehicle/GPSFact.json">src/Vehicle/GPSFact.json</file> <file alias="Vehicle/GPSFact.json">src/Vehicle/GPSFact.json</file>
......
...@@ -11,6 +11,7 @@ import QtQuick 2.3 ...@@ -11,6 +11,7 @@ import QtQuick 2.3
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtLocation 5.3 import QtLocation 5.3
import QtPositioning 5.3 import QtPositioning 5.3
import QtQuick.Dialogs 1.2
import QGroundControl 1.0 import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
...@@ -378,6 +379,15 @@ Item { ...@@ -378,6 +379,15 @@ Item {
} }
} }
Component {
id: editPositionDialog
EditPositionDialog {
coordinate: mapPolygon.center
onCoordinateChanged: mapPolygon.center = coordinate
}
}
Component { Component {
id: centerDragAreaComponent id: centerDragAreaComponent
...@@ -412,6 +422,12 @@ Item { ...@@ -412,6 +422,12 @@ Item {
onTriggered: radiusDialog.visible = true onTriggered: radiusDialog.visible = true
} }
MenuItem {
text: qsTr("Edit position..." )
enabled: _circle
onTriggered: qgcView.showDialog(editPositionDialog, qsTr("Edit Position"), qgcView.showDialogDefaultWidth, StandardButton.Cancel)
}
MenuItem { MenuItem {
text: qsTr("Load KML...") text: qsTr("Load KML...")
onTriggered: kmlLoadDialog.openForLoad() onTriggered: kmlLoadDialog.openForLoad()
......
...@@ -62,6 +62,15 @@ Rectangle { ...@@ -62,6 +62,15 @@ Rectangle {
} }
} }
Component {
id: editPositionDialog
EditPositionDialog {
coordinate: missionItem.coordinate
onCoordinateChanged: missionItem.coordinate = coordinate
}
}
QGCLabel { QGCLabel {
id: label id: label
anchors.verticalCenter: commandPicker.verticalCenter anchors.verticalCenter: commandPicker.verticalCenter
...@@ -136,6 +145,12 @@ Rectangle { ...@@ -136,6 +145,12 @@ Rectangle {
visible: !_waypointsOnlyMode visible: !_waypointsOnlyMode
} }
MenuItem {
text: qsTr("Edit position...")
visible: missionItem.specifiesCoordinate
onTriggered: qgcView.showDialog(editPositionDialog, qsTr("Edit Position"), qgcView.showDialogDefaultWidth, StandardButton.Cancel)
}
MenuSeparator { MenuSeparator {
visible: missionItem.isSimpleItem && !_waypointsOnlyMode visible: missionItem.isSimpleItem && !_waypointsOnlyMode
} }
......
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
#include "QGCCameraManager.h" #include "QGCCameraManager.h"
#include "CameraCalc.h" #include "CameraCalc.h"
#include "VisualMissionItem.h" #include "VisualMissionItem.h"
#include "EditPositionDialogController.h"
#ifndef NO_SERIAL_LINK #ifndef NO_SERIAL_LINK
#include "SerialLink.h" #include "SerialLink.h"
...@@ -379,6 +380,7 @@ void QGCApplication::_initCommon(void) ...@@ -379,6 +380,7 @@ void QGCApplication::_initCommon(void)
qmlRegisterType<JoystickConfigController> ("QGroundControl.Controllers", 1, 0, "JoystickConfigController"); qmlRegisterType<JoystickConfigController> ("QGroundControl.Controllers", 1, 0, "JoystickConfigController");
qmlRegisterType<LogDownloadController> ("QGroundControl.Controllers", 1, 0, "LogDownloadController"); qmlRegisterType<LogDownloadController> ("QGroundControl.Controllers", 1, 0, "LogDownloadController");
qmlRegisterType<SyslinkComponentController> ("QGroundControl.Controllers", 1, 0, "SyslinkComponentController"); qmlRegisterType<SyslinkComponentController> ("QGroundControl.Controllers", 1, 0, "SyslinkComponentController");
qmlRegisterType<EditPositionDialogController> ("QGroundControl.Controllers", 1, 0, "EditPositionDialogController");
#ifndef __mobile__ #ifndef __mobile__
qmlRegisterType<ViewWidgetController> ("QGroundControl.Controllers", 1, 0, "ViewWidgetController"); qmlRegisterType<ViewWidgetController> ("QGroundControl.Controllers", 1, 0, "ViewWidgetController");
qmlRegisterType<CustomCommandWidgetController> ("QGroundControl.Controllers", 1, 0, "CustomCommandWidgetController"); qmlRegisterType<CustomCommandWidgetController> ("QGroundControl.Controllers", 1, 0, "CustomCommandWidgetController");
......
...@@ -7,11 +7,13 @@ ...@@ -7,11 +7,13 @@
* *
****************************************************************************/ ****************************************************************************/
#include <QDebug>
#include <cmath> #include <cmath>
#include <limits> #include <limits>
#include "QGCGeo.h" #include "QGCGeo.h"
#include "UTM.h"
// These defines are private // These defines are private
#define M_DEG_TO_RAD (M_PI / 180.0) #define M_DEG_TO_RAD (M_PI / 180.0)
...@@ -81,3 +83,16 @@ void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCo ...@@ -81,3 +83,16 @@ void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCo
coord->setAltitude(-z + origin.altitude()); coord->setAltitude(-z + origin.altitude());
} }
int convertGeoToUTM(const QGeoCoordinate& coord, double& easting, double& northing)
{
return LatLonToUTMXY(coord.latitude(), coord.longitude(), -1 /* zone */, easting, northing);
}
void convertUTMToGeo(double easting, double northing, int zone, bool southhemi, QGeoCoordinate& coord)
{
double latRadians, lonRadians;
UTMXYToLatLon (easting, northing, zone, southhemi, latRadians, lonRadians);
coord.setLatitude(RadToDeg(latRadians));
coord.setLongitude(RadToDeg(lonRadians));
}
...@@ -41,4 +41,44 @@ void convertGeoToNed(QGeoCoordinate coord, QGeoCoordinate origin, double* x, dou ...@@ -41,4 +41,44 @@ void convertGeoToNed(QGeoCoordinate coord, QGeoCoordinate origin, double* x, dou
*/ */
void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCoordinate *coord); void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCoordinate *coord);
// LatLonToUTMXY
// Converts a latitude/longitude pair to x and y coordinates in the
// Universal Transverse Mercator projection.
//
// Inputs:
// lat - Latitude of the point, in radians.
// lon - Longitude of the point, in radians.
// zone - UTM zone to be used for calculating values for x and y.
// If zone is less than 1 or greater than 60, the routine
// will determine the appropriate zone from the value of lon.
//
// Outputs:
// x - The x coordinate (easting) of the computed point. (in meters)
// y - The y coordinate (northing) of the computed point. (in meters)
//
// Returns:
// The UTM zone used for calculating the values of x and y.
int convertGeoToUTM(const QGeoCoordinate& coord, double& easting, double& northing);
// UTMXYToLatLon
//
// Converts x and y coordinates in the Universal Transverse Mercator// The UTM zone parameter should be in the range [1,60].
// projection to a latitude/longitude pair.
//
// Inputs:
// x - The easting of the point, in meters.
// y - The northing of the point, in meters.
// zone - The UTM zone in which the point lies.
// southhemi - True if the point is in the southern hemisphere;
// false otherwise.
//
// Outputs:
// lat - The latitude of the point, in radians.
// lon - The longitude of the point, in radians.
//
// Returns:
// The function does not return a value.
void convertUTMToGeo(double easting, double northing, int zone, bool southhemi, QGeoCoordinate& coord);
#endif // QGCGEO_H #endif // QGCGEO_H
[
{
"name": "Latitude",
"shortDescription": "Latitude of item position",
"type": "double",
"min": -90.0,
"max": 90.0,
"decimalPlaces": 7
},
{
"name": "Longitude",
"shortDescription": "Longitude of item position",
"type": "double",
"min": -180.0,
"max": 180.0,
"decimalPlaces": 7
},
{
"name": "Easting",
"shortDescription": "Easting of item position",
"type": "double",
"decimalPlaces": 7
},
{
"name": "Northing",
"shortDescription": "Northing of item position",
"type": "double",
"decimalPlaces": 7
},
{
"name": "Zone",
"shortDescription": "UTM zone",
"type": "uint8",
"min": 1,
"max": 60
},
{
"name": "Hemisphere",
"shortDescription": "Hemisphere for position",
"type": "uint8",
"enumStrings": "North,South",
"enumValues": "0,1"
}
]
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.2
import QGroundControl 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controllers 1.0
QGCViewDialog {
property alias coordinate: controller.coordinate
property real _margin: ScreenTools.defaultFontPixelWidth / 2
property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5
EditPositionDialogController {
id: controller
Component.onCompleted: initValues()
}
QGCFlickable {
anchors.fill: parent
contentHeight: column.height
Column {
id: column
anchors.left: parent.left
anchors.right: parent.right
spacing: ScreenTools.defaultFontPixelHeight
GridLayout {
anchors.left: parent.left
anchors.right: parent.right
columnSpacing: _margin
rowSpacing: _margin
columns: 2
QGCLabel { text: qsTr("Latitude") }
FactTextField {
fact: controller.latitude
Layout.fillWidth: true
}
QGCLabel { text: qsTr("Longitude") }
FactTextField {
fact: controller.longitude
Layout.fillWidth: true
}
}
QGCButton {
anchors.right: parent.right
text: qsTr("Set Geographic")
onClicked: {
controller.setFromGeo()
reject()
}
}
GridLayout {
anchors.left: parent.left
anchors.right: parent.right
columnSpacing: _margin
rowSpacing: _margin
columns: 2
QGCLabel { text: qsTr("Zone") }
FactTextField {
fact: controller.zone
Layout.fillWidth: true
}
QGCLabel { text: qsTr("Hemisphere") }
FactComboBox {
fact: controller.hemisphere
indexModel: false
Layout.fillWidth: true
}
QGCLabel { text: qsTr("Easting") }
FactTextField {
fact: controller.easting
Layout.fillWidth: true
}
QGCLabel { text: qsTr("Northing") }
FactTextField {
fact: controller.northing
Layout.fillWidth: true
}
}
QGCButton {
anchors.right: parent.right
text: qsTr("Set UTM")
onClicked: {
controller.setFromUTM()
reject()
}
}
} // Column
} // QGCFlickable
} // QGCViewDialog
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include "EditPositionDialogController.h"
#include "QGCGeo.h"
const char* EditPositionDialogController::_latitudeFactName = "Latitude";
const char* EditPositionDialogController::_longitudeFactName = "Longitude";
const char* EditPositionDialogController::_zoneFactName = "Zone";
const char* EditPositionDialogController::_hemisphereFactName = "Hemisphere";
const char* EditPositionDialogController::_eastingFactName = "Easting";
const char* EditPositionDialogController::_northingFactName = "Northing";
QMap<QString, FactMetaData*> EditPositionDialogController::_metaDataMap;
EditPositionDialogController::EditPositionDialogController(void)
: _latitudeFact (0, _latitudeFactName, FactMetaData::valueTypeDouble)
, _longitudeFact (0, _longitudeFactName, FactMetaData::valueTypeDouble)
, _zoneFact (0, _zoneFactName, FactMetaData::valueTypeUint8)
, _hemisphereFact (0, _hemisphereFactName, FactMetaData::valueTypeUint8)
, _eastingFact (0, _eastingFactName, FactMetaData::valueTypeDouble)
, _northingFact (0, _northingFactName, FactMetaData::valueTypeDouble)
{
if (_metaDataMap.isEmpty()) {
_metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/EditPositionDialog.FactMetaData.json"), NULL /* QObject parent */);
}
_latitudeFact.setMetaData (_metaDataMap[_latitudeFactName]);
_longitudeFact.setMetaData (_metaDataMap[_longitudeFactName]);
_zoneFact.setMetaData (_metaDataMap[_zoneFactName]);
_hemisphereFact.setMetaData (_metaDataMap[_hemisphereFactName]);
_eastingFact.setMetaData (_metaDataMap[_eastingFactName]);
_northingFact.setMetaData (_metaDataMap[_northingFactName]);
}
void EditPositionDialogController::setCoordinate(QGeoCoordinate coordinate)
{
if (coordinate != _coordinate) {
_coordinate = coordinate;
emit coordinateChanged(coordinate);
}
}
void EditPositionDialogController::initValues(void)
{
_latitudeFact.setRawValue(_coordinate.latitude());
_longitudeFact.setRawValue(_coordinate.longitude());
double easting, northing;
int zone = convertGeoToUTM(_coordinate, easting, northing);
_zoneFact.setRawValue(zone);
_hemisphereFact.setRawValue(_coordinate.latitude() < 0);
_eastingFact.setRawValue(easting);
_northingFact.setRawValue(northing);
}
void EditPositionDialogController::setFromGeo(void)
{
_coordinate.setLatitude(_latitudeFact.rawValue().toDouble());
_coordinate.setLongitude(_longitudeFact.rawValue().toDouble());
emit coordinateChanged(_coordinate);
}
void EditPositionDialogController::setFromUTM(void)
{
qDebug() << _eastingFact.rawValue().toDouble() << _northingFact.rawValue().toDouble() << _zoneFact.rawValue().toInt() << (_hemisphereFact.rawValue().toInt() == 1);
convertUTMToGeo(_eastingFact.rawValue().toDouble(), _northingFact.rawValue().toDouble(), _zoneFact.rawValue().toInt(), _hemisphereFact.rawValue().toInt() == 1, _coordinate);
qDebug() << _eastingFact.rawValue().toDouble() << _northingFact.rawValue().toDouble() << _zoneFact.rawValue().toInt() << (_hemisphereFact.rawValue().toInt() == 1) << _coordinate;
emit coordinateChanged(_coordinate);
}
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#pragma once
#include <QObject>
#include <QGeoCoordinate>
#include "FactSystem.h"
class EditPositionDialogController : public QObject
{
Q_OBJECT
public:
EditPositionDialogController(void);
Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged)
Q_PROPERTY(Fact* latitude READ latitude CONSTANT)
Q_PROPERTY(Fact* longitude READ longitude CONSTANT)
Q_PROPERTY(Fact* zone READ zone CONSTANT)
Q_PROPERTY(Fact* hemisphere READ hemisphere CONSTANT)
Q_PROPERTY(Fact* easting READ easting CONSTANT)
Q_PROPERTY(Fact* northing READ northing CONSTANT)
QGeoCoordinate coordinate(void) const { return _coordinate; }
Fact* latitude (void) { return &_latitudeFact; }
Fact* longitude (void) { return &_longitudeFact; }
Fact* zone (void) { return &_zoneFact; }
Fact* hemisphere(void) { return &_hemisphereFact; }
Fact* easting (void) { return &_eastingFact; }
Fact* northing (void) { return &_northingFact; }
void setCoordinate(QGeoCoordinate coordinate);
Q_INVOKABLE void initValues(void);
Q_INVOKABLE void setFromGeo(void);
Q_INVOKABLE void setFromUTM(void);
signals:
void coordinateChanged(QGeoCoordinate coordinate);
private:
static QMap<QString, FactMetaData*> _metaDataMap;
QGeoCoordinate _coordinate;
Fact _latitudeFact;
Fact _longitudeFact;
Fact _zoneFact;
Fact _hemisphereFact;
Fact _eastingFact;
Fact _northingFact;
static const char* _latitudeFactName;
static const char* _longitudeFactName;
static const char* _zoneFactName;
static const char* _hemisphereFactName;
static const char* _eastingFactName;
static const char* _northingFactName;
};
...@@ -7,6 +7,7 @@ CameraSection 1.0 CameraSection.qml ...@@ -7,6 +7,7 @@ CameraSection 1.0 CameraSection.qml
ClickableColor 1.0 ClickableColor.qml ClickableColor 1.0 ClickableColor.qml
DropButton 1.0 DropButton.qml DropButton 1.0 DropButton.qml
DropPanel 1.0 DropPanel.qml DropPanel 1.0 DropPanel.qml
EditPositionDialog 1.0 EditPositionDialog.qml
ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml
FactSliderPanel 1.0 FactSliderPanel.qml FactSliderPanel 1.0 FactSliderPanel.qml
FileButton 1.0 FileButton.qml FileButton 1.0 FileButton.qml
......
This diff is collapsed.
// UTM.h
// Original Javascript by Chuck Taylor
// Port to C++ by Alex Hajnal
//
// *** THIS CODE USES 32-BIT FLOATS BY DEFAULT ***
// *** For 64-bit double-precision edit this file: undefine FLOAT_32 and define FLOAT_64 (see below)
//
// This is a simple port of the code on the Geographic/UTM Coordinate Converter (1) page from Javascript to C++.
// Using this you can easily convert between UTM and WGS84 (latitude and longitude).
// Accuracy seems to be around 50cm (I suspect rounding errors are limiting precision).
// This code is provided as-is and has been minimally tested; enjoy but use at your own risk!
// The license for UTM.cpp and UTM.h is the same as the original Javascript:
// "The C++ source code in UTM.cpp and UTM.h may be copied and reused without restriction."
//
// 1) http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html
#ifndef UTM_H
#define UTM_H
// Choose floating point precision:
// 32-bit (for Teensy 3.5/3.6 ARM boards, etc.)
#define FLOAT_64
// 64-bit (for desktop/server use)
//#define FLOAT_64
#ifdef FLOAT_64
#define FLOAT double
#define SIN sin
#define COS cos
#define TAN tan
#define POW pow
#define SQRT sqrt
#define FLOOR floor
#else
#ifdef FLOAT_32
#define FLOAT float
#define SIN sinf
#define COS cosf
#define TAN tanf
#define POW powf
#define SQRT sqrtf
#define FLOOR floorf
#endif
#endif
#include <math.h>
#define pi 3.14159265358979
/* Ellipsoid model constants (actual values here are for WGS84) */
#define sm_a 6378137.0
#define sm_b 6356752.314
#define sm_EccSquared 6.69437999013e-03
#define UTMScaleFactor 0.9996
// DegToRad
// Converts degrees to radians.
FLOAT DegToRad(FLOAT deg);
// RadToDeg
// Converts radians to degrees.
FLOAT RadToDeg(FLOAT rad);
// ArcLengthOfMeridian
// Computes the ellipsoidal distance from the equator to a point at a
// given latitude.
//
// Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
// GPS: Theory and Practice, 3rd ed. New York: Springer-Verlag Wien, 1994.
//
// Inputs:
// phi - Latitude of the point, in radians.
//
// Globals:
// sm_a - Ellipsoid model major axis.
// sm_b - Ellipsoid model minor axis.
//
// Returns:
// The ellipsoidal distance of the point from the equator, in meters.
FLOAT ArcLengthOfMeridian (FLOAT phi);
// UTMCentralMeridian
// Determines the central meridian for the given UTM zone.
//
// Inputs:
// zone - An integer value designating the UTM zone, range [1,60].
//
// Returns:
// The central meridian for the given UTM zone, in radians
// Range of the central meridian is the radian equivalent of [-177,+177].
FLOAT UTMCentralMeridian(int zone);
// FootpointLatitude
//
// Computes the footpoint latitude for use in converting transverse
// Mercator coordinates to ellipsoidal coordinates.
//
// Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
// GPS: Theory and Practice, 3rd ed. New York: Springer-Verlag Wien, 1994.
//
// Inputs:
// y - The UTM northing coordinate, in meters.
//
// Returns:
// The footpoint latitude, in radians.
FLOAT FootpointLatitude(FLOAT y);
// MapLatLonToXY
// Converts a latitude/longitude pair to x and y coordinates in the
// Transverse Mercator projection. Note that Transverse Mercator is not
// the same as UTM; a scale factor is required to convert between them.
//
// Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
// GPS: Theory and Practice, 3rd ed. New York: Springer-Verlag Wien, 1994.
//
// Inputs:
// phi - Latitude of the point, in radians.
// lambda - Longitude of the point, in radians.
// lambda0 - Longitude of the central meridian to be used, in radians.
//
// Outputs:
// x - The x coordinate of the computed point.
// y - The y coordinate of the computed point.
//
// Returns:
// The function does not return a value.
void MapLatLonToXY (FLOAT phi, FLOAT lambda, FLOAT lambda0, FLOAT &x, FLOAT &y);
// MapXYToLatLon
// Converts x and y coordinates in the Transverse Mercator projection to
// a latitude/longitude pair. Note that Transverse Mercator is not
// the same as UTM; a scale factor is required to convert between them.
//
// Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
// GPS: Theory and Practice, 3rd ed. New York: Springer-Verlag Wien, 1994.
//
// Inputs:
// x - The easting of the point, in meters.
// y - The northing of the point, in meters.
// lambda0 - Longitude of the central meridian to be used, in radians.
//
// Outputs:
// phi - Latitude in radians.
// lambda - Longitude in radians.
//
// Returns:
// The function does not return a value.
//
// Remarks:
// The local variables Nf, nuf2, tf, and tf2 serve the same purpose as
// N, nu2, t, and t2 in MapLatLonToXY, but they are computed with respect
// to the footpoint latitude phif.
//
// x1frac, x2frac, x2poly, x3poly, etc. are to enhance readability and
// to optimize computations.
void MapXYToLatLon (FLOAT x, FLOAT y, FLOAT lambda0, FLOAT& phi, FLOAT& lambda);
// LatLonToUTMXY
// Converts a latitude/longitude pair to x and y coordinates in the
// Universal Transverse Mercator projection.
//
// Inputs:
// lat - Latitude of the point, in radians.
// lon - Longitude of the point, in radians.
// zone - UTM zone to be used for calculating values for x and y.
// If zone is less than 1 or greater than 60, the routine
// will determine the appropriate zone from the value of lon.
//
// Outputs:
// x - The x coordinate (easting) of the computed point. (in meters)
// y - The y coordinate (northing) of the computed point. (in meters)
//
// Returns:
// The UTM zone used for calculating the values of x and y.
int LatLonToUTMXY (FLOAT lat, FLOAT lon, int zone, FLOAT& x, FLOAT& y);
// UTMXYToLatLon
//
// Converts x and y coordinates in the Universal Transverse Mercator// The UTM zone parameter should be in the range [1,60].
// projection to a latitude/longitude pair.
//
// Inputs:
// x - The easting of the point, in meters.
// y - The northing of the point, in meters.
// zone - The UTM zone in which the point lies.
// southhemi - True if the point is in the southern hemisphere;
// false otherwise.
//
// Outputs:
// lat - The latitude of the point, in radians.
// lon - The longitude of the point, in radians.
//
// Returns:
// The function does not return a value.
void UTMXYToLatLon (FLOAT x, FLOAT y, int zone, bool southhemi, FLOAT& lat, FLOAT& lon);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment