#include #include #include #include int main(int argc, char **argv) { if (argc < 3 || argc > 5) { fprintf(stderr, "Usage: %s []\n", argv[0]); fprintf(stderr, "Usage: %s -r []\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; }