68 lines
1.6 KiB
C++
Executable File
68 lines
1.6 KiB
C++
Executable File
|
|
|
|
|
|
#include <GeographicLib/UTMUPS.hpp>
|
|
#include <GeographicLib/MGRS.hpp>
|
|
#include <cstring>
|
|
#include <string>
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
if (argc < 3 || argc > 5)
|
|
{
|
|
fprintf(stderr, "Usage: %s <lon_degree> <lat_degree> [<precision>]\n", argv[0]);
|
|
fprintf(stderr, "Usage: %s <lon_rad> <lat_rad> -r [<precision>]\n", argv[0]);
|
|
return -1;
|
|
}
|
|
|
|
bool lonLatInRad = false;
|
|
double lon = atof(argv[1]);
|
|
double lat = atof(argv[2]);
|
|
int prec = 5;
|
|
if (argc >= 4)
|
|
{
|
|
int precArgId = -1;
|
|
if (strcmp(argv[3], "-r") == 0)
|
|
{
|
|
lonLatInRad = true;
|
|
if (argc == 5)
|
|
precArgId = 4;
|
|
}
|
|
else
|
|
precArgId = 3;
|
|
if (precArgId > 0)
|
|
prec = atoi(argv[precArgId]);
|
|
}
|
|
|
|
std::string mgrs;
|
|
|
|
int zone;
|
|
bool northp;
|
|
double x, y;
|
|
try
|
|
{
|
|
const double latDeg = lonLatInRad ? lat * 180 / M_PI : lat;
|
|
const double lonDeg = lonLatInRad ? lon * 180 / M_PI : lon;
|
|
GeographicLib::UTMUPS::Forward(latDeg, lonDeg, zone, northp, x, y);
|
|
GeographicLib::MGRS::Forward(zone, northp, x, y, prec, mgrs);
|
|
}
|
|
catch (...)
|
|
{
|
|
fprintf(stderr, "Error converting %9.6f, %9.6f to MGRS coords\n", lat, lon);
|
|
return -2;
|
|
}
|
|
std::string part1, part2, part3, part4;
|
|
part1 = mgrs.substr(0, 3);
|
|
part2 = mgrs.substr(3, 2);
|
|
if (prec > 0)
|
|
{
|
|
part3 = mgrs.substr(5, prec);
|
|
part4 = mgrs.substr(5 + prec, prec);
|
|
}
|
|
fprintf(stdout, "%13.10f, %13.10f = %s %s %s %s (UTM: %d %.2f, %.2f %c)\n",
|
|
lon, lat,
|
|
part1.c_str(), part2.c_str(), part3.c_str(), part4.c_str(),
|
|
zone, x, y, northp ? 'N' : 'S');
|
|
return 0;
|
|
}
|