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 {
HEADERS += \
src/AnalyzeView/ExifParser.h \
src/AnalyzeView/ULogParser.h \
src/AnalyzeView/LogDownloadController.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/ULogParser.cc \
src/AnalyzeView/LogDownloadController.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 += \
......
......@@ -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>
......
......@@ -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()
......
......@@ -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
}
......
......@@ -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");
......
......@@ -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));
}
......@@ -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
[
{
"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
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
......
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