Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
b6edd922
Commit
b6edd922
authored
Dec 13, 2017
by
DonLakeFlyer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support for detailed Geo and UTM position editing
parent
9a74c077
Changes
14
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1030 additions
and
4 deletions
+1030
-4
qgroundcontrol.pro
qgroundcontrol.pro
+8
-4
qgroundcontrol.qrc
qgroundcontrol.qrc
+2
-0
QGCMapPolygonVisuals.qml
src/MissionManager/QGCMapPolygonVisuals.qml
+16
-0
MissionItemEditor.qml
src/PlanView/MissionItemEditor.qml
+15
-0
QGCApplication.cc
src/QGCApplication.cc
+2
-0
QGCGeo.cc
src/QGCGeo.cc
+15
-0
QGCGeo.h
src/QGCGeo.h
+40
-0
EditPositionDialog.FactMetaData.json
src/QmlControls/EditPositionDialog.FactMetaData.json
+44
-0
EditPositionDialog.qml
src/QmlControls/EditPositionDialog.qml
+117
-0
EditPositionDialogController.cc
src/QmlControls/EditPositionDialogController.cc
+76
-0
EditPositionDialogController.h
src/QmlControls/EditPositionDialogController.h
+67
-0
QGroundControl.Controls.qmldir
src/QmlControls/QGroundControl.Controls.qmldir
+1
-0
UTM.cpp
src/UTM.cpp
+421
-0
UTM.h
src/UTM.h
+206
-0
No files found.
qgroundcontrol.pro
View file @
b6edd922
...
...
@@ -487,8 +487,9 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin {
HEADERS
+=
\
src
/
AnalyzeView
/
ExifParser
.
h
\
src
/
AnalyzeView
/
ULogPars
er
.
h
\
src
/
AnalyzeView
/
LogDownloadControll
er
.
h
\
src
/
AnalyzeView
/
PX4LogParser
.
h
\
src
/
AnalyzeView
/
ULogParser
.
h
\
src
/
Audio
/
AudioOutput
.
h
\
src
/
Camera
/
QGCCameraControl
.
h
\
src
/
Camera
/
QGCCameraIO
.
h
\
...
...
@@ -553,6 +554,7 @@ HEADERS += \
src
/
QGCToolbox
.
h
\
src
/
QmlControls
/
AppMessages
.
h
\
src
/
QmlControls
/
CoordinateVector
.
h
\
src
/
QmlControls
/
EditPositionDialogController
.
h
\
src
/
QmlControls
/
MavlinkQmlSingleton
.
h
\
src
/
QmlControls
/
ParameterEditorController
.
h
\
src
/
QmlControls
/
QGCFileDialogController
.
h
\
...
...
@@ -586,7 +588,7 @@ HEADERS += \
src
/
uas
/
UAS
.
h
\
src
/
uas
/
UASInterface
.
h
\
src
/
uas
/
UASMessageHandler
.
h
\
src
/
AnalyzeView
/
LogDownloadController
.
h
\
src
/
UTM
.
h
\
AndroidBuild
{
HEADERS
+=
\
...
...
@@ -679,8 +681,9 @@ AndroidBuild {
SOURCES
+=
\
src
/
AnalyzeView
/
ExifParser
.
cc
\
src
/
AnalyzeView
/
ULogPars
er
.
cc
\
src
/
AnalyzeView
/
LogDownloadControll
er
.
cc
\
src
/
AnalyzeView
/
PX4LogParser
.
cc
\
src
/
AnalyzeView
/
ULogParser
.
cc
\
src
/
Audio
/
AudioOutput
.
cc
\
src
/
Camera
/
QGCCameraControl
.
cc
\
src
/
Camera
/
QGCCameraIO
.
cc
\
...
...
@@ -741,6 +744,7 @@ SOURCES += \
src
/
QGCToolbox
.
cc
\
src
/
QmlControls
/
AppMessages
.
cc
\
src
/
QmlControls
/
CoordinateVector
.
cc
\
src
/
QmlControls
/
EditPositionDialogController
.
cc
\
src
/
QmlControls
/
ParameterEditorController
.
cc
\
src
/
QmlControls
/
QGCFileDialogController
.
cc
\
src
/
QmlControls
/
QGCImageProvider
.
cc
\
...
...
@@ -772,7 +776,7 @@ SOURCES += \
src
/
main
.
cc
\
src
/
uas
/
UAS
.
cc
\
src
/
uas
/
UASMessageHandler
.
cc
\
src
/
AnalyzeView
/
LogDownloadController
.
cc
\
src
/
UTM
.
cpp
\
DebugBuild
{
SOURCES
+=
\
...
...
qgroundcontrol.qrc
View file @
b6edd922
...
...
@@ -48,6 +48,7 @@
<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/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/FactSliderPanel.qml">src/QmlControls/FactSliderPanel.qml</file>
<file alias="QGroundControl/Controls/FileButton.qml">src/QmlControls/FileButton.qml</file>
...
...
@@ -211,6 +212,7 @@
<file alias="CameraSpec.FactMetaData.json">src/MissionManager/CameraSpec.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="EditPositionDialog.FactMetaData.json">src/QmlControls/EditPositionDialog.FactMetaData.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/GPSFact.json">src/Vehicle/GPSFact.json</file>
...
...
src/MissionManager/QGCMapPolygonVisuals.qml
View file @
b6edd922
...
...
@@ -11,6 +11,7 @@ import QtQuick 2.3
import
QtQuick
.
Controls
1.2
import
QtLocation
5.3
import
QtPositioning
5.3
import
QtQuick
.
Dialogs
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
...
...
@@ -378,6 +379,15 @@ Item {
}
}
Component
{
id
:
editPositionDialog
EditPositionDialog
{
coordinate
:
mapPolygon
.
center
onCoordinateChanged
:
mapPolygon
.
center
=
coordinate
}
}
Component
{
id
:
centerDragAreaComponent
...
...
@@ -412,6 +422,12 @@ Item {
onTriggered
:
radiusDialog
.
visible
=
true
}
MenuItem
{
text
:
qsTr
(
"
Edit position...
"
)
enabled
:
_circle
onTriggered
:
qgcView
.
showDialog
(
editPositionDialog
,
qsTr
(
"
Edit Position
"
),
qgcView
.
showDialogDefaultWidth
,
StandardButton
.
Cancel
)
}
MenuItem
{
text
:
qsTr
(
"
Load KML...
"
)
onTriggered
:
kmlLoadDialog
.
openForLoad
()
...
...
src/PlanView/MissionItemEditor.qml
View file @
b6edd922
...
...
@@ -62,6 +62,15 @@ Rectangle {
}
}
Component
{
id
:
editPositionDialog
EditPositionDialog
{
coordinate
:
missionItem
.
coordinate
onCoordinateChanged
:
missionItem
.
coordinate
=
coordinate
}
}
QGCLabel
{
id
:
label
anchors.verticalCenter
:
commandPicker
.
verticalCenter
...
...
@@ -136,6 +145,12 @@ Rectangle {
visible
:
!
_waypointsOnlyMode
}
MenuItem
{
text
:
qsTr
(
"
Edit position...
"
)
visible
:
missionItem
.
specifiesCoordinate
onTriggered
:
qgcView
.
showDialog
(
editPositionDialog
,
qsTr
(
"
Edit Position
"
),
qgcView
.
showDialogDefaultWidth
,
StandardButton
.
Cancel
)
}
MenuSeparator
{
visible
:
missionItem
.
isSimpleItem
&&
!
_waypointsOnlyMode
}
...
...
src/QGCApplication.cc
View file @
b6edd922
...
...
@@ -83,6 +83,7 @@
#include "QGCCameraManager.h"
#include "CameraCalc.h"
#include "VisualMissionItem.h"
#include "EditPositionDialogController.h"
#ifndef NO_SERIAL_LINK
#include "SerialLink.h"
...
...
@@ -379,6 +380,7 @@ void QGCApplication::_initCommon(void)
qmlRegisterType
<
JoystickConfigController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"JoystickConfigController"
);
qmlRegisterType
<
LogDownloadController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"LogDownloadController"
);
qmlRegisterType
<
SyslinkComponentController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"SyslinkComponentController"
);
qmlRegisterType
<
EditPositionDialogController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"EditPositionDialogController"
);
#ifndef __mobile__
qmlRegisterType
<
ViewWidgetController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"ViewWidgetController"
);
qmlRegisterType
<
CustomCommandWidgetController
>
(
"QGroundControl.Controllers"
,
1
,
0
,
"CustomCommandWidgetController"
);
...
...
src/QGCGeo.cc
View file @
b6edd922
...
...
@@ -7,11 +7,13 @@
*
****************************************************************************/
#include <QDebug>
#include <cmath>
#include <limits>
#include "QGCGeo.h"
#include "UTM.h"
// These defines are private
#define M_DEG_TO_RAD (M_PI / 180.0)
...
...
@@ -81,3 +83,16 @@ void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCo
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
));
}
src/QGCGeo.h
View file @
b6edd922
...
...
@@ -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
);
// 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
src/QmlControls/EditPositionDialog.FactMetaData.json
0 → 100644
View file @
b6edd922
[
{
"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"
}
]
src/QmlControls/EditPositionDialog.qml
0 → 100644
View file @
b6edd922
/****************************************************************************
*
* (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
src/QmlControls/EditPositionDialogController.cc
0 → 100644
View file @
b6edd922
/****************************************************************************
*
* (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
);
}
src/QmlControls/EditPositionDialogController.h
0 → 100644
View file @
b6edd922
/****************************************************************************
*
* (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
;
};
src/QmlControls/QGroundControl.Controls.qmldir
View file @
b6edd922
...
...
@@ -7,6 +7,7 @@ CameraSection 1.0 CameraSection.qml
ClickableColor 1.0 ClickableColor.qml
DropButton 1.0 DropButton.qml
DropPanel 1.0 DropPanel.qml
EditPositionDialog 1.0 EditPositionDialog.qml
ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml
FactSliderPanel 1.0 FactSliderPanel.qml
FileButton 1.0 FileButton.qml
...
...
src/UTM.cpp
0 → 100644
View file @
b6edd922
This diff is collapsed.
Click to expand it.
src/UTM.h
0 → 100644
View file @
b6edd922
// 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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment